UIScrollView自定义分页

Ols*_*nsk 14 iphone objective-c uiscrollview uiview ios

我的问题与我试图用滚动条进行的自定义分页形式有关,如果你首先考虑在老虎机中实现的滚动视图的类型,这更容易可视化.

所以说我的UIScrollView的宽度为100像素.假设它包含3个内部视图,每个视图的宽度为30个像素,使得它们以3个像素的宽度分隔.我想要实现的分页类型是每个页面是我的一个视图(30个像素),而不是滚动视图的整个宽度.

我知道通常情况下,如果视图占用滚动视图的整个宽度,并且启用了分页,则一切正常.但是,在我的自定义分页中,我还希望滚动视图中的周围视图也可见.

我该怎么做?

pic*_*ano 26

我刚刚为另一个项目做了这个.您需要做的是将UIScrollView放入UIView的自定义实现中.我为此创建了一个名为ExtendedHitAreaViewController的类.ExtendedHitAreaView会覆盖hitTest函数以返回其第一个子对象,该对象将是您的滚动视图.

您的滚动视图应该是您想要的页面大小,即30px with clipsToBounds = NO.扩展命中区域视图应该是您想要显示的区域的完整大小,其中clipsToBounds = YES.

将滚动视图作为子视图添加到扩展命中区域视图,然后将扩展命中区域视图添加到viewcontroller的视图中.

@implementation ExtendedHitAreaViewContainer

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        if ([[self subviews] count] > 0) {
            //force return of first child, if exists
            return [[self subviews] objectAtIndex:0];
        } else {
            return self;
        }
    }
    return nil;
}
@end
Run Code Online (Sandbox Code Playgroud)


Joh*_*ool 14

从iOS 5开始,有这种委托方法:- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset.

所以你可以这样做:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint
*)targetContentOffset {
    if (scrollView == self.scrollView) {
        CGFloat x = targetContentOffset->x;
        x = roundf(x / 30.0f) * 30.0f;
        targetContentOffset->x = x;
    } 
}
Run Code Online (Sandbox Code Playgroud)

对于更高的速度,如果你想要更加敏捷的感觉,你可能想要调整一下targetContentOffset.