在 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 *)touchself.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 声明它使用协议 UIGestureRecognizerDelegatein actionSheetView.h(或任何您的头文件) Adam 我将 添加到头文件中,这就是我得到的消息。 1) 确保在你的类中为 self.actionSheetView 分配了正确的类型(现在你必须有@property ... UIView *actionSheetView) - 确保它是@property ... YourSubClass *actionSheetView)或2)像这样投射它:tapGesture.delegate = (YourSubClass*)self.actionSheetView 我投了它,错误消失了。但这不起作用。我的主视图 self.view 不可点击。

以上是关于在 CustomView 中为视图而不是子视图点击手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Autolayout 将 CustomView 适配到 SuperView

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图

为什么UITapGestureRecognizer不能在keyWindow(全屏)的子视图中工作?

UIGesture 返回 UIImageView 而不是自定义视图

iOS 8:UITableViewCell.contentView 不会调整其中的子视图大小

点击单元格后不同的 UITableViewCell 子视图布局