首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用scrollViewWillEndDragging确保UIScrollView以定义的增量停止

使用scrollViewWillEndDragging确保UIScrollView以定义的增量停止
EN

Stack Overflow用户
提问于 2015-07-23 19:08:23
回答 1查看 665关注 0票数 0

我希望我的UIScrollView自然地以某些增量值(对应于水平滚动UIScrollView的宽度的每50点)滑行结束,我定制了scrollViewWillEndDragging,就像建议的那样(如建议的那样,但没有在这里的答案中详细描述,以逐步递增的方式滚动水平UIScrollView?):

代码语言:javascript
运行
复制
- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{

    if(fmodf(targetContentOffset->x, 50.0)){
        int roundingNumber1 = 50;
        CGFloat newOffset = roundingNumber1 * floor(((scrollView.contentOffset.x)/roundingNumber1)+0.5);
        targetContentOffset->x = newOffset;
    }

}

但是,我不确定这是否真的以特定的增量停止了视图,我还注意到效果是不对称的。虽然我的滚动运动/速度/等等是相同的,但向右滚动比向左滚动要少得多。向右滚动更快,更突然。有一个视频 这里。为什么这种行为是不对称的,我如何改变它呢?

我之所以不以50的增量停止滚动,是因为我在滚动视图下也有一个UILabel,该视图由其他委托函数更新以显示偏移量。当滚动完成时,它显示的值很少接近50。这是因为滚动没有增加到50的值,还是因为我没有在正确的时间更新?

谢谢你的建议。

代码语言:javascript
运行
复制
- (void) scrollViewDidScroll:(UIScrollView *)scrollView{

    if(abs(self.lastOffset - scrollView.contentOffset.x) > 49){
        CGFloat newNumber = scrollView.contentOffset.x;
        self.numberProperty.text = [NSString stringWithFormat:@"%.00f", scrollView.contentOffset.x];
        self.lastOffset = scrollView.contentOffset.x;
        [self.view setNeedsDisplay];
    }
}

- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
            self.numberProperty.text = [NSString stringWithFormat:@"%.00f", scrollView.contentOffset.x];
}
EN

回答 1

Stack Overflow用户

发布于 2015-07-25 16:46:15

您可以将滚动视图上的pagingEnabled设置为true,而不是实现这些委托方法,从而免费获得此行为。启用分页时,滚动视图将在结束拖动时自动切换到最近的“页”,其中页面宽度等于滚动视图的宽度。

根据您的视频,看起来滚动视图中的项小于滚动视图本身的宽度。要使用分页,您必须执行以下操作:

  1. 使您的滚动视图具有与您的项目之一相同的宽度(在您的情况下是50.0个单位)。
  2. scrollView.clipsToBounds设置为false,以便滚动视图在其更小的边界之外绘制子视图。
  3. scrollView.pagingEnabled设置为true,这样滚动视图将带分页滚动。

此时,分页工作,但无法将滚动视图拖出其界限。要使其工作,您需要将滚动视图嵌入到一个将触摸事件转发到它的更大视图中。

  1. 创建一个“触摸转发”类并将其添加到视图中。

这个类接收它接收到的所有触摸事件,并将它们发送到它的targetView属性。DJK是我为类名设置的随机前缀。

代码语言:javascript
运行
复制
@interface DJKTouchForwardingView : UIView

/** The view to which touch events should be forwarded. */
@property (weak, nonatomic) UIView *targetView;

@end

@implementation DJKTouchForwardingView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *child = nil;
    if ((child = [super hitTest:point withEvent:event]) == self) {
        return self.targetView;
    }
    return child;
}

@end
  1. 使滚动视图成为触摸转发视图的子视图,并将其分配给targetView属性。

您的滚动视图现在将在触摸转发视图的范围内滚动,并将切换到50个单元页面。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31596096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档