使用Interface Builder我有一个带有多行NSTextField(标签)的NSView,并且在它下面是一个NSComboBox。由于标签的高度是动态的(例如,取决于所使用的平移),组合框的位置也是动态的(因为组合框的位置使用约束链接到标签)。
我试图在自动布局后获得组合框的正确位置。这样做一定很容易,但由于某种原因,我无法让它发挥作用。我可以使用[NSView fittingSize]获取标签的大小调整大小,但[NSView框架]返回错误的Y位置(它只返回IB中使用的位置)。所以我的问题基本上是如何在自动布局后重新定位框架?
仅供参考,我在覆盖的[NSView loadView]方法中请求frame属性。
感谢您的帮助!
答案 0 :(得分:1)
NSView没有loadView方法。你的意思是NSViewController的loadView吗?如果是这样的话,我认为现在到达实际框架还为时过早。您可以尝试覆盖updateConstraints并在那里签入。在iOS中你可以在viewDidAppear中执行此操作: - 我不确定OS X的等价物是什么。另一种可能性是viewDidMoveToWindow。
答案 1 :(得分:1)
你云观察你的NSView的框架:
@implementation MyViewController {
BOOL _isViewFrameKVORegistered;
}
- (void)loadView
{
[super loadView];
[self registerViewFrameKVO];
}
- (void)willChangeViewFrame
{
NSLog(@"will change frame");
}
- (void)didChangeViewFrame
{
NSLog(@"did change frame");
}
# pragma mark KVO
- (void)registerViewFrameKVO {
[self addObserver:self forKeyPath:@"view.frame" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionPrior context:NULL];
_isViewFrameKVORegistered = YES;
}
- (void)unregisterViewFrameKVO {
[self removeObserver:self forKeyPath:@"view.frame"];
_isViewFrameKVORegistered = NO;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"view.frame"]) {
if ([change[@"notificationIsPrior"] boolValue]) {
[self willChangeViewFrame];
} else {
[self didChangeViewFrame];
}
}
}
- (void)dealloc
{
[self unregisterViewFrameKVO];
}
@end
希望它有所帮助。