Objective-C : UIScrollView 手动分页

问题描述 投票:0回答:3

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

滚动视图在开始时可见:

__ | V1 | V2

Scrollview 设置为视图/值二:

V1 | V2 | V3

滚动视图设置为最后一个值:

V2 | V3 | __

我遇到的真正问题是“pagingEnabled”标志。 如果 pagingEnabled 设置为 YES,则滚动视图页面始终包含三个子视图/值,而不是只有一个。 如果 pagingEnabled 设置为 NO,则滚动视图不会固定。

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

非常感谢, 丹;)

objective-c iphone uiscrollview iphone-sdk-3.0
3个回答
4
投票

将滚动视图的框架更改为仅显示中间视图(即其原始宽度的三分之一,并偏移相同的量),但然后将其

clipsToBounds
属性设置为 NO。


1
投票

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

为您分配滚动视图的视图委托。 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];

0
投票

从 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.