在某些情况下,如何使用 hitTest:withEvent: 将触摸从导航栏发送到底层视图?

Posted

技术标签:

【中文标题】在某些情况下,如何使用 hitTest:withEvent: 将触摸从导航栏发送到底层视图?【英文标题】:How do I use hitTest:withEvent: to send touches from my nav bar to the underlying view under certain circumstances? 【发布时间】:2013-08-07 00:05:22 【问题描述】:

长话短说,如果我的 UINavigationBar 的 alpha 设置为 0,我希望所有触摸都转到底层视图(从带有导航栏的视图控制器的角度来看,它只是 self.view) .如果是1.0,我希望它保留它们。

我将 UINavigationBar 子类化,并试图覆盖 hitTest:withEvent:,但我真的很困惑我在做什么,搜索也没有什么帮助。

如何告诉它,“如果 alpha 为 0,则发送触摸到 self.view,否则保持导航栏”?

【问题讨论】:

【参考方案1】:

您需要将视图的引用发送到导航栏中,将其设置为名为 behindView 的属性或其他内容。

if(self.alpha == 0.0f)

    return behindView;

return [super hitTest:point withEvent:event];

另一种方法是像这样覆盖pointInside:withEvent:

if(self.alpha == 0.0f)

    return NO;

return [super pointInside:point withEvent:event];

【讨论】:

当导航栏的 alpha 设置为 0 时,如果我点击导航栏,它不会被调用。 这实际上是有道理的。你确定你的视图框架已经在不可见的导航栏后面展开了吗?导航控制器会将视图控制器的 view-top 设置在导航栏下方,因此您可能需要将所有内容放入具有 frame.origin.y-navBarHeight 的内部视图中,并且该视图会引起您的注意。跨度> 【参考方案2】:

Swift 4 版本。

代码:

class NavigationBar: UINavigationBar 

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool 
        if self.alpha == 0 
            return false
        
        return super.point(inside: point, with: event)
    


【讨论】:

以上是关于在某些情况下,如何使用 hitTest:withEvent: 将触摸从导航栏发送到底层视图?的主要内容,如果未能解决你的问题,请参考以下文章

在某些参数类型是用户定义的情况下,如何使用 JDBC/Spring 调用 Oracle 存储过程?

如何仅在某些情况下禁用 Django 的 csrf 保护?

Recyclerview - OnCreateViewholder - 在某些情况下如何返回“null”

如何在不编写自己的程序的情况下将某些文件上传到 Azure Blob 存储?

在某些情况下使用双引号解析 CSV

如何在某些情况下在两个字段值之间切换?