【问题标题】:Passing touch events to iOS status bar将触摸事件传递给 iOS 状态栏
【发布时间】:2011-03-27 10:22:04
【问题描述】:

我有一个 UIWindow,其 windowLevel 设置为 UIWindowLevelStatusBar+1。此窗口有一个半透明的视图,可以阻止状态栏。我有时需要将触摸事件从视图传递到状态栏。有什么想法吗?

【问题讨论】:

  • 我想知道 VoiceOver 将如何告诉时间、信号和电池电量。我认识一个 VoiceOver 用户,他不能使用大约 70% 的应用程序,因为它们是由不关心用户的懒惰开发人员编写的。 ://
  • 这没问题,视图是半透明的,大部分时间应该接收事件。这就是问题所在。
  • @ssteinberg 当 VoiceOver 被启用时,双击就是轻击,单击选择某物并说出它。如果您的视图与状态栏重叠,则不会在其上选择任何项目。
  • 再次,这就是我的问题所在,大多数时候我希望将触摸事件传递到状态栏,好像什么都没有。有时我需要拦截它们。仅隐藏视图不是一种选择。
  • 您的应用可能会因阻止/覆盖状态栏而被拒绝进入 App Store。

标签: iphone cocoa-touch ios


【解决方案1】:

因此,似乎可以使用覆盖 hitTest:withEvent: 的 UIWindow 的自定义子类来手动检测子视图中的触摸,并始终返回 nil。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([event type]==UIEventTypeTouches) {
        UIView *v=[super hitTest:point withEvent:event];
        if (customSubViewthatCoversStatusBarOnly==v) 
            //doLotsOfCoolStuff
    }

    return nil;
}

状态栏识别所有触摸,因此滚动到顶部、返回通话、VoiceOver 等不会中断。我仍然可以拦截状态栏上的点击。

我刚刚破解了这个。我可能会在本周晚些时候将更新上传到 App Store,其中包含更成熟的版本,看看苹果会做多少抱怨。

编辑 - 4 月 7 日:
获得了苹果的认可。完美运行。

【讨论】:

    【解决方案2】:

    您可能会在github 上发现此组件很有帮助。

    否则,Cocoa with Love 的博文也许真的很有用。

    【讨论】:

    • 谢谢。 Cocoa 帖子已经过时,拦截触摸很简单。拦截并传递到状态栏是问题所在。这个 MTStatusBar,看起来很有趣,但它会主动阻止状态栏,这看起来不像 Apple 喜欢的东西。
    • 当然。如果您追求 Reeder 应用程序所具有的那种行为,在更新期间它只覆盖状态栏的一小部分,那么这个 MTStatusBar 可能是编码的开始?
    【解决方案3】:

    据我了解,您应该使用- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 来实现该行为。基本上,如果你想要处理触摸事件,你要么返回 self,要么返回 [super hitTest:point withEvent:event] 让状态栏处理触摸事件。

    查看UIView Class Reference 了解更多信息。

    编辑:正如乔纳森所说,Apple 可能不会批准这一点。

    【讨论】:

    • 不,我很确定我昨天尝试过,返回 [super hitTest:point withEvent:event] 并没有这样做。
    猜你喜欢
    • 2019-08-09
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多