时间:2010-07-23 21:33:04

标签: iphone uiscrollview autorotate

4 个答案:

答案 0 :(得分:39)

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

但是!

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

Download "Rotolling"!

screenshot http://cl.ly/43de79be29c5a03a1775/content

答案 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;
}