我想使用滚动视图作为水平模式下的选择器。 滚动视图最多可容纳七个子视图。 每个子视图代表一个值。 始终可见三个视图,中间的视图是选定的视图。
滚动视图在开始时可见:
__ | V1 | V2
Scrollview 设置为视图/值二:
V1 | V2 | V3
滚动视图设置为最后一个值:
V2 | V3 | __
我遇到的真正问题是“pagingEnabled”标志。 如果 pagingEnabled 设置为 YES,则滚动视图页面始终包含三个子视图/值,而不是只有一个。 如果 pagingEnabled 设置为 NO,则滚动视图不会固定。
我的问题有好的解决方案吗?
非常感谢, 丹;)
将滚动视图的框架更改为仅显示中间视图(即其原始宽度的三分之一,并偏移相同的量),但然后将其
clipsToBounds
属性设置为 NO。
如果其他人有兴趣,我找到了解决方案。
为您分配滚动视图的视图委托。 OvveridescrollViewDidEndDecelerating,然后通过执行类似的操作来获取当前索引(您想要的页面)。
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];
从 iOS 5 开始,scrollViewWillEndDragging:withVelocity:targetContentOffset:
上有了
UIScrollViewDelegate
委托方法。这允许您实现任意分页。
为此,您首先需要将
pagingEnabled
属性设置为 NO
,否则不会调用我正在讨论的委托方法。现在,每当用户抬起手指并且滚动视图想要确定在哪里完成滚动时,滚动视图都会调用此委托方法。
神奇之处在于最后一个参数,
targetContentOffset
:它是一个指向CGPoint
的指针,用作输入/输出变量。这意味着这个变量告诉你滚动视图想要滚动到哪里。但它允许您修改这个目标位置。 velocity
可能也很有趣,它可以指示用户是否“推动”滚动视图或移动它、停止,然后抬起手指。
例如,以下实现将目标
x
位置四舍五入到最接近的 100 倍数,从而使“页面”宽度为 100 点。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
targetContentOffset->x = round(targetContentOffset->x / 100.0) * 100.0;
}