UIViewController 中的两个视图和中间的 sizer - iPad

Two views in a UIViewController and a sizer in-between - iPad

我正在尝试让 viewController 有两个 UIView 并排用于 iPad 屏幕。左视图将有一个表格视图,而右视图将是所选表格视图单元格的内容。类似于 iPad 邮件应用程序(使用 UISplitViewController),但在纵向方向上,左视图(tableview)应该留在那里而不是消失(UISplitViewController 让它消失).

我能够通过使用约束来实现它,但除了左右视图之外,我需要在视图之间有一个垂直条,我可以将视图移动到任一侧以查看更多左视图或右视图。当同时查看两个笔记时,此栏类似于 Notability 应用程序中的栏(请参阅随附的屏幕截图)。当我试图让横杆移动时,约束限制了我让它发生。最好的方法是什么?

最好的方法是不使用 UISplitViewController。 相反,只需使用全屏 UIViewController 作为容器,在内部使用 bar 分隔两个容器视图,将 table 视图控制器和详细信息控制器作为子视图控制器添加到其中。

您可以将 bar 水平对齐到白色 superview.center.x(我们将此约束命名为 barAlignToSuperviewCenterConstraint),您可以通过将约束常量更改为距中心的偏移量来轻松移动它.

这样做,

  • UIPanGestureRecognizer 附加到栏的超级视图,它也是面板的超级视图(我们将其命名为 barDragRecognizer)。
  • 在识别器的回调中,当平移识别器处于状态.began时,将其翻译设置为barAlignToSuperviewCenterConstraint.constant的当前值:

    barDragRecognizer.setTranslation(CGPoint(x: barAlignToSuperviewCenterConstraint.constant, y: 0) in: bar.superview)
    
  • 在recognizer的回调中,当pan recognizer处于.changed.ended.cancelled状态之一时,将constraint的常量的值设置为recognizer的翻译值:

    barAlignToSuperviewCenterConstraint.constant = barDragRecognizer.translation(in: bar.superview).x;
    

要让您的识别器仅接收来自栏的触摸,请将您的视图控制器指定为识别器的委托并实现以下内容:

func gestureRecognizer(UIGestureRecognizer recognizer, shouldReceive: UITouch touch) -> Bool {
    let barExtendedBounds = bar.bounds.insetBy(dx: -20, dy: 0)
    return (recognizer == barDragRecognizer && barExtendedBounds.constains(touch.location(in: bar)))
}