如何移动子视图控制器,同时使用自动布局而不是框架隐藏状态栏?

Posted

技术标签:

【中文标题】如何移动子视图控制器,同时使用自动布局而不是框架隐藏状态栏?【英文标题】:How do I move a child view controller, while hiding the status bar using Auto Layout instead of frames? 【发布时间】:2013-12-16 06:26:42 【问题描述】:

我有一个视图控制器,其中包含多个子视图控制器(使用 Storyboard 设置),我将顶部的那个移动到右侧(也带有状态栏)以显示底层侧边栏视图控制器。

这与框架完美配合,如下所示:

- (void)displaySidebar 
    self.fullScreenSnapshotOverlay = [self takeFullScreenSnapshot];
    [self.postsView addSubview:self.fullScreenSnapshotOverlay];

    [self hideStatusBar];

    [UIView animateWithDuration:0.4 animations:^
        CGRect newFrame = self.postsView.frame;
        newFrame.origin.x += 200.0;

        self.postsView.frame = newFrame;
    ];

(hideStatusBar简单调用了UIApplication方法和layoutIfNeeded。)

给我这个(完美的)结果:

但是,如果在 Storyboard 中,我转到容器视图控制器并从其前导空间到它所嵌入的视图控制器左侧进行约束,然后调整该常量,它真的会弄乱导航栏,我假设由于隐藏状态栏并截屏。我正在使用此代码:

- (void)displaySidebar 
    self.fullScreenSnapshotOverlay = [self takeFullScreenSnapshot];
    [self.postsViewController.view addSubview:self.fullScreenSnapshotOverlay];

    [self hideStatusBar];

    [UIView animateWithDuration:0.4 animations:^
        self.postsViewControllerDistanceFromLeftSideConstraint.constant = 270.0;

        [self.view layoutIfNeeded];
    ];

给我这个乱七八糟的结果:

现在我知道最简单的方法就是继续使用框架,但我想了解如何使用自动布局正确地做到这一点。我在这里做错了什么?

【问题讨论】:

您是否看过我的回答,看看它与您正在做的事情有何不同? 【参考方案1】:

我不确定我所做的与您所做的有何不同。我将发布到您的另一个问题 (Why does hiding my status bar completely break my simple animation?) 的代码修改为以下内容,并且运行良好。

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];
    [self performSelector:@selector(displaySidebar) withObject:nil afterDelay:1];


-(void)displaySidebar 
    self.snapshotView = [self takeSnapshot];
    [self.PostsView addSubview:self.snapshotView];
    [self hideStatusBar];
    self.leftCon.constant = 270;
    [UIView animateWithDuration:1.0 animations:^
        [self.view layoutIfNeeded];
    ];



-(void)moveOutMenu  // called from a button in the menu controller
    self.leftCon.constant = 0;
    [UIView animateWithDuration:1.0 animations:^
        [self.view layoutIfNeeded];
     completion:^(BOOL finished) 
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        [self.snapshotView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.01];
    ];


-(UIView *)takeSnapshot 
    UIView *v = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
    return v;


-(void)hideStatusBar 
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [self.view layoutIfNeeded];

您对要移动的容器视图有哪些限制?也许那里有些不同(我有顶部、前导、底部和宽度约束——leftCon 是前导约束的出口)。

【讨论】:

我也尝试了类似的代码示例,但仍然无法正常工作:cl.ly/1721281L3Z1k @Aloha64,您的不起作用,因为您对顶部布局指南而不是视图顶部(对于容器视图)有约束。删除该约束,然后转到 Editor 菜单并选择 Pin --> "Top Space To Superview"

以上是关于如何移动子视图控制器,同时使用自动布局而不是框架隐藏状态栏?的主要内容,如果未能解决你的问题,请参考以下文章

将 iOS 项目转换为自动布局

使用自动布局删除和重新添加子视图

Swift - 使用自动布局时获取视图框架

自动布局 - 视图控制器框架不正确

如何使用自动布局来移动视图

只想使用自动布局调整中间视图的大小