我有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的情况下禁用和启用交互。
答案 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;
将再次启用所有内容。