在 CustomView 中为视图而不是子视图点击手势识别器
Posted
技术标签:
【中文标题】在 CustomView 中为视图而不是子视图点击手势识别器【英文标题】:Tap Gesture Recognizer for View but not Sub-View in CustomView 【发布时间】:2013-12-03 19:53:38 【问题描述】:我创建了一个 customViewController 来充当 customActionsheet。在这个 customViewController 中,我有一个 UIView 作为主视图(self.view)和一个 IBOutlet UIView,它是自定义操作表(actionSheetView)。我想要做的是让这个自定义操作表像一个常规操作表一样,如果你在黑暗区域点击,在我的例子中是带有黑色背景和 alpha 5.0 的视图。这就是我所拥有的:
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(slideOut)];
tapGesture.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:tapGesture];
问题在于,子视图,即自定义操作表视图,也获得了点击手势,因此点击 actionSheetView 上的任何内容都会获得点击手势。我尝试了一些类似- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
和self.actionSheetView.userInteractionEnabled = NO;
的方法,但两者似乎都不起作用。任何人都知道如何使 self.view 可点击但为 self.actionSheetView 禁用该手势?非常感谢任何提示、指导或帮助。提前致谢。
【问题讨论】:
在实现您提到的选择器之前,您是否实际上将子视图设置为手势识别器的代表? (tapGesture.delegate = your_subview
)
【参考方案1】:
我正在研究同样风格的系统。如果您满足以下条件,我发现它有效:
-
添加一个新的 UIView 作为主 UIView 的子视图。
在您想要自定义 UI 的位置创建另一个 UIView(可以是一个表格,如操作表、选择器等)。确保它显示在第 1 步中的 UIView 上方。
在步骤 1 中的 UIView 上注册 UITapGestureRecognizer。
(可选)添加额外的按钮(例如“取消”和“完成”)并设置您的自定义控制器触发的委托。
主 UIView (self.view) 应该是不透明的,清晰的颜色,alpha 为 1。完整的子视图(参见步骤 1)可以是任何颜色(我使用浅灰色),但调整 alpha 值(0.5 为我)。
很遗憾,我无法发布图片,因为我在网站上还没有足够的代表。
如果您使用 IB 并且无法接收点击,请检查属性检查器(在视图部分下)以确保启用“用户交互”。
【讨论】:
【参考方案2】:你需要设置委托
tapGesture.delegate = self.actionSheetView
//actionSheetView.m
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
return NO;
【讨论】:
我收到警告:Assigning to 'id<UIGestureRecognizerDelegate>' from incompatible type 'UIView'
确保您的自定义 actionSheetView 声明它使用协议 UIGestureRecognizerDelegate
in actionSheetView.h(或任何您的头文件)
Adam 我将 @property ... UIView *actionSheetView
) - 确保它是@property ... YourSubClass *actionSheetView
)或2)像这样投射它:tapGesture.delegate = (YourSubClass*)self.actionSheetView
我投了它,错误消失了。但这不起作用。我的主视图 self.view 不可点击。以上是关于在 CustomView 中为视图而不是子视图点击手势识别器的主要内容,如果未能解决你的问题,请参考以下文章
使用 Autolayout 将 CustomView 适配到 SuperView
如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图
为什么UITapGestureRecognizer不能在keyWindow(全屏)的子视图中工作?
UIGesture 返回 UIImageView 而不是自定义视图