iPhone UIView:是不是可以仅在子视图上启用用户交互?

Posted

技术标签:

【中文标题】iPhone UIView:是不是可以仅在子视图上启用用户交互?【英文标题】:IPhone UIView:Is it possible to enable userinteraction only on subviews?iPhone UIView:是否可以仅在子视图上启用用户交互? 【发布时间】:2010-04-30 11:41:18 【问题描述】:

我创建了一个视图控制器,它显示一个用于将视图滑动到屏幕上的按钮。想法是在屏幕上放置三个这样的视图控制器,从而在屏幕底部提供三个按钮来提供导航。

viewcontrollers 被堆叠起来,所以最上面的一个现在覆盖了其他视图,因此也覆盖了其他按钮。只有顶部视图控制器的按钮在这种情况下工作,我希望它们三个都是可点击的。我尝试在视图上禁用用户交互并仅在按钮上启用它,但看起来超级视图设置覆盖了子视图设置。

有什么想法吗?

【问题讨论】:

我不能 100% 确定您要做什么,但听起来使用 Tab Bar 控制器或 presentModalViewController 方法或两者结合可能会更好?在一个屏幕上工作的多个自定义视图控制器会导致代码混乱,有时还会产生古怪的结果,Apple 有一条特别说明建议不要这样做。 这基本上就像使用tabbarcontrollor来呈现模态视图,只是实际的按钮是(模态)视图控制器的一部分,而不是主屏幕 也许您最好尝试自定义标签栏控制器以查看您想要的样子。不知道它有多可行。 【参考方案1】:

您似乎混淆了视图及其控制器:视图控制器不是堆叠的,它们只是 nib 或 xib 文件的一部分。另一方面,视图可能是视图层次结构的一部分,并且在这个意义上可以相互重叠。 viewController 的功能是管理和协调屏幕上的各种视图。使用视图控制器管理单个按钮效率不高:控制器的目的是促进各种按钮之间的通信(例如,当触摸数字 3 时禁用按钮 1,2 和 4)。 @bpapa 关于 Apple 不鼓励使用多个 viewController 的说法不再正确。 ios 应用程序编程指南中的当前部分Windows, Views, and View Controllers 指出:

视图控制器直接管理单个***视图,并且可以管理该视图的全部或部分子视图。对于简单的用户界面,视图控制器通常管理其视图层次结构中的所有视图。但是,对于由多个不同部分组成的更复杂的接口,视图控制器可以管理视图子集,并依赖一个或多个自定义控制器对象来管理视图层次结构中的其他视图组。

在文档中没有明确说明但在过去几周让我数次困扰的一件事是,如果 viewController 是笔尖的文件所有者。例如,假设您有一个带有两个视图控制器的 nib,gameViewController 和 scoreViewController。 gameView 可能包含几个充当游戏片段的按钮,触摸它们会向 gameViewController 的 -(void)pieceHasBeenTouched:(id)sender 方法发送操作消息。如果 gameViewController 是文件的所有者,这将非常有用。

如果你在 scoreView 中有一个按钮,让它向 scoreViewController 发送消息,比如 saveScore 或类似的东西,现在这似乎是合乎逻辑的。由于我还不太清楚的原因,响应者链不会让你。您需要让得分视图中的“保存”按钮将其操作消息发送到 gameViewController。

我通过在两个控制器之间建立 IBOutlet 绑定来解决这个问题——通知是另一种可能性。

【讨论】:

好久没问这个问题了!也许我没有正确解释它。我很清楚 UIViews 和它们各自的控制器之间的区别。这里的视图控制器不仅负责按钮按下操作,还负责在视图中滑动覆盖层并管理内容(如内容视图的大小颜色等)。所以它基本上是一个自定义的tabbarcontroller。 很抱歉诽谤你的能力,但你的意思是什么?如果一切正常并且问题一开始就没有很好地表述,也许你应该删除它并缩短未回答的列表。【参考方案2】:

将此添加到您的代码到您的装扮UIView:hitTest:withEvent:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
    UIView *hittedView = [super hitTest:point withEvent:event];
    return hittedView == self.button ? hittedView : nil;

我参考了这个:UserInteraction enable for subview only。我已经测试了代码。它有效!

【讨论】:

以上是关于iPhone UIView:是不是可以仅在子视图上启用用户交互?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode iOS UIView 带有点击手势,允许在子视图上输入

iOS - 当文本字段在子视图内时,键盘上的 UIScroll 弹出到文本字段

UIView 在子视图中绘制

nib 中的 UIView 在 iPad 上是 nil,在 iPhone 上不是 nil

仅在 iPhone 上水平添加 UIPanGesture

UIView 仅在第二次调用后显示