使用简单动画添加子视图时使用NSLayoutConstraints

时间:2013-02-04 13:01:06

标签: ios objective-c nslayoutconstraint

我正在尝试将一个视图(messageView)添加到我的菜单项(messageViewMenu)中,这样当点击菜单项时,这个新视图就会被添加到它上面,它们都会一个接一个地向下滑动到屏幕上 - Evernote 5.1.2有类似的东西。

我正在使用NSLayoutConstraint将新视图附加到我认为是菜单项顶部的视图。然后我将菜单项的现有垂直约束设置为标题UIView(_headerMessageConstraint),以增长到300.我希望新视图垂直附加,其后边缘到菜单项的前沿,然后它们向下滑动到屏幕上一起。

但是,新视图会随菜单项向下滑动,然后继续在其后面,直到顶部边缘对齐为止。

谁能告诉我哪里出错了? 在此先感谢您的帮助

史蒂夫

EDIT。自从我发布这个以来,我已经了解到当我添加新视图(MessageViewController的mvc.view)时,它默认放置在0,0。我不希望它在0,0,但似乎我必须在我希望它出现的位置设置一个框架 - 这在使用自动布局时似乎是错误的 - 或者将这个新视图添加到子视图或者为子视图设置高度,也许......虽然我可能会在这里谈论自己陷入黑暗的地方。

MessageViewController *mvc = [[MessageViewController alloc] init];
[mvc.view setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView *messageView = mvc.view;
[self.view addSubview:messageView];

UIView *messageViewMenu = self.messageViewMenu;

NSDictionary* views = NSDictionaryOfVariableBindings(messageViewMenu, messageView);

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[messageView]|"
                                                                    options:0
                                                                    metrics:nil
                                                                    views:views]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[messageView(200)]-[messageViewMenu]"
                                                                    options:0
                                                                    metrics:nil
                                                                    views:views]];
[self.view layoutSubviews]; // UPDATE - THIS IS THE CODE THAT WAS MISSING - IT DISPLAYS THE SUBVIEWS BEFORE THE ANIMATION STARTS. THANKS @RDELMAR 

[UIView animateWithDuration:0.9 animations:^{
                        _headerMessageConstraint.constant = 200;
                        [self.view layoutIfNeeded];
                        } completion:^(BOOL finished){}];

1 个答案:

答案 0 :(得分:3)

我不确定您要做什么,但是您需要在动画块上方添加[self.view layoutSubviews]行。在制作动画之前,主视图需要将新视图布置在其起始位置。

您还需要在" V中取出短划线:[messageView(200)] - [messageViewMenu]"如果你希望2个视图在彼此的顶部没有空间。