0

我有一个自定义视图,其中有一个钢琴键盘。每个键都作为单独的调用绘制,因此我只能绘制需要重绘的键。该视图支持多点触控,因此可以同时按住多个键。

每个键的绘制都有些昂贵,因此每当在视图上检测到触摸时,我都会将特定区域传递给 setNeedsDisplay 以避免重新绘制整个视图(这会产生明显的延迟)。

为了处理多个触摸,我遍历接收到的触摸集合,检查每个触摸是否在一个键内,如果是,更新它并使用该键的矩形调用 setNeedsDisplay。简而言之,在一个函数中多次调用 setNeedsDisplay,但每次使用不同的 rect。

我期望的行为是 drawRect 将被调用多次不同的脏区域,但是,似乎如果我同时按下最左边和最右边的键,则重新绘制整个视图,而不仅仅是最左边和最右边的键(如中间的所有键都被不必要地重绘)。

我能做些什么来实现我想要的?我只想绘制被触摸的键,而不是两个脏键之间的所有键。

4

2 回答 2

3

drawRect:无论您调用多少次,系统都会在主运行循环的每一轮向您发送一条消息setNeedsDisplayInRect:。它传递给您的 rect 至少是您传递给的所有脏 rect 的“联合” setNeedsDisplayInRect:。系统无法准确找出传递给 的 rect setNeedsDisplayInRect:

您可以覆盖setNeedsDisplayInRect:以保留脏矩形数组(您会发现+[NSValue valueWithCGRect:]有用),并清除drawRect:.

您可以创建自己的setNeedsDisplayForKey:方法来保存一系列脏键和调用setNeedsDisplay

于 2012-06-16T02:22:20.797 回答
1

我遇到了这个问题并在这里发布了我的问题。

奇怪的是,我还画了一个键盘(有 88 个键)。我从来没有解决它,并决定如果它被证明是一个性能问题我会处理它(在你需要之前不要优化等等)。我做的一件事是在启动时,将默认键盘渲染为图像并将其用作基础,这样我只绘制了被按下的键,而不是整个键盘。绘制图像比所有 CGPath 的东西更快。

我在播放时显示了 MIDI 音符,性能很好 - 所以也许你现在不需要担心@这个。

于 2012-06-16T01:19:50.307 回答