UIScrollView 最大和最小内容偏移量?

Posted

技术标签:

【中文标题】UIScrollView 最大和最小内容偏移量?【英文标题】:UIScrollView max and min contentOffsets? 【发布时间】:2017-05-26 01:02:27 【问题描述】:

如果UIScrollView 配置了其任何标准属性(例如 contentInset),我如何获得最小和最大 contentOffset?

即当用户一直向上滚动到左侧时,contentOffset 会被报告为什么?

即如果用户一直向下滚动到右下角,contentOffset 会被报告为什么?

【问题讨论】:

【参考方案1】:

假设我们有以下 UIScrollView:

内容大小:500 x 500 帧/边界大小:200 x 200 内容插入:(10, 10, 20, 20)

计算的内容偏移量:

最小内容偏移: .x:-contentInset.left (-10) .y: -contentInset.top (-10) 最大内容偏移 .x: contentSize.width - bounds.width + contentInset.right (320) .y: contentSize.height - bounds.height + contentInset.bottom (320)

通常 UIScrollView 从contentOffset = (0, 0) 开始。但是,当您添加 contentInsets 时,它开始偏移 量。当您将第一个位置滚动到视图中以便看不到 contentInset 时,您将位于 contentOffset = (0,0)

最后会发生类似的事情,最大偏移量不是 300,而是 320。

func minContentOffset(scrollView: UIScrollView) -> CGPoint 
    return CGPoint(
        x: -scrollView.contentInset.left,
        y: -scrollView.contentInset.top)


func maxContentOffset(scrollView: UIScrollView) -> CGPoint 
    return CGPoint(
        x: scrollView.contentSize.width - scrollView.bounds.width + scrollView.contentInset.right,
        y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom)

然后您可以创建一个函数,使用这两个函数来确定滚动视图是否可滚动:

func canVerticallyScroll(scrollView: UIScrollView) -> Bool 
    let scrollableHeight = maxContentOffset(scrollView: scrollView).y
        - minContentOffset(scrollView: scrollView).y
    let viewableHeight = scrollView.bounds.height
    return viewableHeight < scrollableHeight

或作为扩展:

extension UIScrollView 

  var minContentOffset: CGPoint 
    return CGPoint(
      x: -contentInset.left,
      y: -contentInset.top)
  

  var maxContentOffset: CGPoint 
    return CGPoint(
      x: contentSize.width - bounds.width + contentInset.right,
      y: contentSize.height - bounds.height + contentInset.bottom)
  

  func scrollToMinContentOffset(animated: Bool) 
    setContentOffset(minContentOffset, animated: animated)
  

  func scrollToMaxContentOffset(animated: Bool) 
    setContentOffset(maxContentOffset, animated: animated)
  

【讨论】:

很好的解释和例子。 我会将contentInset 替换为adjustedContentInset【参考方案2】:

滚动到原点

CGPoint(x: -contentInset.left, y: -contentInset.top)

滚动到底部

CGPoint(x: 0, y: -contentInset.top + contentSize.height - frame.height))

向右滚动

CGPoint(x: 0, y: -contentInset.left + contentSize.width - frame.width))

【讨论】:

以上是关于UIScrollView 最大和最小内容偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 内容偏移量会阻塞用户交互

UIScrollview 动画取决于内容偏移

确定 UIScrollVIew 中 UITextView 的滚动偏移量

预测减速后 UIScrollView 中的静止偏移量

UIAccelerometer 和 UIScrollView

偏移 UISlider 最小值/最大值图像