Objective c 动画SearchField不会保留其新位置

Objective c 动画SearchField不会保留其新位置,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在为NSSearchField的位置设置动画,以便在窗口中移动。动画本身工作正常,但有时搜索字段不保留其新位置。我发现这与已为XIB启用自动布局有关,在iOS上,UIView需要一个名为LayoutIfNeed的函数 是否有类似于OSX应用程序的东西?我试过这个: [self.searchField updateConstraints]; [self.searchField layout]; 这似乎有效。。。差不多 在用户导航期间,搜索字段在隐藏和可见状态之间切换。当用户在这些状态之间切换

我正在为NSSearchField的位置设置动画,以便在窗口中移动。动画本身工作正常,但有时搜索字段不保留其新位置。我发现这与已为XIB启用自动布局有关,在iOS上,UIView需要一个名为LayoutIfNeed的函数

是否有类似于OSX应用程序的东西?我试过这个:

[self.searchField updateConstraints];
[self.searchField layout];
这似乎有效。。。差不多

在用户导航期间,搜索字段在隐藏和可见状态之间切换。当用户在这些状态之间切换时,一切正常,搜索字段保持在其新位置。 但是,当用户通过单击搜索字段设置焦点并前后导航时,搜索字段将显示在原来的位置

有人知道为什么会发生这种情况吗

更新

我刚刚为搜索字段的frame属性添加了一个观察者,以便查看帧何时再次更改。这正是我上面所描述的:当用户在视图之间切换时,一切都很好。但是,如果用户将焦点放在搜索字段上并切换视图,则帧将被设置回其原始值

我还尝试实现animationDidEnd:notification,并将帧显式设置为其新值。但这并不奏效

更新2

这是我用来设置搜索字段动画的代码:

NSMUTABLEARRY*array=[[NSMUTABLEARRY alloc]init]

// Set the properties for the search field animation
NSMutableDictionary *dictSearchFieldAnimation = [[NSMutableDictionary alloc] init];
dictSearchFieldAnimation[NSViewAnimationTargetKey] = self.searchField;
dictSearchFieldAnimation[NSViewAnimationStartFrameKey] = [NSValue valueWithRect:self.searchField.frame];

NSRect destinationFrame = self.searchField.frame;
destinationFrame.origin.y = self.searchResultView.frame.size.height + 15;
dictSearchFieldAnimation[NSViewAnimationEndFrameKey] = [NSValue valueWithRect:destinationFrame];
[array addObject:dictSearchFieldAnimation];

// Perform the animation
NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:array];
animation.delegate = self;
[animation setDuration:0.3];
[animation setAnimationCurve:NSAnimationEaseInOut];
[animation setAnimationBlockingMode:NSAnimationBlocking];
[animation startAnimation];

与-[UIView LayoutFneed]等效的OS X是-[NSView layoutSubtreeIfNeeded]。为了让我们帮助您,您必须展示如何设置和执行动画的代码。从症状来看,听起来像是在直接为帧设置动画。也就是说,您可能通过animator代理设置帧。使用自动布局时不应这样做。你必须调整约束,而不是框架。我通过粘贴代码更新了我的问题。是的,我正在调整框架。但是如何调整约束条件呢?我知道视图持有一个约束数组。但这是只读的。我刚刚检查了我的XIB,注意到视图已启用自动布局,但尚未设置任何约束。这会有什么影响吗?如果您为NIB启用自动布局,但不添加任何约束,那么Xcode将在构建时添加约束。但是,这些约束不一定会按照您或您的用户希望的方式进行操作。如果使用自动布局,则需要仔细设置约束,就像使用弹簧和支柱一样,需要仔细设置自动调整大小遮罩。NSVIEW动画是非常古老的学校。甚至在自动布局之前,它就被核心动画淘汰了。它肯定不能很好地与自动布局配合使用,因为它会设置框架。如果使用自动布局并添加约束,则可以使用插座访问它们。可以通过约束的animator代理设置约束的常量属性来实现某些动画。或者,您可以使用-layoutSubtreeIfNeeded强制视图布局,删除约束,添加新约束,调整其他约束的常数,或其他任何内容,然后在打开隐式动画的情况下再次强制在NSAnimationContext组内布局。