我有一个自定义视图,里面有一个钢琴键盘。每个键都是作为单独的调用绘制的,因此我只能绘制需要重绘的键。该视图支持多次触摸,因此可以同时按下多个键。
每个键的绘制都有些昂贵,因此每当在视图上检测到触摸时,我都会将特定区域传递给setNeedsDisplay,以避免重新绘制整个视图(这会产生明显的延迟)。
为了处理多个触摸,我迭代接收到的触摸集,检查每个触摸是否在其中一个键内,如果是,则更新它并使用该键的矩形调用setNeedsDisplay。简而言之,setNeedsDisplay在一个函数中被多次调用,但每次都使用不同的rect。
我期望的行为是drawRect会被不同的脏区域多次调用,但是,如果我同时按下最左边和最右边的键,整个视图会重新绘制,而不是仅仅最左边和最右边的键(如同,中间的所有键都被不必要地重新绘制)。
我能做些什么来达到我想要的目标?我想绘制触摸的键,而不是两个脏键之间的所有键。
答案 0 :(得分:3)
无论您拨打drawRect:
多少次,系统都会在主回路的每回合发送一条setNeedsDisplayInRect:
条消息。它会传递一个rect,它至少是您传递给setNeedsDisplayInRect:
的所有脏行的“联合”。系统无法准确找出传递给setNeedsDisplayInRect:
的确切内容。
您可以覆盖setNeedsDisplayInRect:
以保留一系列脏请求(您会发现+[NSValue valueWithCGRect:]
有用),并清除drawRect:
中的数组。
您可以创建自己的setNeedsDisplayForKey:
方法,该方法保留一系列脏密钥并调用setNeedsDisplay
。
答案 1 :(得分:1)
我遇到了这个并发布了我的问题here。
奇怪的是,我还在画一个键盘(88键)。我从来没有解决它,并决定如果它成为一个性能问题我会处理它(不要优化,直到你需要等)。我做的一件事是在启动时,将默认键盘渲染成图像并将其用作基础,这样我只绘制了按下的键而不是整个键盘。绘制图像的速度比CGPath的所有内容都快。
我正在播放midi音符,演奏也很好 - 所以也许你现在不需要关注@。