【问题标题】:Two views in a UIViewController and a sizer in-between - iPadUIViewController 中有两个视图,中间有一个 sizer - iPad
【发布时间】:2019-06-07 12:13:30
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift ipad uiviewcontroller


    【解决方案1】:

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

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

    为此,

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

      barDragRecognizer.setTranslation(CGPoint(x: barAlignToSuperviewCenterConstraint.constant, y: 0) in: bar.superview)
      
    • 在识别器的回调中,当平移识别器处于.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)))
    }
    

    【讨论】:

    • 太棒了!我添加以编程方式构建视图,而不是使用 nib 文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多