我有一个NSView
xib,其中包含NSTextField
和自定义NSView
。我已经使用了约束,这样当父视图调整大小时,子视图也会调整大小。到现在为止还挺好。在命令期间,用户可以显示第三个子对象,这意味着我需要将其他两个视图向下移动以适应它。这在我的动画期间工作正常(我正在使用NSAnimationContext
),但是在调整视图大小的过程中,孩子们都会根据约束重新回到他们的位置,而忽略了我已经更改frame.origin.y
或frame.size.height
值的事实。
如何设计允许使用约束的用户界面,但同时允许我以编程方式调整UI元素的相对位置?
答案 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]
属性直接设置为动画,因此必须通过设置框架动画来完成,然后在动画完成后更改约束。