我想使用 UIScrollView
作为我在应用程序中的主要容器,使我能够在 subview 之间来回滑动。为此,我创建了一个 UIViewController
带有 UIScrollView
的子类 IB网点 :
在 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
以正确的尺寸并排布置,我可以在它们之间来回滑动。当我旋转到横向时,似乎 ScrollView 大小和 subview 都没有调整大小。
我不知道我应该做什么来调整 subview 和 ScrollView 本身的大小,或者在代码中的什么时候我应该做任何事情,我似乎找不到任何例子。
有谁知道该怎么做?
[编辑] 尝试按照 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)可以看到 subview 在改变方向时增长到正确的屏幕尺寸
2)当当前页面是,例如,5页中的第2页,页面在方向改变后不是完全可见的,而是离屏大约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)
最佳答案
您需要重置帧大小、内容大小和内容偏移量,以使 subview 处于正确位置。
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 的中心时,我遇到了问题。
关于ios - UIScrollView + 改变方向 = 困惑的 subview (iPad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579412/