Objective c 显示模式后移动视图-可能与自动布局相关

Objective c 显示模式后移动视图-可能与自动布局相关,objective-c,cocoa-touch,uiview,uiscrollview,autolayout,Objective C,Cocoa Touch,Uiview,Uiscrollview,Autolayout,我展示了一个简单的视图,其中包含两个标签和一个按钮,都位于UIScrollView中,并使用自动布局进行布局 该按钮显示另一个视图,其中包括用于解雇的导航项 不过,在撤销后,原始UIScrollView的内容将被抵消。奇怪的是,偏移量似乎与显示时的滚动位置有关 演示项目就是这个问题的一个小例子。在iPhone模拟器中运行它并滚动到底部以使用“模式”按钮。在取消模式后,尝试滚动回顶部-问题应该很清楚 或者参考下图中的滚动条查看问题 演讲前 演示后 我不是自动布局专家,但我通过将标签和按钮约束添加

我展示了一个简单的视图,其中包含两个标签和一个按钮,都位于
UIScrollView
中,并使用自动布局进行布局

该按钮显示另一个视图,其中包括用于解雇的导航项

不过,在撤销后,原始
UIScrollView
的内容将被抵消。奇怪的是,偏移量似乎与显示时的滚动位置有关

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

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

演讲前

演示后


我不是自动布局专家,但我通过将标签和按钮约束添加到
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

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

viewdiddemouse:
中,将当前滚动视图
contentOffset
保存到属性,并将其重置为零:

- (void)viewDidDisappear:(BOOL)animated 
{
    [super viewDidDisappear:animated];

    self.previousContentOffset = self.scrollView.contentOffset;

    self.scrollView.contentOffset = CGPointZero;
}
然后,在
视图中将出现:
,将内容偏移重置回原来的位置。我必须将其发送到主队列以使其正常工作:

- (void)viewWillAppear:(BOOL)animated 
{
    if (!CGPointEqualToPoint(self.previousContentOffset, CGPointZero))
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.scrollView.contentOffset = self.previousContentOffset;
        });
    }
}

有趣的是,我的实际项目将scrollview的内容向相反的方向移动(向下),而这里的演示项目将其向上移动。希望在演示项目中解决这个问题足以让我继续下去