2011-10-22 3 views
2

나는이 특정 문제와 관련하여 아무 것도 모색하지 않았으며 아무 것도 발견하지 못했습니다. 세로 형 NSSplitView 창이 있습니다. splitview의 오른쪽 뷰 내에서 NSBox 객체가 뷰의 내용을 채우도록 설정되어 있습니다. setContentView를 사용하여 사용자 정의 닙에서로드 중입니다. 뷰에서 splitview의 오른쪽에있는 NSBox로 바꿉니다. 내 사용자 정의보기에서 NSImage를 사용하여 배경을 패턴 화하는 NSColor 객체로 뷰를 채우기 위해 노력하고 있습니다. 이 모든 것은 예상대로 작동합니다.setPatternPhase와 관련된 문제 : colorWithPatternImage를 사용하는 NSColor의 NSSplitView에서 :

[[NSGraphicsContext currentContext] saveGraphicsState]; 
[[NSGraphicsContext currentContext] setPatternPhase: NSMakePoint([self bounds].origin.x, 
                   [self bounds].size.height)]; 
[[self leatherColor] set]; 
NSRectFill([self bounds]); 

[[NSGraphicsContext currentContext] restoreGraphicsState]; 

패턴이 NSBox의 상단 좌측 모서리에 일정하게 유지하기 위해 나타납니다 의도 : 왼쪽 상단 모서리에 패턴의 위상을 설정 http://www.mere-mortal-software.com/blog/details.php?d=2007-01-08 :이 기사에 기반 코드를 사용하고 보기가 예상되는 동작처럼 크기가 조정될 때 (splitview 이동 또는 창 자체 크기 조정을 통해). 필자는 창과 사용자 정의보기가있는 빼낸 테스트 응용 프로그램에서이를 구현했으며 예상대로 작동합니다.

그러나 splitview를 사용하는 프로젝트에서 patternPhase가 splitview의 오른쪽 절반 상단 왼쪽 모서리 대신 전체 창의 왼쪽 상단 모서리에 설정되어있는 것처럼 동작합니다 (즉, 함께 이동해야 함). splitview 크기 조정) 그것은 "그것으로 이동하는 대신에 더 큰 이미지를 드러내는 것처럼 행동합니다. 이것은 여러 좌표 공간이있는 문제입니다. NSSplitView의 좌표가 어떻게 작동하는지 또는 뷰와 관련이 있는지 오해합니다. NSGraphicsContext의 문서에서 setPatternPhase : 메소드에 다음과 같이 말합니다 : "예를 들어, 패턴 위상을 (2,3)으로 설정하면 패턴 셀 타일링의 시작을 점 (2,3)으로 이동하는 효과가 있습니다. 기본 사용자 공간 "이 될 것입니다. 기본 사용자 공간은 내 사용자 정의보기의 범위와 일치합니까, 아니면 내가 포인트 기반으로 사용자 정의보기를 만들 수 있습니까? n 오른쪽 뷰 세트의 좌표와 setPatternPhase는 spitview의 전체 너비 (왼쪽 절반 포함)에 대해 그것을 구현합니까?

제공 할 수있는 제안/조언/도움을 주시면 대단히 감사하겠습니다.

편집 : 당신이 동작을 볼 수 있도록 나는 프로젝트의 복사본을 업로드 한 : http://dl.dropbox.com/u/6679821/ViewSwitcher.zip

답변

6

당신은보기 창에 앉아 위치에 따라 위상을 조정해야합니다. 이처럼 보이도록 -drawRect:을 수정할 것입니다 귀하의 경우에는

@implementation NSView (RKAdditions) 
- (void)rk_drawPatternImage:(NSColor*)patternColor inRect:(NSRect)rect 
{ 
    [self rk_drawPatternImage:patternColor inBezierPath:[NSBezierPath bezierPathWithRect:rect]]; 
} 


- (void)rk_drawPatternImage:(NSColor*)patternColor inBezierPath:(NSBezierPath*)path 
{ 
    [NSGraphicsContext saveGraphicsState]; 

    CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]); 
    CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]); 
    [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)]; 

    [patternColor set]; 
    [path fill]; 
    [NSGraphicsContext restoreGraphicsState]; 
} 

@end 

:

-(void) drawRect: (NSRect)dirtyRect 
{ 
    [self rk_drawPatternImage:[self leatherColor] inRect:self.bounds]; 
} 
+1

이 완벽하게 작동 나는 NSView에이 범주를 사용합니다. 훌륭한 답변을 게시하는 데 시간을내어 주셔서 감사합니다. 명확성을 위해서 setPatternPhase는 호출 된 뷰가 아닌 윈도우의 좌표계에서 작동합니까? – Gouldsc

+2

맞습니다. –