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,分页和旋转:旋转后第二个视图未正确对齐的主要内容,如果未能解决你的问题,请参考以下文章
如何创建允许 UIImageViews 分页和缩放的 UIScrollView?
iOS8.0(和 8.1)上第二个 UIScreen 的自动旋转问题