调整使用约束设计的视图的大小

时间:2013-05-30 11:25:39

标签: objective-c cocoa user-interface interface-builder constraints

我有一个NSView xib,其中包含NSTextField和自定义NSView。我已经使用了约束,这样当父视图调整大小时,子视图也会调整大小。到现在为止还挺好。在命令期间,用户可以显示第三个子对象,这意味着我需要将其他两个视图向下移动以适应它。这在我的动画期间工作正常(我正在使用NSAnimationContext),但是在调整视图大小的过程中,孩子们都会根据约束重新回到他们的位置,而忽略了我已经更改frame.origin.yframe.size.height值的事实。

如何设计允许使用约束的用户界面,但同时允许我以编程方式调整UI元素的相对位置?

3 个答案:

答案 0 :(得分:1)

如果您对子视图使用约束,那么您说您将这些视图的位置和大小委派给运行时。如果您尝试以编程方式更改这些值,您会发现事情会中断。

所以你需要做的就是改变约束,而不是改变那些值。

如果您更改了约束以匹配您添加的新视图,那么要设置新位置的动画,请执行以下操作:

[UIView animateWithDuration:duration animations:^{[containingView layoutIfNeeded];}];

答案 1 :(得分:1)

您可以针对某些约束制作IBOutlet。因此,您可以调整它们的常量(您可以在约束中更改的唯一内容)或通过删除旧的并添加新约束来重新显示您的视图。

答案 2 :(得分:0)

按照silvansky的回答,我解决了以下问题:

const NSInteger offset = _textField.frame.size.height + 8;
NSRect newGridFrame = _grid.frame;
newGridFrame.size.height += show ? -offset : offset;

[NSAnimationContext beginGrouping];
[NSAnimationContext currentContext].completionHandler = ^(void)
{
    _gridTopSpaceConstraint.constant += show ? offset : -offset;
    _textField.hidden = !show;
    _showingAddCategoryTextField = show;
};
[_grid.animator setFrame:newGridFrame];
[NSAnimationContext endGrouping];

我无法将[NSLayoutConstraint constant]属性直接设置为动画,因此必须通过设置框架动画来完成,然后在动画完成后更改约束。