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

Posted

技术标签:

【中文标题】UIScrollView,分页和旋转:旋转后第二个视图未正确对齐【英文标题】:UIScrollView, paging and rotation: Second view is not aligned properly after rotation 【发布时间】:2012-03-07 20:37:51 【问题描述】:

我正在使用启用了分页的 UIScrollView 和以下代码向其中添加子视图(核心绘图图表)。

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

您能帮助我解决这些问题吗?我尝试了很多替代方案,但找不到我的错误。非常感谢!

这是我的 iPad 屏幕在使用第二个视图旋转到纵向模式后的样子:

这是我的 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];

这就是我实现轮换的方式:

- (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);
         
    

【问题讨论】:

【参考方案1】:

我认为你应该在旋转发生时更改滚动视图的 contentOffset。 您应该有办法知道在旋转之前当前显示的是哪个页面(也许将此信息放在一个变量中)。然后在你的 didRotate.. 方法中设置滚动视图的 contentOffset 在调整它的大小后,像这样:

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

【讨论】:

可能是旋转后发生的调整大小(减少 contentSize)扭曲了第二个视图?我相信第二个视图应该在旋转后向左移动一定的像素量。我怎么能把这个轮换放在代码中?有任何想法吗?谢谢你,ale84! 您是否尝试按照我的建议在 didRotation 中设置 contentOffset? 我尝试将 contentOffset 设置为滚动到相应视图的开头并且它可以工作。但是,在我看来,这是一种解决方法。没有更优雅的版本支持分页和轮播吗?【参考方案2】:

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

【讨论】:

嗨,Isaac,我不想继承 UIScrollView。我相信 UIScrollView 应该提供我需要的开箱即用的行为。 当您混合视图和视图控制器的行为时,您有时会遇到难以协调的布局问题。我知道您宁愿不子类化,这很公平。我的建议源于您在视图控制器中操作视图布局的事实,它混合了视图和控制器的角色。我并没有声称可以不受这种做法的影响,但是,如果您正在寻找一个优雅的解决方案,请回到久经考验的真实方法:让视图成为视图(包括布置自己的子视图),让控制器成为控制器。祝你好运!

以上是关于UIScrollView,分页和旋转:旋转后第二个视图未正确对齐的主要内容,如果未能解决你的问题,请参考以下文章

使用分页旋转 UIScrollView 的问题

UIscrollView 快速分页和缩放图像

如何创建允许 UIImageViews 分页和缩放的 UIScrollView?

iOS8.0(和 8.1)上第二个 UIScreen 的自动旋转问题

UIScrollView里面的UIScrollView:滚动

如何旋转 UIScrollView?