4

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

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

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

谢谢你的帮助!

4

2 回答 2

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

希望能帮助到你。

于 2013-10-28T14:30:09.830 回答
1

NSView 没有 loadView 方法。你是说 NSViewController 的 loadView 吗?如果是这样,我认为获得实际框架还为时过早。您可以尝试覆盖 updateConstraints 并在那里签入。在 iOS 中,您可以在 viewDidAppear 中执行此操作: -- 我不确定 OS X 的等效项是什么。另一种可能性是在 viewDidMoveToWindow 中。

于 2013-02-09T19:33:57.297 回答