在以下代码示例中,self.contentView
指的是UIScrollView
。UIScrollView无法滚动到iOS 7底部
// 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
可见; self.contentView.contentOffset.y == 20.0
而不是self.contentView.contentOffset.y == 50.0
,它将位于整个滚动视图的底部。
这是(当然)发生,直到以编程方式将另一个子视图添加到self.contentView
(通过用户交互),然后一切都自行纠正。
为了清楚起见,我在滚动代码之前和之后设置断点以测量对self.contentView.contentOffset
的更改。
其他有趣的事实,如果我删除animated
并直接设置contentOffset
它在iOS 7上按预期工作,但我更喜欢保留动画。
注:不使用界面生成器
为什么不令人满意?动画代码应该始终在主线程上运行,并且只需确保它与此相关即可。您需要强制执行的内在原因以及应用程序不会自动使其在主线程上运行必须与某些可能只有Apple工程师才能解释的内部工作相关。 – manecosta
这是不令人满意的,因为代码已经在iOS 6中没有调度块的情况下工作,而且这个代码只能在主线程上执行,所以它应该在没有额外的调度块的情况下工作。 事实上,我必须强制程序等待,直到当前的Runloop循环完成,执行该代码行之前的任何操作都会显示缺少对调用该方法时发生的事情的理解。 –
这种行为很奇怪。强制使用主队列解决了我遇到的滚动问题...谢谢你的帮助。 – Vico