如何将 iPhone X 的视图滑出可见区域?
Posted
技术标签:
【中文标题】如何将 iPhone X 的视图滑出可见区域?【英文标题】:How to slide view out of visible area for iPhone X? 【发布时间】:2018-03-02 14:23:20 【问题描述】:当导航栏隐藏时,我希望视图在可见区域之外向上滑动。
视图附加到 safeAreaLayoutGuide:
topConstraint = myView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor)
要将其滑出,更改约束:
topConstraint.constant = hidden ? -(myView.frame.height) : 0
这适用于 iPhone 7,但不适用于 iPhone X。当导航隐藏时,view.topAnchor
和 view.safeAreaLayoutGuide.topAnchor
之间存在间隙。
最简单的方法是将视图附加到导航栏的底部锚点,但尝试这样做时应用会崩溃:
topConstraint = myView.topAnchor.constraint(equalTo: navigationController!.navigationBar.bottomAnchor)
那么我怎样才能将myView
滑出可见区域呢?
【问题讨论】:
【参考方案1】:解决方案是改变整个约束,而不仅仅是常量:
// Deactivate current constraint
myViewTopConstraint.isActive = false
if #available(ios 11.0, *)
// Set new constraint
myViewTopConstraint = hidden
? myView.bottomAnchor.constraint(equalTo: view.topAnchor)
: myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
else
// Set new constraint
myViewTopConstraint = hidden
? myView.bottomAnchor.constraint(equalTo: view.topAnchor)
: myView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor)
// Activate new constraint
myViewTopConstraint.isActive = true
这种布局变化也是动画的。
【讨论】:
非常好....!您可以将变量用于顶部/底部锚点并在条件流中更改它的值。并将其设置在最后/条件流之后 @Krunal 这实际上是你的答案,感谢你:)【参考方案2】:以下行替换
topConstraint = myView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor)
与
if !hidden
if #available(iOS 11.0, *)
topConstraint = myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
else
topConstraint = myView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor)
else
topConstraint = myView.topAnchor.constraint(equalTo: view.topAnchor)
【讨论】:
如果我这样做,应该在导航栏下方的视图将被导航栏覆盖。 哦...等一下。 这种约束变化是否可以动画化? 请注意 iPhone X 上的 safeArea 比可视区域小,所以如果您只是将视图放在安全区域的顶部,它仍然是可见的。另一方面,widnow 代表所有可见区域(或窗口的根控制器视图),因此它可能对您更有用。以上是关于如何将 iPhone X 的视图滑出可见区域?的主要内容,如果未能解决你的问题,请参考以下文章
滑入/滑出子视图控制器在 Swift 中的父视图控制器上部分可见