在以下代码示例中,self.contentView
引用了相关的UIScrollView
。
// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height -
self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
[self.contentView setContentOffset:bottomOffset animated:YES];
}
奇怪的是,在iOS 6中,这种方法非常合适,但在iOS 7中滚动视图(假设它的contentSize
垂直大于它frame.size.height
)滚动到底部最底部的子视图添加到滚动视图。
例如,如果以下情况成立:
self.contentView.frame.size.height == 50.0
self.contentView.contentSize.height == 100.0
aSubView.frame.origin.y == 50.0
aSubView.frame.size.height == 20.0
滚动代码只会滚动,直到aSubView
可见; <{1}}而不是self.contentView.contentOffset.y == 20.0
,它位于整个滚动视图的底部。
这是(当然)直到以编程方式将另一个子视图添加到self.contentView.contentOffset.y == 50.0
(通过用户交互),然后一切都自行纠正。
为清楚起见,我在滚动代码之前和之后设置了断点,以衡量对self.contentView
的更改。
其他有趣的事实是,如果我删除self.contentView.contentOffset
并直接设置animated
,它会在iOS 7上按预期运行,但我更喜欢保留动画。
注意:不使用界面构建器
答案 0 :(得分:7)
只需一行..你可以滚动到底部..!
[yourScrollview scrollRectToVisible:CGRectMake(yourScrollview.contentSize.width - 1, yourScrollview.contentSize.height - 1, 1, 1) animated:YES];
答案 1 :(得分:5)
因此,通过将调用包装在异步调度块中,我很快就找到了一个非常不满意的解决方案。
// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height
- self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.contentView setContentOffset:bottomOffset animated:YES];
});
}
如果有人理解导致问题的真正原因并且可以提供更好的解决方案,我很乐意接受这个答案,但是对于处理同一问题的其他人来说,希望这也适合你。
答案 2 :(得分:0)
禁用“调整滚动视图插图”为我解决了这个问题。 (Xcode 6,iOS 8)
答案 3 :(得分:-1)
您可以在滚动视图的主视图的“文件检查器”窗格中取消选择“使用Autolayout”。这可能对您有所帮助。 UIScrollView doesn't scroll after upgrading to iOS7 / xcode 5