Iphone 在分页UIScrollView中清除自动旋转转换

Iphone 在分页UIScrollView中清除自动旋转转换,iphone,uiscrollview,autorotate,Iphone,Uiscrollview,Autorotate,我有一个分页UIScrollView,用户可以在其中水平浏览图像,比如苹果的Photos.app。这是可行的,但现在我正在尝试添加旋转支持 我已经让视图旋转正常,并且已经成功地设置了contentSize、边界和子视图的帧,以适应不同的方向。所以在旋转前后,一切都正常 然而,这种转变本身就很尴尬。第一幅图像旋转完美,就好像旋转轴位于图像的死点(滚动视图框架)。第二个图像“摆动”,因为旋转轴位于同一位置:第一个图像的中心。离第一张图片越远,“摆动”越快 我可能可以通过在旋转之前覆盖一个不透明的UI

我有一个分页UIScrollView,用户可以在其中水平浏览图像,比如苹果的Photos.app。这是可行的,但现在我正在尝试添加旋转支持

我已经让视图旋转正常,并且已经成功地设置了contentSize、边界和子视图的帧,以适应不同的方向。所以在旋转前后,一切都正常

然而,这种转变本身就很尴尬。第一幅图像旋转完美,就好像旋转轴位于图像的死点(滚动视图框架)。第二个图像“摆动”,因为旋转轴位于同一位置:第一个图像的中心。离第一张图片越远,“摆动”越快


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

听起来你在运用魔法,需要在屏幕上的正确位置,以错误的方式获得旋转版本

由于您没有共享任何代码,以下只是猜测。假设您应用了旋转和平移。听起来您正在旋转
UIScrollView
的内容。要做到这一点是很棘手的。没有代码很难做出结论,但是如果你只有一个旋转和一个平移,你就错了。您需要将当前视图平移到轴点,旋转并向后平移。否则,平移将是旋转的一部分(因此是大摆动)


您最好旋转
UIScrollView
本身。它将始终位于具有定义中心的定义位置(即:屏幕)。然后内容会随之旋转。

坦白说,我不知道你在做什么,因为你根本没有给我们展示太多

但是

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


我记下这些附加信息,供以后参考。 我用@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];
}

一个简单有效的解决方案是在UIScrollView的contentSize更改时注册通知,然后在此时更新contentOffset

在视图加载方法中添加以下行:

[self addObserver:theScrollView forKeyPath:@"contentSize" options:0 context:nil];
[self removeObserver:self forKeyPath:@"contentSize"];
在视图卸载方法中添加以下行:

[self addObserver:theScrollView forKeyPath:@"contentSize" options:0 context:nil];
[self removeObserver:self forKeyPath:@"contentSize"];
捕捉通知:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    theScrollView.contentOffset = page * theScrollView.bounds.width;
}

很好的例子!我没有发布任何代码,因为我知道我拥有的东西需要废弃。这个故事的寓意是,如果我发现自己到处都在手动设置和重置视图框架,我就做错了。谢谢你提供了一个很好的例子。要在iOS 6上成功启动,需要进行一次修复:[window setRootViewController:viewController];应用程序:使用选项方法完成启动。感谢您提供的一个伟大的示例,它解决了我一个巨大的问题!!