2011-03-09 2 views
5

내 프로그램에서 다음과 같은 뷰 계층 구조 설정이 있습니다.텍스트 필드의 깜박이는 커서로 인해 drawRect가 호출되는 이유는 무엇입니까?

Window 
+ContentView (Subview of Window) 
++MyCustomView (Subview of ContentView) 
++MyCustomOpaqueView (Subview of ContentView) 
+++TextField (Subview of MyCustomOpaqueView) 

사용자가 TextField를 클릭하면 내부의 커서가 깜박이기 시작합니다. 각 Blink에서 drawRect가 MyCustomView에서 호출됩니다. 큰 문제는 아니지만 왜 그런지 궁금합니다.

MyCustomOpaqueView에서

내가 지금처럼 isOpaque를 구현

- (BOOL)isOpaque {return YES;} 

나는 NSRect 완전히 불투명보기에 의해 가려의 drawRect에 전달하는 경우이 MyCustomView에서의 drawRect에 메시지를 차단하는 것이라고 생각하지만, 커서가 MyCustomView을 깜박 때

NSRect가 완전히 보이지 않는 drawRect 메시지를 보낸다.

핵심 개념이 누락되었거나 깜박이는 커서가 이상합니까?


+0

+1 : 좋은 조사! 이 문제를 해결 했으므로 문제를 "답이 없음"으로 표시되지 않도록 편집하고 답을 답장 해보십시오. –

+0

추천 한 내용을 수행 했습니까? – Tobias

답변

2

조쉬 캐스 웰 (Josh Caswell)의 추천에 따라 자동 해결.


나는 이것에 대해 CocoaHeads 회의에서 질문했다. NSView의 hitTest를 살펴볼 것을 제안했습니다. 그래서 모두 내 사용자 정의보기에, 그래서 같이 NSView의의 그러나 hitTest 기능을 오버라이드 :

MyCustomView이있는 contentView의 하위 뷰 : 아래

- (NSView*) hitTest:(NSPoint)aPoint { 
    static int depth = 1; 
    NSLog([NSString stringWithFormat:@"%%%dd ENTER %%@ - hitTest", depth], 
      depth, [[self class] description]); 
    depth++; 
    NSView *hitView = [super hitTest:aPoint]; 
    depth--; 
    NSLog([NSString stringWithFormat:@"%%%dd EXIT %%@ - hitTest: %%@", depth], 
      depth, [[self class] description], [[hitView class] description]); 
    return hitView; 
} 

가 출력됩니다.
MyOpaqueCustomView (OCV)는 contentView의 하위 뷰입니다.

1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextField 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextField 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextView 
MyCustomView - Dirty Rect: {{49, 189}, {127, 28} //!!Focus Ring Around Text Field 
OCV - Dirty Rect: : {{49, 189}, {127, 28}} 
testTextField isOpaque? Yes 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextView 
MyCustomView - Dirty Rect: {{64, 194}, {1, 17}} 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextView 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextField 
1 ENTER MyCustomView - hitTest 
1 EXIT MyCustomView - hitTest: MyCustomView 
MyCustomView - Dirty Rect: {{64, 194}, {1, 17}} //!!EVERY BLINK 
MyCustomView - Dirty Rect: {{64, 194}, {1, 17}} 
MyCustomView - Dirty Rect: {{64, 194}, {1, 17}} 
MyCustomView - Dirty Rect: {{64, 194}, {1, 17}} 

MyCustomView가있는 contentView의 하위 뷰이다.
MyOpaqueCustomView (OCV)는 MyCustomView의 하위 뷰입니다. 그러나 hitTest에 대한 응답은 전망이 다시 그려을 얻을 것이다을 정의처럼

1 ENTER MyCustomView - hitTest 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextField 
1 EXIT MyCustomView - hitTest: NSTextField 
1 ENTER MyCustomView - hitTest 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextField 
1 EXIT MyCustomView - hitTest: NSTextField 
1 ENTER MyCustomView - hitTest 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextView 
1 EXIT MyCustomView - hitTest: NSTextView 
OCV - Dirty Rect: : {{49, 189}, {127, 28}} //!!FOCUS RING 
testTextField isOpaque? Yes 
1 ENTER MyCustomView - hitTest 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextView 
1 EXIT MyCustomView - hitTest: NSTextView 
1 ENTER MyCustomView - hitTest 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextView 
1 EXIT MyCustomView - hitTest: NSTextView 
1 ENTER MyCustomView - hitTest 
1 ENTER OCV - hitTest 
1 EXIT OCV - hitTest: NSTextField 
1 EXIT MyCustomView - hitTest: NSTextField 
//!!BLINKING HERE - But no dirtyRects. 

그래서 그것은 본다.