2011-03-09 15 views
5

मेरे पास मेरे कार्यक्रम में निम्न दृश्य पदानुक्रम सेटअप है।टेक्स्टफील्ड में चमकते कर्सर को क्यों आकर्षित किया जाता है?

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

जब उपयोगकर्ता टेक्स्टफ़िल्ल्ड पर क्लिक करता है तो इसके अंदर कर्सर झपकी शुरू होता है। प्रत्येक ब्लिंक drawRect पर MyCustomView पर कॉल किया जाता है। कोई बड़ा सौदा नहीं, लेकिन मैं सोच रहा हूं क्यों?

MyCustomOpaqueView में मैं बहुत की तरह isOpaque लागू,

- (BOOL)isOpaque {return YES;} 

मुझे लगा कि यह MyCustomView में drawRect को संदेशों को ब्लॉक होगा अगर NSRect drawRect के लिए पारित किया पूरी तरह से एक अपारदर्शी दृश्य के कारण अस्पष्ट हो, लेकिन अभी भी कर्सर MyCustomView ब्लिंक जब पूरी तरह से एक अपारदर्शी दृश्य के पीछे एक NSRect के साथ drawRect संदेश भेजा जाता है।

क्या मुझे एक महत्वपूर्ण अवधारणा याद आ रही है या क्या यह चमकते कर्सर का एक कर्कश है?


+0

+1: अच्छी जांच! चूंकि आपने इसे हल कर लिया है, कृपया समाधान को उत्तर में संपादित करने और डालने पर विचार करें ताकि प्रश्न "अनुत्तरित" में दिखाई न दे। –

+0

क्या आपने सिफारिश की थी। – Tobias

उत्तर

2

जोश कैसवेल द्वारा अनुशंसा पर इस उत्तर को स्वयं हल करना।


मैंने कोकोहेड्स मीटिंग में इसके बारे में पूछा। मुझे NSView के हिटटेस्ट को देखने के लिए एक सुझाव मिला। तो दोनों मेरे कस्टम दृश्य पर, मैं इतना की तरह NSView के hitTest समारोह overrode:

MyCustomView contentView की subview है:

- (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 की subview है।
MyOpaqueCustomView (OCV) MyCustomView का सबव्यूव है।

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. 

तो यह लग रहा है hitTest के जवाब को परिभाषित करता है की तरह क्या विचारों दोबारा बनाई मिल जाएगा।

संबंधित मुद्दे