在我的添加联系人页面中,我有一个视图和一个滚动视图,还有一个视图。在最后一个视图中,我有文本框等。我已经给出了“touchesBegan”方法,但它只在底部的视图中调用。如何将该方法指向另一个视图,即顶部的视图?
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.AddView endEditing:YES];
}
在我的添加联系人页面中,我有一个视图和一个滚动视图,还有一个视图。在最后一个视图中,我有文本框等。我已经给出了“touchesBegan”方法,但它只在底部的视图中调用。如何将该方法指向另一个视图,即顶部的视图?
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.AddView endEditing:YES];
}
一种方法是您可以这样做:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch= [touches anyObject];
if ([touch view] == image1)
{
//Action
}
}
请注意:当您使用 UIScrollView 时,您可能无法获取 UIScrollView 的触摸方法。在这种情况下,您可能必须使用 UIGesture。
这是 Swift 中的答案:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
if(touch.view == myView){
// Code
}
}
首先检查UserInteractionEnabled
整个控件的属性并设置为YES
在检查了您的底部视图框架之后,它没有在该视图上结束
在你可以用下面的条件检查它并用特定的控件触摸事件做一些事情之后..
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
[touch locationInView:viewBoard];
if([touch.view isKindOfClass:[UIImageView class]])
{
UIImageView *tempImage=(UIImageView *) touch.view;
if (tempImage.tag == yourImageTag)
{
/// write your code here
}
}
}
试试这个 :
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch1 = [touches anyObject];
CGPoint touchLocation = [touch1 locationInView:self.finalScore];
if(CGRectContainsPoint(YourView.frame, touchLocation));
{
//Do stuff.
}
}
尝试
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event touchesForView:vTouch] anyObject];
if(!touch)
return;
CGPoint pointNow = [touch locationInView:otherView];
{
// code here
}
}
如果您的视图是父视图,则可以使用以下代码:
if let touch = touches.first {
let position = touch.location(in: yourView)
let pnt: CGPoint = CGPoint(x: position.x, y: position.y)
if (yourView.bounds.contains(pnt)) {
//You can use: yourView.frame.contains(pnt)
//OK.
}
}
参考关于 UIResponder 的 Apple 文档,所有 UIView 对象(包括 UIWindow)、UIApplication 对象、UIViewController 对象都是 UIResponder 的实例。要处理特定类型的事件,响应者必须覆盖相应的方法。
在我们的例子touches
中是我们的事件类型。所以我们的响应者应该实现以下方法。touchesBegan( :with:)、touchesMoved( :with:)、touchesEnded( :with:)和touchesCancelled( :with:)
由于我们只想知道用户何时触摸了特定视图,因此我们只需要实现touchesBegan(_:with:)
. 由于我们没有覆盖我们必须调用的其他方法super.touchesBegan(touches, with: event)
。如果我们覆盖所有其他方法,我们就不需要调用super
.
看touchesBegan(_:with:)
参数touches
是一组 UITouch 实例。每个实例代表事件开始阶段的触摸,由参数 表示event
。
对于视图中的触摸,默认情况下该集合仅包含一次触摸。因此touches.first
是集合中唯一的 UITouch 实例。然后我们访问属性view
,它表示发生触摸的视图或窗口。最后,我们将已触摸的视图与您想要的视图进行比较。
应该注意的是,如果您希望接收多次触摸 - 您必须将视图的isMultipleTouchEnabled
属性设置为true
。然后这组touches
将有多个 UITouch 实例,您将不得不相应地处理它。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let touch = touches.first, touch.view == myView {
// Do something
}
}