如何在我的代码中使UIScrollView
滚动到底部?或者更一般地说,滚动到子视图的任意点?
如何在我的代码中使UIScrollView
滚动到底部?或者更一般地说,滚动到子视图的任意点?
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
Swift:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
易于复制粘贴的已接受答案的 Swift 版本:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)
最简单的解决方案:
[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
一种简洁的实现:
extension UIScrollView {
func scrollToBottom(animated: Bool) {
if self.contentSize.height < self.bounds.size.height { return }
let bottomOffset = CGPoint(x: 0, y: self.contentSize.height - self.bounds.size.height)
self.setContentOffset(bottomOffset, animated: animated)
}
}
使用它:
yourScrollview.scrollToBottom(animated: true)
仅对现有答案进行了增强。
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
它也会处理底部插入(即使在键盘可见时调整滚动视图时使用该插入)。
将内容偏移设置为内容大小的高度是错误的:它会将内容底部滚动到滚动视图的顶部,因此不可见。
正确的解决方法是将内容底部滚动到滚动视图的底部,像这样(sv
是UIScrollView):
CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
if (sv.contentOffset.y + bsz.height > csz.height) {
[sv setContentOffset:CGPointMake(sv.contentOffset.x,
csz.height - bsz.height)
animated:YES];
}
if (sv.contentOffset.y + csz.height > bsz.height) {
吗? - i_am_jorfsetContentOffset:
命令。 - matt考虑到contentInset
,这是一个Swift 2.2的解决方案。
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
这应该放在一个扩展中
extension UIScrollView {
func scrollToBottom() {
let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
setContentOffset(bottomOffset, animated: true)
}
}
请注意,在滚动之前您可能想检查bottomOffset.y > 0
如果contentSize
比bounds
小怎么办?
对于Swift,它是:
scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
回到顶部
- CGPoint topOffset = CGPointMake(0, 0);
- [scrollView setContentOffset:topOffset animated:YES];
滚动到底部
- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height);
- [scrollView setContentOffset:bottomOffset animated:YES];
看起来这里的所有答案都没有考虑到安全区域。
自iOS 11开始,iPhone X引入了一个安全区域。这可能会影响scrollView的contentInset
属性。
对于iOS 11及以上版本,为了正确地滚动到包括内容插图的底部,应该使用adjustedContentInset
而不是contentInset
。请检查以下代码:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.adjustedContentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.adjustedContentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
contentOffset.x
):extension UIScrollView {
func scrollsToBottom(animated: Bool) {
let bottomOffset = CGPoint(x: contentOffset.x,
y: contentSize.height - bounds.height + adjustedContentInset.bottom)
setContentOffset(bottomOffset, animated: animated)
}
}
参考资料:
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
- MartincontentSize
小于bounds
,则它将无法正常工作。因此应该像这样:scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
。请注意,我已尽力使翻译表达通俗易懂,同时保持原意不变。 - Bartłomiej Semańczyklet bot = max(cv.contentSize.height - cv.bounds.height + cv.contentInset.bottom + cv.safeAreaInsets.bottom, 0)
- Xavier L.