Window+ContentVIEw (SubvIEw of Window)++MyCustomVIEw (SubvIEw of ContentVIEw)++MyCustomOpaqueVIEw (SubvIEw of ContentVIEw)+++TextFIEld (SubvIEw of MyCustomOpaqueVIEw)
当用户单击TextFIEld时,其中的光标开始闪烁.
在每次闪烁时,在MyCustomVIEw上调用drawRect.没什么大不了的,但我想知道为什么?
在MyCustomOpaqueVIEw中,我实现了isOpaque,
- (BOol)isOpaque {return YES;}
如果传递给drawRect的NSRect被一个不透明的视图完全遮挡,我认为这会阻止消息传递给MyCustomVIEw中的drawRect,但是当光标闪烁时,MyCustomVIEw仍然会发送一个完全在不透明视图后面的NSRect的drawRect消息.
我错过了一个关键概念还是闪烁光标的怪癖?
解决方法 根据Josh Caswell的推荐,自行解决这个问题.我在Cocoaheads会议上询问了这个问题.我有一个建议来看看NSVIEw的hitTest.所以在我的两个自定义视图中,我重写了NSVIEw的hittest函数,如下所示:
- (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: %%@",[[self class] description],[[hitVIEw class] description]); return hitVIEw;}
以下是输出:
MyCustomVIEw是contentVIEw的子视图.
MyOpaqueCustomVIEw(OCV)是contentVIEw的子视图.
1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextFIEld1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextFIEld1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextVIEwMyCustomVIEw - Dirty Rect: {{49,189},{127,28} //!!Focus Ring Around Text FIEldOCV - Dirty Rect: : {{49,28}}testTextFIEld isOpaque? Yes1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextVIEwMyCustomVIEw - Dirty Rect: {{64,194},{1,17}}1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextVIEw1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextFIEld1 ENTER MyCustomVIEw - hitTest1 EXIT MyCustomVIEw - hitTest: MyCustomVIEwMyCustomVIEw - Dirty Rect: {{64,17}} //!!EVERY BlinkMyCustomVIEw - Dirty Rect: {{64,17}}MyCustomVIEw - Dirty Rect: {{64,17}}
MyCustomVIEw是contentVIEw的子视图.
MyOpaqueCustomVIEw(OCV)是MyCustomVIEw的子视图.
1 ENTER MyCustomVIEw - hitTest1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextFIEld1 EXIT MyCustomVIEw - hitTest: NSTextFIEld1 ENTER MyCustomVIEw - hitTest1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextFIEld1 EXIT MyCustomVIEw - hitTest: NSTextFIEld1 ENTER MyCustomVIEw - hitTest1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextVIEw1 EXIT MyCustomVIEw - hitTest: NSTextVIEwOCV - Dirty Rect: : {{49,28}} //!!FOCUS RINGtestTextFIEld isOpaque? Yes1 ENTER MyCustomVIEw - hitTest1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextVIEw1 EXIT MyCustomVIEw - hitTest: NSTextVIEw1 ENTER MyCustomVIEw - hitTest1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextVIEw1 EXIT MyCustomVIEw - hitTest: NSTextVIEw1 ENTER MyCustomVIEw - hitTest1 ENTER OCV - hitTest1 EXIT OCV - hitTest: NSTextFIEld1 EXIT MyCustomVIEw - hitTest: NSTextFIEld//!!BlinkING HERE - But no dirtyRects.
所以看起来对hitTest的响应定义了重绘的视图.
总结以上是内存溢出为你收集整理的objective-c – 为什么textfield中闪烁的光标会导致drawRect被调用?全部内容,希望文章能够帮你解决objective-c – 为什么textfield中闪烁的光标会导致drawRect被调用?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)