2014-11-03 3 views
2

분할 자 0을 드래그하면 나누기 1 (하위 뷰 1의 너비가 고정되어있는 동안 하위 뷰 2 압축)이되도록 메일과 유사한 NSSplitView를 구현하고 싶습니다.3 개의 창을 사용하여 NSSplitView에 자동 레이아웃 제약 조건을 구성하는 방법

----------------- 
| | |  | 
| 0 | 1 | 2 | 
| | |  | 
| | |  | 
----------------- 

지금까지 자동 레이아웃이 적용된 단일 NSSplitView를 사용해 보았습니다.

나는 계기와 가진 문제를 검사하는 것을 시도했다. 특정 시점 (스크린 샷의 # 783)이 지나면 제약 조건이 계속 유지 될만큼 높은 우선 순위를 갖지 않는 것처럼 보입니다.

enter image description here

전에 유사한 구성에 NSSplitView은 성공적이 있나요?

일반적으로이 문제를 디버그하기위한 조언이 있습니까?

중첩 된 NSSplitView를 사용하여이 동작을 구현하는 것이 좋습니다. 하지만 어떻게 하나의 NSSplitView를 사용하여이 작업을 수행 할 수 있는지 확인하고 싶습니다.

감사로드

My test code is here

+0

"NSSplitViewDelegate Protocol"을 보았습니까? Interface Builder의 우선 순위 설정을 통해서만 행동을 취할 수는 없습니다. 프로토콜은 하위 뷰의 크기와 분할 위치를 사용자 정의 할 수있는 몇 가지 추가 기회를 제공합니다. –

+0

동의합니다. 지난 며칠 동안 자동 레이아웃으로 어려움을 겪었습니다. 나는 문제의 일부를 풀 수 있지만, 그렇지 않은 것이 하나 있습니다 ... – billibala

답변

0

나는 지난 몇 일에 한 조사를 공유하고 싶어를 (같은 "주의"응용 프로그램은 하나의 NSSplitView 이루어집니다 모양). NSSplitView가 부분적으로 원하는 방식으로 동작 할 수있게되었습니다. 아직 완벽한 해결책은 아닙니다. 그러나 누군가가 내가 할 수없는 부분에 대한 대답을 도울 수 있기를 바랍니다.

"메모"앱은 단일 NSSplitView를 사용합니다.

enter image description here

위의 스크린 샷은 엑스 코드 6 Veiw 디버거 모드로 실행 "참고 사항"응용 프로그램을 보여줍니다.

NSSplitView의 MainSplitView라는 하위 클래스입니다.

디바이더 크기를 조정할 때 "Notes"앱의 분할보기가 원하는 방식으로 작동하는 방법을 연구하려면 Xcode Instruments의 "Cocoa Layout"도구로 열어 디바이더 0을 오른쪽으로 움직일 때 제약 이벤트를 연구하십시오.

enter image description here

내가 큰 차이가 있음을 발견

enter image description here

... 구속 이벤트를 공부하고 로그 내 샘플 응용 프로그램의 원래 버전을 실행 생성과 비교 ... 분할보기의 왼쪽 가장자리가있는 가장 오른쪽의 하위보기와 "메모"앱의 "낮은"우선 순위 사이의 제약이 있습니다. 유사한 제약 조건이 샘플 애플리케이션에서 "필수"우선 순위를가집니다.

그래서, 내 자신의 MainSplitView를 구현하려고했습니다. 낮은 우선 순위가 제약 조건에 설정되도록 "addConstraints :"메서드를 재정의하십시오.

- (void)addConstraints:(NSArray *)constraints { 
    NSLog(@"adding constraints: %@", constraints); 
    NSLayoutConstraint * theConstraint = constraints.firstObject; 
    if (theConstraint.firstItem == self.subviews.lastObject && theConstraint.secondItem == self) { 
     theConstraint.priority = NSLayoutPriorityDefaultLow; 
     [super addConstraints:@[theConstraint]]; 
    } else { 
     [super addConstraints:constraints]; 
    } 
    NSLog(@"========== constraings affecting layout ==========="); 
    for (NSView * theView in self.subviews) { 
     NSLog(@"view: %@\n%@", theView, [theView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]); 
    } 
} 

코드 here을 찾을 수 있습니다.

변경 후 내 샘플 앱, 구분선 0을 드래그하면 가운데 서브 뷰가 오른쪽으로 밀리고 너비가 유지되어 맨 오른쪽 뷰가 압축됩니다.

하지만 지금은 ... 나는 또 다른 문제로 실행 ...

enter image description here

내가 분할 공을 이동 때마다, 그것을 할 수있는 유일한 이동, 최대, 분할 1.

의 시작 위치에

다른 제약 조건 구성 문제입니까? 또는 NSSplitView의 다른 초기 동작을 사용자 정의해야합니까?

도움이 필요하십니까?

감사 빌

+0

이것을 알아낼 수 있었습니까? 나는 같은 문제에 비틀 거렸다. – mdiep

+0

도움이 될 수 있습니다 ... https://github.com/billibala/SplitViewExample – billibala

1

이에 대한 자동 레이아웃이 필요하지 않습니다. NSSplitView는 서브 뷰에 대한 "우선 순위 유지"개념을 가지고 있습니다. 보기 2의 보류 우선 순위를 0과 1보다 작게 설정해야합니다.