2013-02-09 4 views
4

Interface Builder 사용 NSView에 NSTextField (레이블)가 여러 개 있고 그 바로 아래에 NSComboBox가 있습니다. 라벨의 높이가 동적이므로 (예 : 사용되는 번역에 따라) 콤보 상자의 위치는 동적입니다 (콤보 상자의 위치가 제약 조건을 사용하여 라벨에 연결됨).자동 레이아웃을 사용할 때 정확한 프레임 원점을 얻는 방법은 무엇입니까?

자동 레이아웃 후 콤보 상자의 정확한 위치를 얻으려고합니다. 그렇게하기는 매우 쉬워야하지만 어떤 이유로 나는 이것을 작동시키지 못합니다. [NSView fittingSize]를 사용하여 라벨의 크기를 조절할 수 있지만 [NSView frame]이 잘못된 Y 위치를 반환합니다 (IB에서 사용 된 위치 만 반환 함). 그래서 내 질문은 기본적으로 자동 레이아웃 후 재배치 된 프레임을 얻는 방법입니까?

참고로, 필자는 덮어 쓰기 된 [NSView loadView] 메소드에서 프레임 속성을 요청하고 있습니다.

도움 주셔서 감사합니다.

답변

1

NSView에는 loadView 메소드가 없습니다. NSViewController의 loadView를 의미 했습니까? 그렇다면 실제 프레임을 얻는 것은 너무 이른 것 같습니다. updateConstraints를 재정의하고 거기에 체크인 해보십시오. iOS에서는 viewDidAppear에서이 작업을 수행 할 것입니다. - OS X가 무엇인지 모릅니다. 다른 가능성은 viewDidMoveToWindow에있을 수 있습니다.

@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 

는 희망이 도움이 :

+0

viewDidMoveToWindow와 updateConstraints를 모두 사용해 보았지만 불행하게도 프레임 원점은 동일하게 유지됩니다. 지금은 자동 레이아웃을 그대로 사용하기로 결정했습니다. 앞으로도 다시 살펴 보겠습니다. 그래도 도와 ​​줘서 고마워. –

1

당신은 당신의 NSView의의 프레임을 관찰 구름.

관련 문제