2010-07-14 7 views
0

나는 끌어서 놓기보기에서 작업하고 웹에서 끌어서 놓기 작업을위한 일부 처리기를 발견했습니다. 드래그 앤 드롭 영역에서 파일을 드래그하고 드래그 앤 드롭 영역에서 나가면 다시 회색으로 바뀌므로 파란색으로 변합니다. 마우스 위로 드래그하거나 종료 할 때 업데이트되지 않는 문제가 있습니다. 코드의 Heres는 몇 가지 : 어떤 도움NSView가 업데이트되지 않습니까?

- (void)drawRect:(NSRect)rect 
{ 
    NSRect bounds = [self bounds]; 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:bounds]; 
} 

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    NSRect bounds = [self bounds]; 
    [[NSColor blueColor] set]; 
    [NSBezierPath fillRect:bounds]; 

    return NSDragOperationCopy; 

가}

- (void)draggingExited:(id <NSDraggingInfo>)sender { 
    NSRect bounds = [self bounds]; 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:bounds]; 

}

감사합니다.

답변

1

그리기는 그리기 위해 컨텍스트 (예 : 캔버스와 같은)가 설정된 경우에만 작동합니다. 프레임 워크가 -drawRect:을 호출하면 그리기 컨텍스트가 설정되어 있으므로 -[NSColor set]-[NSBezierPath fillRect:]과 같은 드로잉 명령이 예상대로 작동합니다.

-drawRect: 외부에는 일반적으로 그리기 컨텍스트가 설정되어 있지 않습니다. -drawRect: 외부에서 드로잉 명령을 사용하는 것은 공중에서 페인트 브러시를 흔드는 것과 같습니다. 캔버스가 없으므로 그림이 없습니다.

NSView는 그리기 컨텍스트를 정확하고 효율적으로 설정하기 위해 원치 않는 많은 작업을 수행하기 때문에 99.99 %의 케이스에서 모든 뷰 도면을 -drawRect: 내에 보관해야합니다.

-draggingEntered:-draggingExited: 방법으로보기의 그림을 어떻게 변경합니까? 부작용.

세 가지 경우 모두 동일한 작업을 수행합니다. 1) 색상 설정 및 2) 직사각형 그리기. 유일한 차이점은 각 방법의 색상 변경입니다. 그럼, 왜 당신과 같이, 바르와 -drawRect:에 사용하는 색상 제어하지 :.

- (void)drawRect:(NSRect)rect { 
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor]; 
    [color set]; 
    [NSBezierPath fillRect:rect]; 
} 

(나는 [self bounds]을 사용하지 않은주의 그것은이다 : -drawRect:에 다음

- (void)draggingEntered:(id <NSDraggingInfo>)sender { 
    drawBlueColorIvar = YES; 
    // ... 
} 

이 작업을 수행 가능한 경우 "더티 (dirty)"사각형으로 그릴 때 더 효율적입니다.)

마지막으로 drawBlueColorIvar가 변경 될 때보기가 다시 그리기해야하는지 프레임 워크에 알리는 방법이 필요합니다. 그것이 필요하다고 말하지 않으면 프레임 워크는 아무 것도 그려 내지 않을 것입니다. Chris Cooper가 말했듯이, [self setNeedsDisplay:YES]을 사용하면됩니다. 이것은 당신이 바꾸는 어떤 곳이라도 가야한다 drawBlueColorIvar.

+0

Im는 여전히 코코아에 조금 새로운 것이고, ivar에 대해 듣지 못했습니다. 내가 시도하고 컴파일 할 때 오류가 발생합니다 : 'drawBlueColorIvar'선언하지 않았기 때문에 논리적으로 보이는 (이 함수에서 첫 번째 사용) 선언되지 않았습니다. 나는 어떻게 ivar을 선언합니까? – nosedive25

+0

오, 알았어. 방금 NSColor * drawBlueColorIvar를 추가했다. 뷰 헤더에. 모든 도움에 감사드립니다! – nosedive25

2

[yourView: setNeedsDisplay] 어디로 전화 하시겠습니까?

하위 클래스를 drawRect:으로 메시지를 보내야한다는 것을 도면 프레임 워크에서 알 수 있도록하는 방법이므로 사물이 변경 될 때마다해야합니다. 귀하의 경우, 이것은 아마도 마우스가 드롭 영역으로 들어가거나 빠져 나올 때를 의미합니다.

+0

[self setNeedsDisplay : YES]를 추가했습니다. 각 그림 후에 그러나 운 없음. nslog를 추가하면 메소드가 트리거되고 있음을 알 수 있습니다. – nosedive25