面试题答案
一键面试- 实现
UIGestureRecognizerDelegate
协议:- 在视图控制器的头文件(
.h
)中声明遵循UIGestureRecognizerDelegate
协议:
@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
- 在视图控制器的实现文件(
.m
)中实现相关代理方法。
- 在视图控制器的头文件(
- 处理手势识别冲突的代理方法:
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
方法:- 这个方法用于判断两个手势是否可以同时识别。例如,如果希望
UITapGestureRecognizer
和UIPanGestureRecognizer
可以同时识别,可以这样实现:
- (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; }
- 这个方法可以用来决定手势是否应该开始识别。例如,对于
- 设置手势识别器的代理:
- 在创建手势识别器后,设置其代理为视图控制器:
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
协议的相关方法,可以有效处理UITapGestureRecognizer
、UIPanGestureRecognizer
和UIPinchGestureRecognizer
之间的手势识别冲突,使各个手势按照预期工作。