我展示了一个带有几个标签和一个按钮的简单视图,所有这些都在一个内部UIScrollView
并使用自动布局进行布局。
该按钮显示另一个视图,其中包括一个用于解除的导航项。
但是,解雇后,原件的内容UIScrollView
被抵消了。奇怪的是,它的偏移量似乎与呈现时的滚动位置有关。
这里的演示项目是这个问题的一个小例子。在 iPhone 模拟器中运行它并滚动到底部以使用“模态”按钮。在解除模式尝试滚动回顶部后 - 问题应该很清楚。
或者参考下图中的滚动条来查看问题。
演讲前
介绍后
我展示了一个带有几个标签和一个按钮的简单视图,所有这些都在一个内部UIScrollView
并使用自动布局进行布局。
该按钮显示另一个视图,其中包括一个用于解除的导航项。
但是,解雇后,原件的内容UIScrollView
被抵消了。奇怪的是,它的偏移量似乎与呈现时的滚动位置有关。
这里的演示项目是这个问题的一个小例子。在 iPhone 模拟器中运行它并滚动到底部以使用“模态”按钮。在解除模式尝试滚动回顶部后 - 问题应该很清楚。
或者参考下图中的滚动条来查看问题。
演讲前
介绍后
我不是 AutoLayout 方面的专家,但我通过将标签和按钮约束添加到self.view
而不是self.scrollView
.
例如:
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[l1]"
options:0
metrics:nil
views:@{@"l1":self.l1}]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[l1]"
options:0
metrics:nil
views:@{@"l1":self.l1}]];
为什么这会解决它......不知道:D
我也遇到过同样的问题,经过大量调查,这似乎是UIKit 中与滚动视图和 AutoLayout 相关的错误。这是“修复”...
在viewDidDisappear:
中,将当前滚动视图保存contentOffset
到一个属性,并将其重置为零:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
self.previousContentOffset = self.scrollView.contentOffset;
self.scrollView.contentOffset = CGPointZero;
}
然后,在 中viewWillAppear:
,将内容偏移量重置回原来的值。我必须将它分派到主队列中才能使其正常工作:
- (void)viewWillAppear:(BOOL)animated
{
if (!CGPointEqualToPoint(self.previousContentOffset, CGPointZero))
{
dispatch_async(dispatch_get_main_queue(), ^{
self.scrollView.contentOffset = self.previousContentOffset;
});
}
}