2009-08-08 3 views
2

아래쪽보기에 NSScrollView가있는 NSSplitView가 있습니다. 문제는 내가 붕괴 한 다음 아래쪽보기를 다시 열 때 (축소되지 않음), 스크롤보기의 높이가 해당 밑면보기의 높이를 초과하여 스콜 뷰의 맨 위 부분이 잘리는 경우입니다. IB에서 모든 방향으로 자동 스크롤되도록 내 스크롤보기와 분할보기가 설정되어 있습니다. 축소되지 않은 상태에서 스크롤 뷰의 높이를 조정해야합니까, 아니면 크기 조정 속성을 잘못 설정 했나요? 아래는 클리핑이 어떻게 생겼는지에 대한 이미지입니다.NSSplitView를 접은 후에 내 뷰의 높이를 수정하려면 어떻게해야합니까?

접기 전에 다음

alt text

(클리핑되는 저면에 스크롤바 통지) 축소 후 다시 열

alt text

답변

0

동일한 문제가 있습니다. 각 뷰의 최대 및 최소 높이를 결정할 수있는 BWToolkit의 분할 뷰를 사용하여 수정했습니다.

+0

네, 실제로 내가 뭘했는지. BWToolkit의 분할 뷰에는 실제로 몇 가지 버그가 있었지만 버전 1.2.5에서 수정되었습니다. – Austin

4

문제는 그 사실에 기인 코코아 자동 크기 조정 규칙은 이전 상태에서 현재 상태로 델타를 스케일링하여 작동합니다. 마진 중 하나라도 0으로 설정되면 배율의 여러 가지 특성으로 인해 뷰가 커질수록 다시 스케일 업되지 않습니다.

이 문제를 해결하기위한 일반적인 접근 방법은 NSSplitView 대리자 메서드를 사용하여 분할 뷰가 작아지는 것을 방지 한 다음 축소 된 뷰를 내부적으로 최소화하는 최소 크기로 유지하는 것입니다.

여기에 split view documentation에 대한 링크가 있습니다.

사용자 경험에 대해 생각해 보면 특정 시점 아래로 크기가 조정 된 경우보기가 너무 복잡해져서보기가 겹치기 시작하고 내용이 너무 작아서보기 어려울 수 있습니다. 이 스냅 핑 - 축소 동작을 추가하면 두 가지 문제점을 해결할 수 있습니다.

예를보고 싶다면 Mac OS X의 Mail.app은 특정 높이가되면 인라인 메시지보기를 닫습니다. 당신은 그 행동을 모방해야합니다.

0

당신은 NSUserDefaults를 통해 일을, 아마도 .. 당신은 좌표를 할당 할 수있는 등 NSSplitView Subview Frames 같은 것들에 대한 키, 라 0.000000, 0.000000, 0.000000, 720.000000, NO

0

존 헤스가 문제를 설명 할 수 있지만 잘 (있다 "재설정"수 서브 뷰의 너비가 0이 되 자마자 자동 크기 조정 요소가 자동 크기 조정 요소에 대해 손실되는 경우) 솔루션은 모든 경우에 실제로 제공되지 않습니다. 서브 뷰를 축소 할 수 있기 때문에 너비를 제한하는 것이 도움이되지 않았습니다.

는 I는 splitView 위임 방법 -splitviewWillResizeSubviews을 실행함으로써, 허용 가능한 솔루션을 달성하도록 관리 : 상기 하위 뷰를 설정함으로써 최소 폭을 유지하기 위해 숨겨진 대신 0으로 수축 :

- (void)splitViewWillResizeSubviews:(NSNotification *)notification { 
     NSUInteger divider = [[[notification userInfo] valueForKey:@"NSSplitViewDividerIndex"] intValue]; 
     NSView *subview = nil; 
     if(divider == SPLITVIEW_DIVIDER_SIDEBAR) { 
      subview = (NSView*)[self.splitView.subviews objectAtIndex:SPLITVIEW_SIDEBAR_INDEX]; 
     } 
     if(subview) { 
      if(subview.frame.size.width < SPLITVIEW_MINIMUM_SIDEBAR_WIDTH) { 
       CGRect correctedFrame = subview.frame; 
       correctedFrame.size.width = SPLITVIEW_MINIMUM_SIDEBAR_WIDTH; 
       subview.frame = correctedFrame; 
       subview.hidden = YES; 
      } else { 
       subview.hidden = NO; 
      } 
     } 
    } 
관련 문제