代码之家  ›  专栏  ›  技术社区  ›  ap123

uiviewcontroller中的两个视图和ipad之间的sizer

  •  -2
  • ap123  · 技术社区  · 5 年前

    我想要一个有两个 UIView s对ipad屏幕。左视图将具有TableView,而右视图将是所选TableView单元格的内容。类似于iPad邮件应用程序(使用 UISplitViewController )但是在纵向上,左视图(桌面视图)应该留在那里,而不是离开。( ui拆分视图控制器 使它消失)。

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

    Notability Screenshot

    1 回复  |  直到 5 年前
        1
  •  1
  •   Eugene Dudnyk    5 年前

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

    你可以对齐 酒吧 水平到白色 superview.center.x (我们来命名这个约束 barAlignToSuperviewCenterConstraint ,您可以通过将约束的常量更改为与中心的偏移量来轻松移动它。

    这样做,

    • 贴上 UIPanGestureRecognizer 到条的超视图,它也是面板的超视图(让我们命名它 barDragRecognizer )
    • 在识别器的回调中,当PAN识别器处于状态时 .began ,将其转换设置为当前值 barAlignToSuperviewCenterConstraint.constant :

      barDragRecognizer.setTranslation(CGPoint(x: barAlignToSuperviewCenterConstraint.constant, y: 0) in: bar.superview)
      
    • 在识别器的回调中,当PAN识别器处于以下状态之一时 .changed , .ended , .cancelled ,将约束常量的值设置为识别器的转换值:

      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)))
    }