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)))
}
我正在尝试让 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)))
}