我实现了UIPageViewController
的自定义子类,它正在分页另一个自定义UIViewController子类的几个实例。很标准。我不能使用autolayout。
我希望在这两种情况下支持轮换
当允许所有方向时,一切都很完美。由于旋转实际上是窗口上的变换,因此分页控制器中的所有自定义分页控制器都被旋转"很好(他们只是有效地调整到新的界限),我正在利用viewWillTransitionToSize
,我正在通过动画旁边的子视图做一些自定义布局。它很美。
第二个PORTRAIT ONLY案例表现不佳。由于在这种情况下没有旋转支持,我正在收听UIDeviceOrientationDidChangeNotification
通知,我正在手动旋转根视图。
我只是使用UIView.animateWithDuration ...并将仿射变换应用于PagingController的根视图。
UIView.animateWithDuration(0.3, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { () -> Void in
self.view.transform = self.rotationTransform()
self.view.bounds = self.rotationAdjustedBounds()
})
{ finished in
}
变换实际上是一个CGAffineTransformMakeRotation调用。没什么特别的。 self
是分页控制器。
它有效,但由于某种原因,旋转非常难看,它看起来像锚点是上帝知道在哪里,并且一些子视图的自动调整掩码不受尊重。这没有任何意义,因为布局是以一致的方式完成的,证据是在ALL情况下的旋转,一切都完美地适应旋转。
我不能使用一种方法,我会允许全局轮换,然后在除了这个控制器之外的任何地方拯救肖像。该应用程序非常庞大,从非技术原因来看是不可能的,利益相关者根本不允许我这样做。
我的问题是 - 鉴于这些限制,你能否推荐一种更好的方法 - >用手动旋转听通知?
答案 0 :(得分:0)
我解决了这个问题,让其他人知道以供参考是很有意思的。 我不得不改变两件事:
1)在动画方法
中触发布局传递UIView.animateWithDuration(0.3, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { () -> Void in
self.view.transform = self.rotationTransform()
self.view.bounds = self.rotationAdjustedBounds()
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
})
2)修复实际的布局便利方法。
请记住,我正在手动进行布局。这些布局方法都是从viewDidLayoutSubviews调用的,只是构造代码,以便它更具可读性,这里没什么特别的。我犯了一个愚蠢的错误,就是从其他值计算大小和框架等值...其他一些值是.frame
属性。但是在应用变换时帧未定义,因此我将所有这些出现更改为边界。
它现在表现为完全旋转与内置旋转相同。
PS:我认为它适用于内置旋转,因为没有直接应用于视图的变换。因此,没有(根)视图参与布局计算,该视图将对其自身应用转换。这就是为什么从根视图中获取值仍然有效。