【发布时间】:2021-04-30 06:05:00
【问题描述】:
我在这里UIView Position After Device Orientation发布了一个类似的问题
我正在设计一个具有单个 ViewController 和主视图子视图的应用程序。这个子视图是一张地图。最初,它的中心等于主视图的中心(并且等于设备的中心)。这个子视图的位置可以通过手势改变,所以它没有任何布局约束。当设备的方向改变时,默认行为是子视图的中心移动,使其与设备左上角的水平和垂直距离保持不变。我试图改变这一点,以便保持不变的距离是子视图中心和主视图中心之间的水平和垂直距离(在定向之后,它仍然等于设备的中心)。我尝试了以下方法:
第一种方法(它适用于 iphone,但不适用于 ipad,因为它具有两个方向的垂直和水平类的常规特征集合。)
var distanceOfCenters: CGPoint?
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
{
super.willTransition(to: newCollection, with: coordinator)
distanceOfCenters = CGPoint(x: view.subviews[0].center.x-view.center.x, y: view.subviews[0].center.y-view.center.y)
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
{
super.traitCollectionDidChange(previousTraitCollection)
if let x = distanceOfCenters?.x, let y = distanceOfCenters?.y
{
view.subviews[0].center = CGPoint(x: view.center.x+x, y: view.center.y+y)
}
}
第二个方法(它适用于iphone和ipad,但在设备立即从左侧横向旋转到右侧横向的情况下失败,即没有先从纵向经过。它也不能顺利运行)
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
{
super.viewWillTransition(to: size, with: coordinator)
view.subviews[0].center.x += view.center.y - view.center.x
view.subviews[0].center.y += view.center.x - view.center.y
}
任何想法如何实现这一点?我觉得很奇怪,在应用程序中添加这么简单的功能是如此困难。
这里有一些截图。黑点是主视图的中心。当设备旋转到横向时,它应该像屏幕截图 3 中那样,其中子视图中心和主视图中心之间的距离在旋转到横向后保持不变。默认就像截图 2 一样,子视图中心和主视图左上角之间的距离在旋转到横向后保持不变。
【问题讨论】:
-
您不使用自动布局/约束是否有原因?大小/特征更改无需计算或代码。
-
@DonMag 我尝试了以下方法,但无法正常工作: let margins = view.layoutMarginsGuide view.subviews[0].centerYAnchor.constraint(equalTo: margins.centerYAnchor).isActive = true view .subviews[0].leadingAnchor.constraint(equalTo: margins.leadingAnchor).isActive = true
-
此外,我不确定将约束置于用户使用手势移动的子视图是否正确。
-
有点混乱... 设备处于纵向,并以 100x100 居中视图开始。用户将视图拖到右下角。用户旋转设备。视图应该在哪里?在视图底部下方(即屏幕外)?
-
还有...你是如何移动视图的?使用约束并更新其
.constant值以移动它们并保持自动布局的所有优点并不少见。
标签: ios swift uiview uiviewcontroller autolayout