setNeedsDisplayInRect 小议

讨论了使用Objective-C编程中NSWindow和UIView如何通过setNeedsDisplayInRect:方法实现视图区域的动态标记及重绘。文章强调了在特定区域执行绘图操作时的优化策略,包括维护自定义的NSRectivar来控制实际绘制区域,并在drawRect:方法中进行交集测试以决定是否允许执行绘图代码。通过这种方法,可以实现只有指定区域在特定触发事件后被绘制,提高了应用的性能和资源利用效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-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了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值