MST

星途 面试题库

面试题:Objective-C 下复杂手势识别场景中的冲突处理

在一个包含UITapGestureRecognizer、UIPanGestureRecognizer和UIPinchGestureRecognizer的iOS视图中,可能会出现手势识别冲突。请说明如何通过Objective-C代码来处理这些冲突,以确保各个手势能够按照预期工作。
30.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 实现UIGestureRecognizerDelegate协议
    • 在视图控制器的头文件(.h)中声明遵循UIGestureRecognizerDelegate协议:
    @interface ViewController : UIViewController <UIGestureRecognizerDelegate>
    
    • 在视图控制器的实现文件(.m)中实现相关代理方法。
  2. 处理手势识别冲突的代理方法
    • gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:方法
      • 这个方法用于判断两个手势是否可以同时识别。例如,如果希望UITapGestureRecognizerUIPanGestureRecognizer可以同时识别,可以这样实现:
      - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
          if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
              return YES;
          }
          return NO;
      }
      
    • gestureRecognizerShouldBegin:方法
      • 这个方法可以用来决定手势是否应该开始识别。例如,对于UIPinchGestureRecognizer,可能希望在满足一定条件下才开始识别,比如当前视图的缩放比例在某个范围内:
      - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
          if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
              // 假设存在一个属性`currentScale`表示当前视图的缩放比例
              if (self.currentScale < 2.0 && self.currentScale > 0.5) {
                  return YES;
              }
              return NO;
          }
          return YES;
      }
      
  3. 设置手势识别器的代理
    • 在创建手势识别器后,设置其代理为视图控制器:
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
    tapGesture.delegate = self;
    [self.view addGestureRecognizer:tapGesture];
    
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
    panGesture.delegate = self;
    [self.view addGestureRecognizer:panGesture];
    
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];
    pinchGesture.delegate = self;
    [self.view addGestureRecognizer:pinchGesture];
    

通过上述步骤,利用UIGestureRecognizerDelegate协议的相关方法,可以有效处理UITapGestureRecognizerUIPanGestureRecognizerUIPinchGestureRecognizer之间的手势识别冲突,使各个手势按照预期工作。