UIScrollView,分页和旋转:旋转后第二个视图未正确对齐

问题描述:

我正在使用启用分页的UIScrollView,并且下面的代码向其添加子视图(核心图表)。UIScrollView,分页和旋转:旋转后第二个视图未正确对齐

视图之间的水平滚动正常工作。 但是,当显示第二个视图,然后从横向模式旋转到纵向模式时,第二个视图部分向右移动,第一个视图的右侧部分显示在左侧,因此“破坏”分页模式。

可以帮助我有这些问题请问?我尝试了很多选择,但找不到我的错误。非常感谢!

这是我的iPad屏幕的外观与第二视图旋转为纵向模式后:

Parts of first screen (large bars) shown on the left side of the second screen

这是我的viewDidLoad方法:

- (void)viewDidLoad { 

self.scrollView.contentSize = CGSizeMake(768 * 2, 400); 
chart1 = [[CPTGraphHostingView alloc]initWithFrame:CGRectMake(0, 0, 768, 400)]; 
chart2 = [[CPTGraphHostingView alloc]initWithFrame:CGRectMake(768, 0, 768, 400)]; 

self.scrollView.autoresizesSubviews = NO; 
chart1.autoresizesSubviews = YES; 
chart2.autoresizesSubviews = YES; 
self.scrollView.contentOffset = CGPointZero; 
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth ; 

chart1.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth ; 
chart2.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth ; 
[self.scrollView addSubview:chart1]; 
[self.scrollView addSubview:chart2]; 

}

这是我如何实现ented旋转:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

{ 
    if (UIDeviceOrientationIsPortrait(fromInterfaceOrientation)) { 
     self.scrollView.contentSize = CGSizeMake(704 * 2, 400); 
     chart1.frame = CGRectMake(0, 0, 704, 400); 
     chart2.frame = CGRectMake(704, 0, 704, 400); 
     } 
    else { 
     self.scrollView.contentSize = CGSizeMake(768 * 2, 400); 
     chart1.frame = CGRectMake(0, 0, 768, 400); 
     chart2.frame = CGRectMake(768, 0, 768, 400); 
     } 
    } 

我认为你应该改变scrollview的contentOffset旋转时发生。 你应该有一种方法来知道旋转之前当前显示哪个页面(也许把这个信息放在一个变量中)。然后在你的didRotate ..方法设置滚动视图的contentOffset后调整其大小,如下所示:

CGFloat offset = self.scrollView.frame.size.width * currentPageIndex; 
[self.scrollView setContentOffset: offset]; 
+0

难道是旋转后发生扭曲第二个视图的大小(contentSize的减少)?我相信第二个视图应该在旋转后向左移动一定的像素量。我怎么能把这个轮换代码?有任何想法吗?谢谢,ale84! – AlexR 2012-03-07 22:15:59

+0

您是否尝试按照我的建议在didRotation中设置contentOffset? – ale84 2012-03-07 22:52:57

+1

我试着设置contentOffset滚动到相应的视图的开始,它的工作原理。但是,在我看来,这是一个解决方法。没有更优雅的版本来支持分页和旋转吗? – AlexR 2012-03-08 19:18:02

作为替代在您的视图控制器布置您的子视图,你认为你的子类UIScrollView的并重写它的layoutSubviews方法?您也可以考虑将维度定义为百分比而不是固定点 - 因为点值将根据旋转和其他UI元素(如导航和工具栏)的存在而发生变化。您可能会遇到麻烦,因为您正在手动调整旋转方法中的UI元素的大小,同时UI将尝试根据调整大小掩码自动调整元素的大小。只是我的想法...

+0

嗨艾萨克,我不想子类UIScrollView。我相信UIScrollView应该提供我开箱即用的行为。 – AlexR 2012-03-08 19:17:08

+0

将视图和视图控制器的行为混合在一起时,有时可能会遇到难以协调的布局问题。我明白你不想子类化,这很公平。我的建议源于这样一个事实,即您正在视图控制器中操作视图布局,该视图控制器正在混合视图和控制器的角色。我并不是说自己不会受这种做法的影响,但是,如果你正在寻找一个优雅的解决方案,可以回到以前的看法:让视图成为视图(包括布置自己的子视图),让控制器成为控制器。祝你好运! – isaac 2012-03-08 21:18:41