为什么这两种轮换方法给我不同的用户体验?

时间:2016-03-10 11:30:24

标签: ios swift rotation

我实现了UIPageViewController的自定义子类,它正在分页另一个自定义UIViewController子类的几个实例。很标准。我不能使用autolayout。

我希望在这两种情况下支持轮换

  • ALL,当应用程序允许所有屏幕方向时
  • 只有当应用程序中只允许使用肖像时才能显示肖像。

当允许所有方向时,一切都很完美。由于旋转实际上是窗口上的变换,因此分页控制器中的所有自定义分页控制器都被旋转"很好(他们只是有效地调整到新的界限),我正在利用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情况下的旋转,一切都完美地适应旋转。

我不能使用一种方法,我会允许全局轮换,然后在除了这个控制器之外的任何地方拯救肖像。该应用程序非常庞大,从非技术原因来看是不可能的,利益相关者根本不允许我这样做。

我的问题是 - 鉴于这些限制,你能否推荐一种更好的方法 - >用手动旋转听通知?

1 个答案:

答案 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:我认为它适用于内置旋转,因为没有直接应用于视图的变换。因此,没有(根)视图参与布局计算,该视图将对其自身应用转换。这就是为什么从根视图中获取值仍然有效。