我想在水平模式下使用scrollview作为选择器。 scrollview最多可容纳七个子视图。 每个子视图代表一个值。 始终可以看到三个视图,中间的一个视图是选定的视图。
Scrollview在开始时可见:
__ | V1 | V2
Scrollview设置为查看/值二:
V1 | V2 | V3
Scrollview设置为上一个值:
V2 | V3 | __
我遇到的真正问题是“pagingEnabled”标志。 如果pagingEnabled设置为YES,则scrollview页面总是三个子视图/值而不是一个。 如果pagingEnabled设置为NO,则scrollview不会成功。
我的问题有一个很好的解决方案吗?
非常感谢, 丹;)
答案 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;
}