使用自动布局时如何获得正确的帧原点?

时间:2013-02-09 14:48:42

标签: macos cocoa nsview autolayout

使用Interface Builder我有一个带有多行NSTextField(标签)的NSView,并且在它下面是一个NSComboBox。由于标签的高度是动态的(例如,取决于所使用的平移),组合框的位置也是动态的(因为组合框的位置使用约束链接到标签)。

我试图在自动布局后获得组合框的正确位置。这样做一定很容易,但由于某种原因,我无法让它发挥作用。我可以使用[NSView fittingSize]获取标签的大小调整大小,但[NSView框架]返回错误的Y位置(它只返回IB中使用的位置)。所以我的问题基本上是如何在自动布局后重新定位框架?

仅供参考,我在覆盖的[NSView loadView]方法中请求frame属性。

感谢您的帮助!

2 个答案:

答案 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

希望它有所帮助。