UIScrollView + 改变方向 = 混乱的子视图(iPad)
Posted
技术标签:
【中文标题】UIScrollView + 改变方向 = 混乱的子视图(iPad)【英文标题】:UIScrollView + change orientation = messed up subviews (iPad) 【发布时间】:2011-09-28 06:59:48 【问题描述】:我想在应用程序中使用UIScrollView
作为我的主容器,使我能够在子视图之间来回滑动。为此,我创建了一个带有UIScrollView
IBOutlet 的UIViewController
子类:
在viewDidLoad
方法中我构造了子页面:
for (int i= 0; i< pageCount; i++)
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * i;
frame.origin.y = 0;
UIWebView* aWebView= [[UIWebView alloc] initWithFrame:frame];
[self.scrollView addSubview:aWebView];
启动应用程序(纵向模式)时,一切正常。也就是说,UIWebViews
以正确的尺寸并排排列,我可以在它们之间来回滑动。
当我旋转到横向时,滚动视图大小和子视图似乎都没有调整大小。
我不知道我应该做什么来调整子视图和滚动视图本身的大小,或者我应该在代码中的什么时候做任何事情,我似乎找不到任何例子。
有人知道该怎么做吗?
[edit] 尝试按照 mahboudz 的建议调整尺寸:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * pageCount, self.scrollView.frame.size.height);
for (int i= 0; i< pageCount; i++)
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * i;
frame.origin.y = 0;
UIWebView* view= [[self.scrollView subviews] objectAtIndex:i];
view.frame= frame;
这种做我想要的,但有以下问题:
1) 可以看到子视图在改变方向时增长到正确的屏幕尺寸
2) 当当前页面例如是第 2 页(共 5 页)时,页面在方向更改后不会完全可见,而是在屏幕外大约 40 像素
3) 根据应用是以纵向模式还是横向模式(模拟器)启动,我会得到奇怪的效果,我试着解释一下:
当应用以纵向模式启动时:
子视图的形状/边框看起来乱七八糟/离屏,请看截图:http://i53.tinypic.com/21jr76x.png
当我旋转到横向时,一切看起来都很好,滚动效果非常好。即使我旋转回纵向,现在一切都很好:http://i55.tinypic.com/if3iiw.png
当应用以横向模式启动时:
我遇到与纵向模式相同的混乱/屏幕外故障
在纵向和横向之间来回切换可以解决横向模式的问题
但是:纵向模式的子视图的宽度与横向模式的宽度相同,因此子视图太宽了
我尝试修复 1) 在 willRotateToInterfaceOrientation
中执行上述代码,但它完全搞砸了布局。
我通过将以下代码添加到 didRotateFromInterfaceOrientation
来修复 2):
// update the scroll view to the appropriate page
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * self.currentPage;
frame.origin.y = 0;
[self.scrollView scrollRectToVisible:frame animated:NO];
注意:当前页面在scrollViewDidScroll
中确定
我不知道如何解决 3)
【问题讨论】:
【参考方案1】:您需要重置帧大小、内容大小和内容偏移量,以使子视图处于正确位置。
CGFloat screenHeight =[UIScreen mainScreen].bounds.size.height;
CGFloat screenWidth =[UIScreen mainScreen].bounds.size.width;
self.scrollView.frame = CGRectMake(0, 0, screenWidth, screenHeight);
self.scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, self.scrollView.frame.size.height);
self.scrollView.contentOffset = CGPointMake(visiblePageBeforeRotation * self.scrollView.bounds.size.width, 0);
这段代码应该放在方法中
-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
同时检查这个问题的答案: Clean autorotation transitions in a paging UIScrollView 它有一个名为 Rotolling 的好例子,用于在启用分页的情况下旋转 UIScrollView。
希望这会有所帮助。
P.S:在旋转时重新定位 UIWebView 的中心时遇到问题。
【讨论】:
【参考方案2】:您需要实现viewWillRotate/viewDidRotate
并根据需要调整我们的内容大小和方向。
【讨论】:
所以基本上我需要先设置contentSize(新几何*子视图计数),然后循环子视图并将frame属性设置为新几何?我是否还必须触发重绘视图 (setNeedsDisplay) 或类似内容,还是仅通过设置 frame 和 contentSize 来工作? 我认为您不需要设置NeedsDisplay。我很确定您需要调整框架/边界和 contentSize 等的大小。看看您是否可以通过使用 InterfaceBuilder(或通过代码)设置自动调整大小标志来获得一些自动移动/调整大小的帮助。以上是关于UIScrollView + 改变方向 = 混乱的子视图(iPad)的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView contentOffset 在方向更改后损坏
UIView、UICollectionView、UITableView、UIScrollView 的边界属性理解混乱