显示模态后移动视图 - 可能与 AutoLayout 相关

Posted

技术标签:

【中文标题】显示模态后移动视图 - 可能与 AutoLayout 相关【英文标题】:Shifting view after displaying modal - possibly AutoLayout related 【发布时间】:2013-08-04 23:09:38 【问题描述】:

我展示了一个带有几个标签和一个按钮的简单视图,所有这些都在 UIScrollView 内,并使用自动布局进行布局。

该按钮呈现另一个视图,其中包括一个用于关闭的导航项。

但是,在解雇之后,原始UIScrollView 的内容被偏移了。奇怪的是,它的偏移量似乎与呈现时的滚动位置有关。

演示项目here 是这个问题的一个小例子。在 iPhone 模拟器中运行它并滚动到底部以使用“模态”按钮。关闭模式尝试滚动回顶部后 - 问题应该很清楚。

或者参考下图中的滚动条来查看问题。

演示之前

演示后

【问题讨论】:

一个奇怪的旁注——我的实际项目将滚动视图的内容向相反的方向(向下)移动,而这里的演示项目将它们向上移动。希望解决演示项目中的问题足以让我继续前进。 【参考方案1】:

我不是 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

【讨论】:

工作就像一个魅力:)【参考方案2】:

我也遇到过同样的问题,经过大量调查,它似乎是 UIKit 中与滚动视图和 AutoLayout 相关的bug。这是“修复”...

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;
        );
    

【讨论】:

以上是关于显示模态后移动视图 - 可能与 AutoLayout 相关的主要内容,如果未能解决你的问题,请参考以下文章

显示模态视图 - IOS

在移动设备中选择视图,例如下拉菜单,而不是模态[关闭]

iPhone - 用另一个模态视图覆盖模态视图

当 UISearchBar 成为横向的第一响应者时,模态视图移动

选中模态视图行

从标签栏控制器模态显示视图