【问题标题】:iphone - determine if touch occurred in subview of a uiviewiphone - 确定触摸是否发生在 uiview 的子视图中
【发布时间】:2010-09-09 19:39:09
【问题描述】:

在 UIView 的子类中我有这个:

    -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
       if(touch occurred in a subview){
         return YES;
       }

       return NO;
    }

我可以在 if 语句中添加什么?我想检测子视图中是否发生了触摸,无论它是否位于 UIView 的框架内。

【问题讨论】:

    标签: iphone events uiview touch subview


    【解决方案1】:

    试试看:

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        return CGRectContainsPoint(subview.frame, point);
    }
    

    如果您想在触摸位于您实现此方法的视图内时返回 YES,请使用以下代码:(如果您想将手势识别器添加到位于容器边界之外的子视图中)

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        if ([super pointInside:point withEvent:event])
        {
            return YES;
        }
        else
        {
            return CGRectContainsPoint(subview.frame, point);
        }
    }
    

    【讨论】:

      【解决方案2】:
      -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
         return ([self hitTest:point withEvent:nil] == yourSubclass)
      }
      

      方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 返回包含指定点的视图层次结构(包括其自身)中接收器的最远后代。我在那里所做的是返回最远视图与您的子视图进行比较的结果。如果您的子视图也有子视图,这可能对您不起作用。所以在这种情况下你想做的是:

      -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
         return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass])
      }
      

      【讨论】:

      • 但是这个方法是UIView的子类,所以会崩溃:
      • 对不起,我想我需要添加一个答案来解释 - 见下文
      【解决方案3】:

      试试这个:

      -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
      {
         NSSet *touches = [event allTouches];
         UITouch *touch = [touches anyObject];
         if([touch.view isKindOfClass:[self class]]) {
         return YES;
         }
         return NO;
      }
      

      【讨论】:

        【解决方案4】:

        Swift 版本:

          var yourSubview: UIView!
        
          override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
            return subviewAtPoint(point) == yourSubview 
          }
        
          private func subviewAtPoint(point: CGPoint) -> UIView? {
            for subview in subviews {
              let view = subview.hitTest(point, withEvent: nil)
              if view != nil {
                return view
              }
            }
            return nil
          }
        

        【讨论】:

          猜你喜欢
          • 2013-04-05
          • 1970-01-01
          • 2014-06-21
          • 1970-01-01
          • 2011-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多