答案 0 :(得分:39)
但是!
我在滚动视图中创建了一个带有几个视图的示例项目,它工作正常。随意按照您的意愿分开。它的工作原理是创建5个视图,并将它们添加到滚动视图中。然后在第一次设置这些视图后,每次应用程序旋转时,它都会调用我的方法alignSubviews
将它们放在正确的页面位置,并使它们与滚动视图的大小相同,同时更新滚动视图的contentSize
。在旋转发生之前,它会跟踪滚动视图当前所在的页面,然后在旋转期间将其重置为该页面(因为页面大小必须更改)。
答案 1 :(得分: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];
}
答案 2 :(得分:1)
听起来你正在应用魔法,需要在正确的位置以错误的方式将旋转版本放在屏幕上。
由于您没有共享任何代码,以下只是猜测。据推测,您应用旋转和翻译。 声音就像你正在旋转UIScrollView
的内容一样。做到这一点将是棘手的。没有代码就很难说出任何结论,但如果你只有1次轮换和1次翻译,那么你的做法是错误的。您需要将当前视图转换为轴心点,旋转和平移。否则翻译将成为轮换的一部分(因此大转弯)。
您最好旋转UIScrollView
本身。它将始终位于具有定义中心的定义位置(即:屏幕)。然后内容将随之旋转。
答案 3 :(得分:1)
一个运行良好的简单解决方案是在更改UIScrollView的contentSize时注册通知,然后在此时更新contentOffset。
在您的视图加载方法中添加以下行:
[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;
}