0

我有一个NSViewxib,其中包含一个NSTextField和一个 custom NSView。我使用了约束,这样当父视图调整大小时,子视图也会这样做。到目前为止,一切都很好。在命令期间,用户可以显示第三个子对象,这意味着我需要将其他两个视图向下移动以适应它。这在我的动画(我正在使用NSAnimationContext)期间工作正常,但是视图调整大小的那一刻,孩子们都根据约束迅速回到他们的位置,而忽略了我已经改变frame.origin.yorframe.size.height值的事实。

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

4

3 回答 3

1

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

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

当您更改约束以匹配您添加的新视图,然后为新位置设置动画时,请执行以下操作:

[UIView animateWithDuration:duration animations:^{[containingView layoutIfNeeded];}];
于 2013-05-30T12:22:08.767 回答
1

您可以为某些约束创建 IBOutlets。因此,您可以调整它们的常量(您可以在约束中更改的唯一内容)或通过删除旧约束并添加新约束来重新布局您的视图。

于 2013-05-30T12:48:31.483 回答
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]属性直接设置动画,因此必须通过设置帧的动画来实现,然后在动画完成后更改约束。

于 2013-05-30T13:04:20.040 回答