2010-03-22 2 views
1

서브 뷰가 포함 된 사용자 정의 NSView가 있습니다.이 문제를 해결하기 위해 최상위 레벨보기는 단순히 컨테이너 역할을하며 자동으로 크기가 조정됩니다. 창문. 하위 뷰는 창 가장자리에서 10 픽셀 씩 삽입 된 사각형을 그립니다. 하단을 제외하고 전체 사각형을 표시하기 위해 크기가 조정될 때까지 창에 의해 잘 리게됩니다. 그러나 의도 한대로 동작하지 않고 수퍼 뷰의 높이가 높이보다 작 으면 사각형의 높이를 줄입니다. 어떻게 이것을 피하고 적절한 높이에 머무르게하고 superview가 더 작을 때 잘리는가?사용자 정의 NSView의 서브 뷰가 슈퍼 뷰에 맞게 크기 조정됩니다.

부모 뷰의 구현 코드는 다음과 같습니다

- (id)initWithFrame:(NSRect)frameRect { 
    self = [super initWithFrame:frameRect]; 
    if (self) { 
     subView = [[SubView alloc] initWithFrame:frameRect]; 
    } 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor grayColor] set]; 
    [subView setFrame:NSMakeRect(10, 10, dirtyRect.size.width - 20, 500)]; 
    [self addSubview:subView]; 
} 

- (BOOL)isFlipped { 
    return YES; 
} 

그리고 서브 뷰는 다음과 같습니다

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor blackColor] set]; 
    [NSBezierPath strokeRect:dirtyRect]; 
} 

- (BOOL)isFlipped { 
    return YES; 
} 

답변

2

ericgorr으로, autoResizingMask는 크기 조정 문제로주의를 기울여야한다.

그러나 하위보기를 drawRect에 추가하는 것으로 나타났습니다.이보기가 적합하지 않습니다. drawRect은 프로그램의 수명 동안 여러 번 호출되지만 addSubview:은 할 필요가 (만 한다)과 같이, 한 번만 호출 : [self bounds] 대신 dirtyRect

- (id)initWithFrame:(NSRect)frameRect { 
    self = [super initWithFrame:frameRect]; 
    if (self) { 
     subView = [[SubView alloc] initWithFrame:frameRect]; 
     [self addSubview:subView]; // this view now owns subView ... 
     [subView release];   // ... so we can release our copy 
    } 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor grayColor] set]; 
    [subView setFrame:NSMakeRect(10, 10, [self bounds].size.width - 20, 500)]; 
} 

참고도 사용. dirtyRect은 다시 그려야하는 영역을 설명하는 사각형입니다. 이것은 항상 뷰의 전체 경계 사각형이되는 것은 아닙니다. 반면에 [self bounds]은 다시 그려지는 부분에 관계없이 항상보기의 전체 범위를 나타냅니다.

+0

ericgorr의 답변에 대한 답변에서 언급했듯이 autoResizingMask를 사용하여 작동시키지 못했습니다. 'addSubview :'의 배치와'[self bounds]'를 사용하는 것에 대해, 저에게 알려 줘서 고마워요! 그건 의미가 있습니다. –

+0

이제 서브 뷰에서'dirtyRect' 대신에'[self bounds]'를 구현 했으므로, 다시 그릴 영역을 설명하는'dirtyRect'에 대한 설명에 비추어 볼 때 적절합니다. 감사합니다! –

+0

당신을 진심으로 환영합니다! 그것을 듣고 기쁘다 일했다. –

2

대부분의 가능성이 서브 뷰는 자동 크기 마스크를 가지고있다. NSViewNotSizable을 사용하여 -setAutoresizingMask :를 호출하여이를 지울 수 있습니다.

수퍼 그것의 파단의 크기를 조절하지 않아야하는 경우, 당신은 -setAutoresizesSubviews를 사용하여 고려할 수 : 지적

+0

내가 아는 한, 수퍼 뷰와 서브 뷰 모두에서 -setAutoresizingMask :와 NSViewNotSizeable을 사용하고 수퍼 뷰의 -setAutoresizesSubviews를 사용하지 않았다. 그것은 내가 시도한 것들의 모든 조합과 같은 방식으로 행동합니다. –

관련 문제