【问题标题】:How can I detect interaction anywhere outside of a UIControl, non-invasively?如何以非侵入方式检测 UIControl 之外的任何地方的交互?
【发布时间】:2013-06-25 05:53:21
【问题描述】:

我有一个自定义 UIControl,点击它时会进入确认状态,再次点击时会执行所需的操作。

如果用户在屏幕上的其他任何地方进行交互,我希望此控件返回其初始状态。有没有一种非侵入性的方法来实现这一点?

澄清:如果我不能将代码包含在此控件中,我会认为它具有侵入性。我想为另一个应用程序的开发人员提供此代码,他们可以使用这些代码将控件添加到他们的应用程序中,而不必在应用程序的其他任何地方乱用代码。如果这不可能,那很好,但问题是如何以非侵入性方式完成。

【问题讨论】:

    标签: ios uicontrol


    【解决方案1】:

    您可以考虑将UITapGestureRecognizer 放置在所有内容之上,仅当触摸发生在UIControl 边界之外时才会触发关闭。

    类似

    - (void)presentConfirm {
       // whatever 
    
        self.dismissRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss:)];
        self.dismissRecognizer = self;
        [self.view addGestureRecognizer:self.dismissRecognizer];
    }
    
    - (void)dismiss:(UIGestureRecognizer *)gestureRecognizer {
        // do stuff
    
        [self.view removeGestureRecognizer:self.dismissRecognizer];
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        CGPoint touchPoint = [touch locationInView:self.view];
        return !CGRectContainsPoint(self.control.frame, touch));
    }
    

    基本上,只有当触摸发生在UIControl 框架之外时,您才会触发dismiss 方法(我假设您的控件被引用为self.control)。

    您还需要一个 dismissRecognizer 属性声明为

    @property (nonatomic, strong) UITapGestureRecognizer *dismissRecognizer;
    

    为了防止出现警告,您还应该声明您的控制器符合UIGestureRecognizerDelegate 协议。

    【讨论】:

      【解决方案2】:

      您可以尝试使用 touchesBegan 方法来完成此操作:

      - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
          if(myUIControl.isInConfirmState){ // check if your control is in confirmed state
      
          UITouch* touch = [touches anyObject];
          CGPoint touchLocation = [touch locationInView:self.view];
      
              if(!CGRectContainsPoint(myUIControl.frame, touchLocation)){
          // set myUIControl to it's initial state
              }
          }
      }
      

      希望这会有所帮助。

      【讨论】:

      • 这个方法需要放在一个覆盖整个窗口的视图上,这将是侵入性的。
      • 好吧,画一个按钮比每次触摸都检查一个 if 表达式要花费一千倍。
      • 侵入性,因为我想将我的代码提供给其他人以集成到他们的项目中,并且我不希望他们在可能的情况下弄乱他们的其他代码。
      猜你喜欢
      • 2023-04-03
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2020-12-04
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多