在某些情况下,如何使用 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 存储过程?
Recyclerview - OnCreateViewholder - 在某些情况下如何返回“null”