我正在处理的应用程序可以显示"项目"的详细信息。细节占用了足够的空间,细节视图需要垂直滚动。部分细节是一组图像,在水平可滚动子视图中逐个显示。最后,用户需要能够水平平移屏幕以更改正在显示的项目。
我实现这一点的方法是让UIPageViewController
来处理项目的更改,并使用视图控制器来处理显示项目详细信息。项目详细信息位于UIScrollView
中,图片视图中的另一个UIScrollView
已启用分页。
这个设置的问题是,当图像视图一直滚动到一端以便它不能再向那个方向滚动时,我想在图像视图上平移以影响页面视图控制器,这样视图将滚动到下一个项目,但这不会发生。图像视图滚动,细节视图本身也滚动。更改项目的平移适用于屏幕的其他部分,而不是在图像视图上。
我做了一个示例项目来演示这个问题。主UIViewController
的代码是
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIPageViewController *pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
pageController.dataSource = self;
[self addChildViewController:pageController];
[self.view addSubview:pageController.view];
pageController.view.frame = self.view.bounds;
[pageController didMoveToParentViewController:self];
[pageController setViewControllers:@[[[ItemViewController alloc] init]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
return [[ItemViewController alloc] init];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
return [[ItemViewController alloc] init];
}
@end
项目视图控制器的代码是
@implementation ItemViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIScrollView *imageView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
imageView.bounces = NO;
imageView.pagingEnabled = YES;
imageView.showsHorizontalScrollIndicator = NO;
imageView.showsVerticalScrollIndicator = NO;
UILabel *longText = [[UILabel alloc] init];
longText.font = [UIFont systemFontOfSize:28.0];
longText.text = @"AAAASSSSDDDDFFFFGGGGHHHHJJJJKKKKLLLL";
longText.textColor = [UIColor redColor];
[longText sizeToFit];
[imageView addSubview:longText];
imageView.contentSize = longText.bounds.size;
UIScrollView *mainScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
mainScrollView.showsHorizontalScrollIndicator = NO;
mainScrollView.showsVerticalScrollIndicator = NO;
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 2 * CGRectGetHeight(self.view.frame))];
[contentView addSubview:imageView];
[mainScrollView addSubview:contentView];
mainScrollView.contentSize = contentView.bounds.size;
[self.view addSubview:mainScrollView];
}
@end
我还使用以下发现对此代码进行了实验:
mainScrollView
,即我只添加imageView
作为self.view
的子视图,则分页工作正常。即使longText
足够短以完全适合屏幕,它也能继续工作。contentView
比屏幕更宽,即使是1点,分页也会再次起作用,但我需要将mainScrollView
平移到其内容的末尾。但是contentView
仅与屏幕一样宽,分页不会发生。从后一种观察来看,似乎UIScrollView
吞噬了无法滚动的方向的平移手势。但这并不能解释为什么在第一种情况下,imageView
是唯一可见的视图,即使滚动视图不可滚动,分页也能正常工作。