这是我尝试使用的第三种创建界面的方法,该界面可以平滑地模仿您在本机iOS相机界面中看到的行为。如果您在iOS相机界面中重新定位设备,您会注意到界面大部分保持静止,但具有“向上”方向的对象会旋转到正确的方向。
尚未解决的问题:
对需要旋转的各个元素使用转换。这样可行,但元素不会随着您在原生iOS应用中看到的平滑动画而转动,并且会导致一些恼人的问题。具体来说,我的界面的一部分允许用户在不离开此界面的情况下进行共享,但是当共享视图出现时,它来自错误的位置,然后被轮换,并最终偏离中心。有关如何执行此操作的详细信息,请参阅有关此主题的问题以及我的回答here。
使用viewWillTransitionToSize来抵消界面的旋转(带动画)。要执行此操作,您将使非旋转视图旋转方向更改的相反方向,然后使需要旋转的图标在非旋转视图的相反方向上旋转。一切都被动画化,以便在重新定位时与superview的默认动画同步。我花了很长时间才开始工作,但我终于解决了这个问题。 Here is a separate thread on that topic。我仍然认为这是实现这一目标的一种混乱方式,并希望看看是否有更好的方法。
使用updateViewConstraints()来实现此行为
我确信这会起作用,而且它可能是最干净的解决方案。但我无法让它发挥作用。这是概念验证的基本思想我首先修补...当应用程序首次加载时,从一个约束开始,将子视图链接到其父级的上边缘,另一个将其沿x轴居中。如果用户将设备向左旋转(横向右方向),则子视图会获得一个新约束,以将其绑定到现在的父边缘,并沿着现在的y轴居中。
我有一个初始布局的故事板。据我所知,我在updateViewConstraints中设置的任何内容都不会做任何事情。以下是我正在使用的代码的主要部分,或者您可以download the Xcode project I'm using as a POC here。
override func updateViewConstraints() {
//northView.removeConstraints(northView.constraints)
//northView.bounds.size = CGSizeMake(25, 25)
//northView.frame.size = CGSizeMake(25, 25)
switch UIDevice.currentDevice().orientation {
case .LandscapeLeft:
northView.rightAnchor.constraintEqualToAnchor(blueBackground.rightAnchor, constant: 20)
northView.centerYAnchor.constraintEqualToAnchor(blueBackground.centerYAnchor)
case .LandscapeRight:
northView.leftAnchor.constraintEqualToAnchor(blueBackground.leftAnchor, constant: 20)
northView.centerYAnchor.constraintEqualToAnchor(blueBackground.centerYAnchor)
case .PortraitUpsideDown:
northView.bottomAnchor.constraintEqualToAnchor(blueBackground.bottomAnchor, constant: 20)
northView.centerXAnchor.constraintEqualToAnchor(blueBackground.centerXAnchor)
default:
northView.topAnchor.constraintEqualToAnchor(blueBackground.topAnchor, constant: 20)
northView.centerXAnchor.constraintEqualToAnchor(blueBackground.centerXAnchor)
}
super.updateViewConstraints()
}
任何人都知道如何使用此方法进行此工作?