通过 UIViewController 传递触摸
Posted
技术标签:
【中文标题】通过 UIViewController 传递触摸【英文标题】:Pass touches through a UIViewController 【发布时间】:2016-01-07 16:19:03 【问题描述】:我有一个视图控制器,我覆盖在另一个视图控制器之上。我只需要顶视图控制器,这样我就可以覆盖一个临时弹出通知,并且拥有一个覆盖的 VC 允许我在 UITableViewController 上呈现它,因为你不能直接将子视图添加到 tableview 控制器。
是否可以与底部视图控制器交互,而它有另一个视图控制器覆盖它。如果这是一个视图或窗口,您可以通过将用户交互设置为 false 或使用 hitTest 来实现,但这些方法都不适用于视图控制器。
【问题讨论】:
“覆盖”到底是什么意思?这些视图控制器之间是什么关系? VC1 调用 presentViewController(VC2)。 VC2 有 modalPresentationStyle = .OverCurrentContext, backgroundColour.clear。我想在 VC1 而不是 VC2 上注册。 vc2.view 是 vc1.view 的子视图吗? 没有。这不是子视图。 你的问题解决了吗? 【参考方案1】:像这样创建子类
class TouchDelegatingView: UIView
weak var touchDelegate: UIView? = nil
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
guard let view = super.hitTest(point, with: event) else
return nil
guard view === self, let point = touchDelegate?.convert(point, from: self) else
return view
return touchDelegate?.hitTest(point, with: event)
然后在你的 ViewController 中设置视图类(你可以直接在 xib 中,或者在 loadView() 方法中)
并添加
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
if let delegatingView = view as? TouchDelegatingView
delegatingView.touchDelegate = presentingViewController?.view
您也可以使用此机制将触摸委托给任何其他视图,不管它是否
【讨论】:
我想你想要super.viewDidLoad()
但是如果我们不能设置UIViewController
的UIView
怎么办。比如UITabBarController
,我们没有办法替换UIView
。
我说得对吗,您想将UITabBarController
显示为另一个视图控制器上方的弹出窗口,并通过它传递到底层视图控制器?几乎无法为它绘制一个案例,但如果您仍然需要这样做,您可以尝试覆盖您希望触摸通过的每个选项卡。另一种方法是覆盖loadView
并装饰UITabBarController
的视图。请提供更多背景信息,以便我可以正确解决您的问题。以上是关于通过 UIViewController 传递触摸的主要内容,如果未能解决你的问题,请参考以下文章
如何将触摸事件传递给 parentViewController?
Objective-c:将值从 AppDelegate 传递给 UIViewController
如何忽略触摸事件并将它们传递给另一个子视图的 UIControl 对象?