2012-09-20 2 views
2

저는이 말을 처음 접했고 올바른 용어를 모르기 때문에 제 질문을하기가 어렵습니다. 나는 약간의 객관적인 C 코딩을 했으므로 UI를 사용하는 것을 제외하고는 초보자를 약간 넘어선 다.윈도우 코코아 부분에 바둑판 식으로 배열 된 이미지를 만드는 방법

이 작업을 수행하는 최상의 방법, 즉 올바른 방법을 알고 싶습니다.

나는 상단에 몇 개의 버튼이있는 창이 있습니다. 그 아래에 이미지 또는 웹 뷰이있는 지역입니다. 이것은 가변적 인 크기가 될 것입니다. 그래서 멋지게 보이게하려면 그 뒤에있는 영역을 멋진 타일 패턴으로 만들고 싶습니다.

나는 몇 가지 작업을 실험했지만 모든 것이 조금은 해킹당하는 느낌이 들었습니다. 자동으로 바둑판 식 배경을 제공하고 그 안에 다른 컨트롤을 넣을 수있는 컨트롤이 있습니까? 그 문제에 관해서, 다른 컨트롤을 안에 넣을 수있는 컨트롤이 있습니까? (저는 GTK에서 익숙하지만 코코아에서는 일반적으로 보이지 않습니다)

또한 이미지가 위의 버튼을 기반으로 크기를 변경할 수 있다고 생각하면 핵심 애니메이션과 레이어를 사용해야합니까? 나는 그들에 대해 읽었지만 그들을 사용하지 않았다)? 이 작업을 수행하는

enter image description here

답변

1

한 아주 간단한 방법은 배경보기에 대한 사용자 지정 NSView의 서브 클래스를 사용하는 것입니다. -drawRect : 메서드에서 이미지를 가져 와서 뷰의 범위를 채우기 위해 반복적으로 그려주는 코드를 작성합니다. 이 작업을 수행하는 알고리즘은 매우 간단합니다. 왼쪽 상단 (또는 어떤 구석)에서 시작하여 이미지를 그린 다음 x 위치를 이미지 너비만큼 증가시키고 다시 그립니다. x 위치가 뷰의 최대 x 좌표를 초과하면 y를 이미지의 높이만큼 증가시키고 다음 행을 그리는 등 모든 것을 채울 때까지 계속됩니다. 이것은 트릭을해야합니다 :

@interface TiledBackgroundView : NSView 
@end 

@implementation TiledBackgroundView 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect bounds = [self bounds]; 
    NSImage *image = ... 
    NSSize imageSize = [image size]; 

    // start at max Y (top) so that resizing the window looks to be anchored at the top left 
    for (float y = NSHeight(bounds) - imageSize.height; y >= -imageSize.height; y -= imageSize.height) { 
     for (float x = NSMinX(bounds); x < NSWidth(bounds); x += imageSize.width) { 
      NSRect tileRect = NSMakeRect(x, y, imageSize.width, imageSize.height); 
      if (NSIntersectsRect(tileRect, dirtyRect)) { 
       NSRect destRect = NSIntersectionRect(tileRect, dirtyRect); 
       [image drawInRect:destRect 
         fromRect:NSOffsetRect(destRect, -x, -y) 
         operation:NSCompositeSourceOver 
         fraction:1.0]; 
      } 
     } 
    } 
} 

@end 
+0

그러면 TiledBackgroundView로 무엇을 할 수 있습니까? IB로 창 위에 놓은 상자입니까, 아니면 전체 창을 서브 클래 싱하는 상자입니까? 어떤 경우, 배경 이미지 만 창의 일부분을 채우게합니까? – newz2000

+0

창의 내용보기로 만들어야합니다. 인터페이스 빌더에서 창에 대한 펼침 삼각형을 확장하십시오. 직접적으로 그 밑에는 창의 내용보기 인보기가됩니다. 클래스 인스펙터에서 뷰의 클래스를 NSView에서 TiledBackgroundView로 변경합니다. –

+0

감사합니다.이 답을 읽은 후에 내가 무엇을 검색해야할지 알았 기 때문에이 문서와 함께이 대답이 도움이되었습니다. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaViewsGuide/SubclassingNSView/SubclassingNSView.html – newz2000

0

컨트롤이 자동으로 배경을 바둑판 식으로 배열하지 않습니다.

NSView (일반적으로 서브 클래스)은 모든 그림을 처리합니다. 예를 들어 회색 영역은 NSView의 하위 클래스가 될 수 있으며 그 내부에 이미지를 넣을 수 있습니다.

실제로 타일 된 이미지 (NSView 하위 클래스로)를 그리려면 Madsen의 방법을 사용할 수 있지만 가장 편리하지는 않습니다.

NSColor *patternColor = [NSColor colorWithPatternImage:[NSImage imageNamed:@"imageName"]]; 
[patternColor setFill]; 
NSRectFill(rectToDraw); 

당신이 사용자 정의 뷰 클래스의 -drawRect: 방법에 넣어해야하는 가장 쉬운 방법은의 라인을 따라 무언가이다. 바둑판 식으로 표시된 이미지를 나타내는 NSColor을 만듭니다. 스크롤/클립보기의 하위 클래스 일 수도 있습니다.

Core Animation에 너무 익숙하지 않지만보기 조작에 유용하며보기와 관련하여보고 싶은 방향 일 수 있습니다. 이미지 그리기 (그리고 그보기 만).

관련 문제