【问题标题】:objective-c iPhone top level UIView blocking touch input in iOS 9Objective-c iPhone顶级UIView在iOS 9中阻止触摸输入
【发布时间】:2017-01-10 00:12:57
【问题描述】:

我需要一个始终位于顶部的视图(用于抖动应用程序)。在大多数情况下它工作得很好,我展示的每个视图控制器都显示在这个视图的层下。

topLevelWindow = [[UIApplication sharedApplication] keyWindow];
if(nil == topLevelWindow)
topLevelWindow = [[[UIApplication sharedApplication] windows] lastObject];

topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, topLevelWindow.bounds.size.width, topLevelWindow.bounds.size.height)];
topView.backgroundColor = [UIColor blackColor];
topView.alpha = 0.5f;
topView.layer.zPosition = MAXFLOAT;
topView.userInteractionEnabled = false;
[topLevelWindow addSubview:topView];

但是,当我展示邮件视图控制器时:

MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
[self presentModalViewController:controller animated:YES];

电子邮件输入表单完全按照预期显示,在 topView 层下。然而,与我展示的其他视图控制器不同(并且我展示了几个层),邮件输入视图不响应触摸。因此,用户无法发送电子邮件,甚至无法关闭电子邮件视图控制器。用户除了杀死应用程序之外别无选择。就像 topView 正在拦截所有的触摸输入一样。

对正在发生的事情有任何想法吗?顺便说一句,这在 iOS 7 中运行良好,但在 iOS 9 中不起作用。

任何想法或建议将不胜感激!

【问题讨论】:

    标签: ios objective-c cocoa-touch uiview intercept


    【解决方案1】:

    尝试继承 UIView 以用作您的 topView 并覆盖此方法:

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
        return NO;
    }
    

    这将使它通过所有用户交互。

    编辑:

    再想一想,我不确定我的建议是否会对您有所帮助,因为您只是在操纵图层的 zPosition。这实际上只是将视图放在顶部视觉上,它不会更改视图在超级视图的子视图中的索引。这可能会使事情变得有点棘手,因为水龙头是由具有最高索引的视图注册的,而不管它们层的 zPosition。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多