objective-c – 为什么textfield中闪烁的光标会导致drawRect被调用?

objective-c – 为什么textfield中闪烁的光标会导致drawRect被调用?,第1张

概述我的程序中有以下视图层次结构设置. Window+ContentView (Subview of Window)++MyCustomView (Subview of ContentView)++MyCustomOpaqueView (Subview of ContentView)+++TextField (Subview of MyCustomOpaqueView) 当用户单击TextFi 我的程序中有以下视图层次结构设置.

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被调用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1010047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存