我有一个视图(A),它的UIPanGestureRecognizer (PAN_A)和第二个视图(B),它是A的子视图,它也有自己的UIPanGestureRecognizer (PAN_B)。视图A是PAN_A的委托,B是PAN_B的委托
我很难让他们正常工作。
我希望当gestureRecognizerShouldBegin of B自动返回false时,事件被传递到A,并被PAN_A识别.但这种情况根本没有发生。
当我需要在B上启用手势时,我也尝试过任何shouldRecognizeSimultaneouslyWith禁用它的组合。但同样地,这是行不通的。这个手势似乎总是被PAN_B困住
--根据某些条件,我需要由PAN_A识别和处理该手势,或者由PAN_B识别和处理--我希望有一种开关,在不需要时,只需关闭对视图B的识别。
如果您需要在同一层次结构上以不同的方式处理触摸,那么哪种方法是最好的呢?我是否应该在根级处理所有手势(在我的示例中是A视图的PAN_A ),并在需要时将手势信息传递到B“手动”?
发布于 2018-07-27 17:12:23
可能使用gestureRecognized委托,如下所示:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//Maybe extra validation
if ([touch.view isDescendantOfView:yourSubView]) {
return NO;
}
return YES;
}或者yo可以处理firstResponder方法,验证后的viewA.firstResponder。
发布于 2018-07-27 17:53:14
您可以尝试将aView和bView作为panA和panB的委托,而不是让panA和panB成为它们共同视图控制器的委托吗?这样,手势识别器委托方法将由pan手势触发,并将按照您的预期工作。
下面是一些对我有用的示例代码:(在本例中,手势识别器和视图的所有连接都是由故事板完成的,但是ViewController是panA和panB的委托。)panAActive是你想要的“开关”。如果您翻转它,panA和panB将交替工作。
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *aView;
@property (weak, nonatomic) IBOutlet UIView *bView;
@property (weak, nonatomic) IBOutlet UIPanGestureRecognizer *panA;
@property (weak, nonatomic) IBOutlet UIPanGestureRecognizer *panB;
@property BOOL panAActive;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.panAActive = NO;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.panA) {
return self.panAActive;
}
if (gestureRecognizer == self.panB) {
return !self.panAActive;
}
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ((gestureRecognizer == self.panA && otherGestureRecognizer == self.panB) ||
(gestureRecognizer == self.panB && otherGestureRecognizer == self.panA)){
return YES;
}
return NO;
}
- (IBAction)aPanned:(id)sender {
NSLog(@"aPanned");
}
- (IBAction)bPanned:(id)sender {
NSLog(@"bPanned");
}https://stackoverflow.com/questions/51562475
复制相似问题