【问题标题】:Pass touches through a UIViewController通过 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 的子视图吗?
  • 没有。这不是子视图。
  • 你的问题解决了吗?

标签: ios iphone uiviewcontroller touch


【解决方案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()
  • 但是如果我们不能设置UIViewControllerUIView 怎么办。比如UITabBarController,我们没有办法替换UIView
  • 我说得对吗,您想将UITabBarController 显示为另一个视图控制器上方的弹出窗口,并通过它传递到底层视图控制器?几乎无法为它绘制一个案例,但如果您仍然需要这样做,您可以尝试覆盖您希望触摸通过的每个选项卡。另一种方法是覆盖loadView 并装饰UITabBarController 的视图。请提供更多背景信息,以便我可以正确解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2015-10-04
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2013-07-07
相关资源
最近更新 更多