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

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

为了处理多个触摸,我对接收到的触摸进行迭代,检查每个触摸是否在键之一内,如果是,则对其进行更新,并使用该键的矩形调用setNeedsDisplay。简而言之,setNeedsDisplay在一个函数中被多次调用,但是每次都使用不同的矩形。

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

我该怎么做才能实现自己想要的?我只想绘制触摸的键,而不是绘制两个脏键之间的所有键。

最佳答案

我遇到了这个问题,并发布了我的问题here

奇怪的是,我也在画一个键盘(有88个键)。我从未解决过该问题,并决定如果结果是一个性能问题(在需要等之前不要进行优化),我将对其进行处理。我所做的一件事是在启动时,将默认键盘渲染为图像并将其用作基础,因此我只绘制了被按下的键,而不是整个键盘。比所有CGPath东西更快地绘制图像。

我在演奏MIDI音符时表现出色,表现也不错-所以也许您现在不必担心@。

关于ios - iOS setNeedsDisplay在多个区域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11059914/

10-12 13:46