Objective-C:UIScrollView手动分页

时间:2010-04-20 06:28:07

标签: iphone objective-c iphone-sdk-3.0 uiscrollview paging

我想在水平模式下使用scrollview作为选择器。 scrollview最多可容纳七个子视图。 每个子视图代表一个值。 始终可以看到三个视图,中间的一个视图是选定的视图。

Scrollview在开始时可见:

__ | V1 | V2

Scrollview设置为查看/值二:

V1 | V2 | V3

Scrollview设置为上一个值:

V2 | V3 | __

我遇到的真正问题是“pagingEnabled”标志。 如果pagingEnabled设置为YES,则scrollview页面总是三个子视图/值而不是一个。 如果pagingEnabled设置为NO,则scrollview不会成功。

我的问题有一个很好的解决方案吗?

非常感谢, 丹;)

3 个答案:

答案 0 :(得分:4)

将scrollview的框架更改为仅显示中间视图(即其原始宽度的三分之一,并偏移相同的数量),但随后将其clipsToBounds属性设置为NO。

答案 1 :(得分:1)

如果其他人有兴趣,我找到了解决方案。

指定您查看scrollview的委托。 Ovveride scrollViewDidEndDecelerating,然后通过做类似的事情来获取你当前的索引(你想要的页面)。

 NSNumber* currentIndex = [NSNumber numberWithInt:round(scrollview.Contentoffset.x / PAGE_SIZE)];

//Then just update your scrollviews offset with


[scrollview setContentOffset:CGPointMake([currentIndex intValue] * PAGE_SIZE, 0) animated:YES];

答案 2 :(得分:0)

从iOS 5开始,UIScrollViewDelegate上有scrollViewWillEndDragging:withVelocity:targetContentOffset:委托方法。这允许您实现任意分页。

要实现此功能,首先需要将pagingEnabled属性设置为NO,否则我所称的代理方法不会被调用。每当用户抬起手指并且滚动视图想要确定滚动完成的位置时,滚动视图现在会调用此委托方法。

魔术是最后一个参数targetContentOffset:它是指向CGPoint的指针,用作输入/输出变量。这意味着此变量会告诉您scrollview要滚动到的位置。但它允许您修改此目标位置。 velocity也可能是有意义的,它可以指示用户是否推送"滚动视图或移动它,停止,然后抬起他的手指。

例如,这是一个将目标x位置四舍五入到最接近的100的倍数的实现,从而制作了#34;页面" 100分宽度。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    targetContentOffset->x = round(targetContentOffset->x / 100.0) * 100.0;
}