在分页UIScrollView中清除自转过渡

ale*_*ntd 12 iphone uiscrollview autorotate

我有一个分页UIScrollView,其中用户水平浏览图像,如Apple的Photos.app.这有效,但现在我正在尝试添加旋转支持.

我已经让视图旋转正常,并设法正确设置contentSize,bounds和subviews框架以适应不同的方向.所以在轮换之前和之后,一切都还可以.

然而,过渡本身很尴尬.第一个图像完美旋转,就好像旋转轴位于图像的死点(滚动视图框).第二个图像"摆动",因为旋转轴位于相同的位置:第一个图像的中心.我从第一张图片越远,"摇摆"越快.

我可以通过在旋转之前覆盖不透明的UIView并在之后隐藏它来掩盖它.但这是一个黑客.必须有一个优雅的方式来做到这一点......

jtb*_*des 40

坦率地说,我不知道你在做什么,因为你根本没有向我们展示过多少.

但!

我在滚动视图中创建了一个带有几个视图的示例项目,它工作正常.随意按照您的意愿分开.它的工作原理是创建5个视图,并将它们添加到滚动视图中.然后在第一次设置这些视图之后,每次应用程序旋转时,它都会调用我的方法alignSubviews将它们放在正确的页面位置,并使它们与滚动视图的大小相同,同时更新滚动视图contentSize.在旋转发生之前,它会跟踪滚动视图当前所在的页面,然后在旋转期间将其重置到该页面(因为页面大小必须更改).

下载"Rotolling"!

截图http://cl.ly/43de79be29c5a03a1775/content

  • 谢谢你的好榜样.需要做一个修复才能在iOS 6上成功启动:[window setRootViewController:viewController]; 应用程序:didFinishLaunchingWithOptions方法. (4认同)

Eon*_*nil 7

我注意到这些附加信息供以后自己参考.我从@jtvandes的解决方案中解决了这个问题.但是,就我而言,这些实现就足够了.强制布局再次打破了我的观点.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{
    currentPageOffset = [hostingScrollView contentOffset].x / [hostingScrollView bounds].size.width;
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{
    //  Layout changed instantly at this time.
    //  So we have to force to set offset instantly by setting animation to NO.
    [hostingScrollView setContentOffset:CGPointMake([hostingScrollView bounds].size.width * currentPageOffset, 0.0f) animated:NO];
}
Run Code Online (Sandbox Code Playgroud)