0

我需要让我的 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 应该表现得好像它总是在第一页。谢谢。

4

1 回答 1

1

你有两个选择:

  1. 您构建自己的自定义视图
  2. 您通过将当前页面移动到偏移量 0 来更改滚动视图行为

我解释了这两种解决方案:

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

** 继续使用滚动视图 **

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

于 2012-09-11T12:30:20.463 回答