UIScrollView里面的另一个UIPageViewController里面

时间:2015-02-26 13:08:11

标签: ios uiscrollview

我正在处理的应用程序可以显示"项目"的详细信息。细节占用了足够的空间,细节视图需要垂直滚动。部分细节是一组图像,在水平可滚动子视图中逐个显示。最后,用户需要能够水平平移屏幕以更改正在显示的项目。

我实现这一点的方法是让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是唯一可见的视图,即使滚动视图不可滚动,分页也能正常工作。

0 个答案:

没有答案