如何在UIView及其子视图中禁用Tap手势(所有交互)?

时间:2014-09-11 15:45:51

标签: ios objective-c uiview tap interaction

我有2个类cellView(基本上是一个带有tap的单元)和Board视图有64个cellViews。 从我的VC我想在某些事件上禁用/启用它们上的所有交互。 这是我的代码。

if(currentGame.isYourTurn==NO){
    [divBoardView  setUserInteractionEnabled:NO];
    for(UIView*currentView in  [divBoardView  subviews]){
        [currentView  setUserInteractionEnabled:NO];
    }
} else ..

在单元格视图中只是用

查看
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
   initWithTarget:self action:@selector(cellTapped)];
[self addGestureRecognizer:tapRecognizer];

我想在不添加和删除tapGestureRecognisers的情况下禁用和启用交互。

2 个答案:

答案 0 :(得分:2)

无需迭代[divBoardView subviews]并设置每个userInteractionEnabled属性。只需在父视图上设置此属性,在这种情况下divBoardView将禁用所有子视图的交互。

话虽如此,UITapGestureRecognizer不应附加到divBoardView或您计划禁用的任何视图,因为如果将userInteractionEnabled设置为{NO,它就不会触发{1}}。

根据您的设计,将手势识别器附加到viewController的view属性可能更好:

// Where self is the view controller
[self.view addGestureRecognizer:tapRecognizer];

基于某种状态处理交互:

@interface YourViewController ()

@property (assign, nonatomic) BOOL isBoardActive;

@end



@implementation 

- (void)handlerTap:(UITapGestureRecognizer *)tap {

    UIView *viewControllerView = tap.view.
    CGPoint location           = [tap locationInView:viewControllerView];

    if (_isBoardActive && CGRectContainsPoint(_boardView.frame, location)) {
        // Process tap on board   
    } else {
        // Process tap elsewhere
    }
}

@end

这只是一个解决方案。很难推荐理想的解决方案,因为提供的问题信息非常少。有很多方法可以完成同样的事情,最好的替代方案将取决于您当前的应用程序结构,设计等。

答案 1 :(得分:1)

userInteractionEnabled的属性适用于您在其中设置属性的视图中的所有子视图。

与点击手势识别器相同。如果您添加识别器并设置userInteractionEnabled = NO,则识别器将永远不会被解雇。

所以,你应该可以......

divBoardView.userInteractionEnabled = NO;

这将以递归方式通过所有子视图(不是真的,但它会产生相同的效果)并禁用任何识别器。

则...

divBoardView.userInteractionEnabled = YES;

将再次启用所有内容。