我在使用UIPageControl和UIScrollView时遇到问题。
- (void)viewDidLoad
{
[super viewDidLoad];
imageArray = [[NSArray alloc] initWithObjects:@"image1.jpg", @"image2.jpg", @"image3.jpg", nil];
for (int i = 0; i < [imageArray count]; i++) {
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:i]];
[self.scrollView addSubview:imageView];
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [imageArray count], scrollView.frame.size.height);
scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
pageControl.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
}
#pragma mark - UIScrollView Delegate
- (void)scrollViewDidScroll:(UIScrollView *)sender
{
CGFloat pageWidth = self.scrollView.frame.size.width;
int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
self.pageControl.currentPage = page;
}
当我将方向更改为横向时,会出现问题。 image1.jpg与image2.jpg共享视图,这不是我想要的。
但是,如果我将方向改回纵向,则视图效果很好。
最佳答案
问题在于页面大小已更改(即,滚动视图的宽度),但图像的宽度未更改。
一种解决方案是旋转时重新进行计算,以调整UIImageViews的大小并计算scrollview的contentSize。也就是说,将for循环和分配移至scrollView.contentSize,从viewDidLoad移到私有方法,即sizeImagesAndSetContentSize。从willAnimateRotationToInterfaceOrientation:duration进行调用:
类似于以下内容:
- (void)viewDidLoad
{
[super viewDidLoad];
imageArray = [[NSArray alloc] initWithObjects:@"image1.jpg", @"image2.jpg", @"image3.jpg", nil];
[self sizeImagesAndSetContentSize];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
pageControl.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
}
- (void) sizeImagesAndSetContentSize {
for (int i = 0; i < [imageArray count]; i++) {
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:i]];
[self.scrollView addSubview:imageView];
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [imageArray count], scrollView.frame.size.height);
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
[self sizeImagesAndSetContentSize];
}
顺便说一句,viewDidLoad并不是进行几何计算的地方-就像涉及scrollView框架的事情一样,因为那时没有设置几何。在viewDidLoad中,事物的大小是它们在情节提要(或笔尖)中的大小,尚未根据实际设备和实际方向进行调整。如果到目前为止,它对您仍然有效,那是因为您以情节提要板的布局方向开始。可能是这样做的最佳位置,因此调用sizeImagesAndSetContentSize的最佳方法是在viewDidLayoutSubviews方法中。实际上,如果将调用移到那里,则不需要在旋转时显式调用它,因为发生旋转时,视图将对子视图进行布局,并且viewDidLayoutSubviews将自动被调用。所以我建议:
- (void)viewDidLoad
{
[super viewDidLoad];
imageArray = [[NSArray alloc] initWithObjects:@"image1.jpg", @"image2.jpg", @"image3.jpg", nil];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
pageControl.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
}
- (void) sizeImagesAndSetContentSize {
for (int i = 0; i < [imageArray count]; i++) {
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:i]];
[self.scrollView addSubview:imageView];
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [imageArray count], scrollView.frame.size.height);
}
- (void)viewDidLayoutSubviews {
[self sizeImagesAndSetContentSize];
}
附录:
在图像上添加文字:
要在图像顶部添加文本-您可以在滚动视图的“顶部”添加文本元素,例如标签。考虑以下应用程序的屏幕截图。在顶层的Cloud Slide Show View中,有一个全屏的Scroll View,并且在相同的层次结构级别上,但是在子视图列表的下方(因此在滚动视图的“顶部”)是用于描述的标签,3个按钮,以及一个UIPageControl。标签设置为通过支柱和弹簧旋转(在iOS 5上运行)以调整大小,因此您不必弄乱它。
此应用程序更改描述标签以匹配滚动视图页面中当前显示的图像-因此它必须检测页面更改。该应用程序在滚动视图委托协议方法scrollViewDidEndDecelerating中执行此操作:在滚动停止并填写正确的描述时,它决定在屏幕上显示哪个图像。
一种替代方法是在每个UIImage的顶部放置一个标签,但这很混乱,这就是为什么我的应用程序不这样做的原因。您可能希望视图包含UIImage和标签,以便重新定位标签是有意义的。可能是用代码创建的...对我来说,麻烦太多了。
顺便说一句,我应该说在滚动视图中使用页面模式可能不再是“最佳实践”方法。我正在将我的应用程序转换为使用UIPageViewController,这应该可以简化应用程序。例如,您不必进行旋转大小调整,因为UIPageViewControl的各个子VC可以自动调整其大小。
关于ios - 横向定向期间的UIPageControl和UIScrollView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15188043/