如何使'touchesBegan'方法适用于特定视图?

时间:2013-07-04 10:26:09

标签: iphone ios uiview touchesbegan

在我的添加联系人页面中,我有一个视图和一个滚动视图,并再次显示它上面的视图。在最后一个视图中我有文本框等,我已经给出了'touchesBegan'方法,但它仅在底部的视图中调用。如何将该方法指向另一个视图,即顶部的视图?

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 [self.AddView endEditing:YES];
}   

7 个答案:

答案 0 :(得分:27)

这就是你可以做的一种方式:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch= [touches anyObject];
    if ([touch view] == image1)
    {
        //Action
    }

}

请注意:当您使用UIScrollView时,您可能无法获得UIScrollView的触摸方法。在这种情况下,您可能必须使用UIGesture。

答案 1 :(得分:7)

以下是Swift的答案:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch = touches.first as! UITouch
    if(touch.view == myView){
        // Code
    }
}

答案 2 :(得分:6)

首先检查整个控件的属性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
       }
     }
}

答案 3 :(得分:4)

试试这个:

  - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch1 = [touches anyObject];
        CGPoint touchLocation = [touch1 locationInView:self.finalScore];

         if(CGRectContainsPoint(YourView.frame, touchLocation));
         {
            //Do stuff.
         }


  }

答案 4 :(得分:1)

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event touchesForView:vTouch] anyObject];
    if(!touch)
        return;

    CGPoint pointNow = [touch locationInView:otherView];
    {
        // code here
    }
}

答案 5 :(得分:0)

Referring to the Apple documentation on UIResponder,所有UIView对象(包括UIWindow),UIApplication对象,UIViewController对象都是UIResponder的实例。要处理特定类型的事件,响应者必须重写相应的方法。

在我们的情况下,touches是我们的事件类型。因此,我们的响应者应实施以下方法。 touchesBegan(:with :),touchesMoved(:with :),touchesEnded(:with :)和touchesCancelled(:with :)

由于我们只希望知道用户何时触摸了特定视图,因此我们只需要实现touchesBegan(_:with:)。由于我们没有覆盖其他方法,因此必须调用super.touchesBegan(touches, with: event)。如果我们要覆盖其他方法的 ALL ,则不需要调用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
        }
    }

答案 6 :(得分:0)

如果您的视图是父视图,则可以使用以下代码:

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.


        }
    }