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 中 UITextView 的滚动偏移量