iOS setNeedsDisplay в нескольких регионах

У меня есть собственный вид, в котором нарисована клавиатура пианино. Каждая клавиша рисуется как отдельный вызов, так что я могу рисовать только те клавиши, которые нужно перерисовать. Вид поддерживает множественное касание, поэтому одновременно можно удерживать несколько клавиш.

Каждый ключ довольно дорого рисовать, поэтому я передаю определенную область в setNeedsDisplay при каждом обнаружении касания в представлении, чтобы избежать повторного рисования всего представления (что приводит к заметному запаздыванию).

Чтобы обработать несколько касаний, я перебираю набор полученных касаний, проверяю, находится ли каждое касание в одной из клавиш, и если да, обновляю его и вызываю setNeedsDisplay с прямоугольником этого ключа. Короче говоря, setNeedsDisplay вызывается несколько раз в одной функции, но каждый раз с другим прямоугольником.

Я ожидал, что drawRect будет вызываться несколько раз с разными грязными областями, однако, кажется, что если я нажму одновременно крайнюю левую и дальнюю правую клавиши, весь вид перерисовывается, а не только крайний левый и крайние правые клавиши (как, впрочем, все промежуточные клавиши перерисовываются без необходимости).

Что я могу сделать, чтобы достичь того, чего я хочу? Я хочу просто нарисовать клавиши, к которым прикоснулись, а не все клавиши между двумя грязными клавишами.

2 ответа

Решение

Я столкнулся с этим и разместил свой вопрос здесь.

Любопытно, что я также рисовал клавиатуру (с 88 клавишами). Я никогда не решал это и решил, что буду иметь дело с этим, если это окажется проблемой производительности (не оптимизируйте, пока вам это не понадобится и т. Д.). Одна вещь, которую я сделал, была при запуске, преобразовать эту клавиатуру по умолчанию в изображение и использовать ее в качестве основы, так что я рисовал только клавиши, которые были нажаты, а не всю клавиатуру. Быстрее нарисовать изображение, чем все эти вещи CGPath.

Я показывал ноты миди, когда они играли, и производительность была в порядке - так что, может быть, вам не нужно беспокоиться об этом прямо сейчас.

Система отправит вам один drawRect: сообщение за ход основного цикла выполнения, независимо от того, сколько раз вы звонили setNeedsDisplayInRect:, Он передает вам прямоугольник, который является, по крайней мере, "объединением" всех грязных каналов, которые вы передавали setNeedsDisplayInRect:, Система не позволяет точно определить, какие именно setNeedsDisplayInRect:,

Вы могли бы переопределить setNeedsDisplayInRect: сохранить массив грязных мест (вы найдете +[NSValue valueWithCGRect:] полезно), и очистить массив в drawRect:,

Вы можете создать свой собственный setNeedsDisplayForKey: метод, который хранит массив грязных ключей и вызовов setNeedsDisplay,

Другие вопросы по тегам