setNeedsDisplayInRect 小议

来源:互联网 发布:淘宝购物车不能用 编辑:程序博客网 时间:2024/06/06 10:40
-setNeedsDisplayInRect: 确实可以做到将receiver的指定区域mark成dirty,然后在导致对该区域的重绘。 
 
但是如果我对LZ的需求没有理解错的话,LZ是希望自己不指定的区域压根就不被绘制出来。当且仅当调用了某个方法以后,这个区域才把数据绘制出来。 
 
假定我的理解没有错误,-setNeedsDisplayInRect: 是没有办法满足这种需求的。 
 
因为-setNeedsDisplayInRect:仅仅只是mark了程序员已知的dirty区域,但是NSWindow本身还会根据view的层次结构、clip关系,为每个view算出一个最终的redraw区域,然后作为参数发给drawRect:。这个区域一般来说是你-setNeedsDisplayInRect:所指定区域的超集。因此当NSWindow认为你整个view都需要重绘的时候,-setNeedsDisplayInRect:满足不了你的需求。 
 
在这种情况下,我建议LZ自己维护一个或一组NSRect的ivar,然后在-drawRect:里做intersection测试。例如,当-drawRect:传进来的NSRect和你的ivar NSRect做intersection测试成功的时候,允许执行绘图的代码,不然的话就return了。
原创粉丝点击