一个方向UIScrollView

时间:2012-09-11 12:18:54

标签: objective-c uiscrollview

我需要让我的UISCrollView只接受一个方向的滚动,而不仅仅是一个方向。 ScrollView包含水平方向播放列表中歌曲的专辑封面。它被分页,因此每个封面都有自己的页面。当用户向左滑动或拖动封面时,下一个封面会滑动到位并播放下一首歌曲。

不应该回到之前的歌曲或封面。我该如何防止这种行为?

我尝试了以下内容:

- (void)scrollViewDidScroll:(UIScrollView *)scrolledView
{
    if(scrollView.contentOffset.x < (pageIndex * 320) - 320)
        [scrollView setContentOffset:CGPointMake((pageIndex * 320) - 320, 0)];
}

但是,如果我快速滑动到“上一个”方向,那么封面会滑动大约150px到“下一个”方向,很奇怪。

我还尝试使用removeFromSuperview删除以前的封面,但这只会留下一个黑色空格,拖动仍然可以完成。

最后,我试图移动封面:

-(void) reloadCoverScrollView{
    for(int i = 1; i < [scrollView.subviews count]; i++){
        [scrollView exchangeSubviewAtIndex:i withSubviewAtIndex:i - 1];
    }
    [scrollView setNeedsDisplay];
}

我如何实现我想要的? ScrollView应该表现得好像始终在第一页。感谢。

1 个答案:

答案 0 :(得分:0)

您有两种选择:

  1. 您构建自己的自定义视图
  2. 通过在偏移0处移动当前页面来更改滚动视图行为
  3. 我解释了两种解决方案:

    **自定义视图(无滚动视图) * 你需要的是一个滚动视图,其中删除了大多数有用的滚动视图功能:没有连续滚动(但是分页),没有缩放,有限的内容大小(所以你只能限制一页)。 在我看来,你应该创建一个视图控制器来实例化两个视图:一个是当前视图,另一个是下一个视图;当前视图可见,下一个视图放在窗口外面。然后你添加一个单指平移手势并通过跟踪它的状态(这是一个连续的手势)你可以在第一个视图的顶部滑动第二个视图;当您考虑滑动完成后,您将完成动画。在动画结束时,您将新页面设置为“第一个”,并使用下一个视图渲染隐藏的第二页,依此类推......

    **保持使用滚动视图**

    在这种情况下,表现为UIScrollView委托的视图控制器必须以这样的方式运行,即可见页面放置在偏移为零的内容上。所以,假设您从第0页开始,滚动视图中有一个页面列表:第1页,第2页,... 一旦您滑动到第1页并且动画结束,您立即将第1页的所有视图翻译为左侧的一页(因此,如果您的页面宽度为320px,则会将所有子视图翻译为左侧的320px),您将删除第0页的子视图。然后,您将滚动视图内容偏移重置为原点(0,0)。因此,最后您将新页面1设置在位置0,页面2移动到位置1,依此类推。向左滚动但向右滚动是不可能的。 当您使用“removeFromSuperview”时,您做了正确的事情,但您忘记翻译子视图并重置内容偏移。