scrollViewWillEndDragging:withVelocity:targetConte

2019-06-25 04:39发布

我试图实现其滚动且具有寻呼在每个标签栏项目的自定义标签栏。 对于我正在使用委托scrollViewWillEndDragging:withVelocity:targetContentOffset:其中一个问题完美的作品。

我的传呼的工作方式是,如果contentOffset是正确的项目,它的targetContentOffset变为该项目的偏移附近。 在左侧同样的事情。

问题是,每当我在在第一项的左半部分和最后的右边(滚动视图工作水平),它应该去ContentOffset 0,内容最右边的项目的偏移量(减去那些上屏幕),但事实并非如此。

我与调试器检查和targetContentOffset-> x是确实0(在第一种情况下 - 左最左边项目的)。 所以,问题是没有的UIScrollView滚动出现。 我迷路了。

这是我实现的委托:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                 withVelocity:(CGPoint)velocity
          targetContentOffset:(inout CGPoint *)targetContentOffset{
     NSInteger index = lrintf(targetContentOffset->x/self.tabWidth);
     targetContentOffset->x = index * self.tabWidth;
}

这里是图解释什么是我想做的事情。

|-------|-------|-------|-------|-------|-------|-------|
|       |       |       |       |       |       |       |
|       |       |       |       |       |       |       |
|_______|_______|_______|_______|_______|_______|_______|

        |_______________________________________|
         where it is and i scroll it to the left

   <----|

   |_______________________________________|
              where it would stop

|_______________________________________|
        where i want it to stop

Answer 1:

这是一个已知的问题似乎。 经过一番调查再跟其他人有人认为这可能是一个错误,这被证明是正确的。 我把它报道了苹果公司,它被标记为复制,但仍处于打开状态。 只是回答了那些有同样的问题。 我解决办法像大Papoo表明,通过使用偏移接近我想要的(0.1似乎这样做)。 同为右端。



Answer 2:

发行固定在iOS 6.0。

现在,它的作品,因为它应该。



Answer 3:

我尝试设置最后偏移的东西稍微偏离零或内容大小由大Papoo的建议,但注意到,这消除了过度滚动反弹。 我对这个解决方案是检查原来targetContentOffset,看它是否等于零或contentSize和离开它,如果它是:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    float expectedOffset = targetContentOffset->x;
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset.

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset.

    // Adjust the offset to make sure it works.
    if (targetOffset == 0) targetOffset = 1;
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1;

    targetContentOffset->x = targetOffset;
}

你当然可以再使用scrollViewDidEndDecelerating:向移动滚动视图是1分。



Answer 4:

我发现2种,你可以调查无证行为: - 设置为零,因为最终的偏移不工作,我建议把1或任何大于零(0.5可以正常工作,未测试) - 你最好检查速度符号和计算最终偏移是在当前点删除用户手指的左侧或右侧。 不要试图让滚动向后走在另一边。



Answer 5:

如果您使用的是水平表视图,那么你的scrollViewWillEndDragging内:withVelocity:targetContentOffset:功能,您可以拨打:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES];

我发现这工作比试图操纵targetContentOffset->Ÿ水平表视图好得多。



文章来源: scrollViewWillEndDragging:withVelocity:targetContentOffset: not working on the edges of a UISCrollView