首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用2个UIPanGestures处理2个视图。

用2个UIPanGestures处理2个视图。
EN

Stack Overflow用户
提问于 2018-07-27 16:59:14
回答 2查看 22关注 0票数 1

我有一个视图(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“手动”?

EN

回答 2

Stack Overflow用户

发布于 2018-07-27 17:12:23

可能使用gestureRecognized委托,如下所示:

代码语言:javascript
复制
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//Maybe extra validation
if ([touch.view isDescendantOfView:yourSubView]) {
    return NO;
}
    return YES;
}

或者yo可以处理firstResponder方法,验证后的viewA.firstResponder。

票数 0
EN

Stack Overflow用户

发布于 2018-07-27 17:53:14

您可以尝试将aViewbView作为panApanB的委托,而不是让panApanB成为它们共同视图控制器的委托吗?这样,手势识别器委托方法将由pan手势触发,并将按照您的预期工作。

下面是一些对我有用的示例代码:(在本例中,手势识别器和视图的所有连接都是由故事板完成的,但是ViewControllerpanApanB的委托。)panAActive是你想要的“开关”。如果您翻转它,panApanB将交替工作。

代码语言:javascript
复制
@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");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51562475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档