iOS setNeedsDisplay в нескольких регионах
У меня есть собственный вид, в котором нарисована клавиатура пианино. Каждая клавиша рисуется как отдельный вызов, так что я могу рисовать только те клавиши, которые нужно перерисовать. Вид поддерживает множественное касание, поэтому одновременно можно удерживать несколько клавиш.
Каждый ключ довольно дорого рисовать, поэтому я передаю определенную область в setNeedsDisplay при каждом обнаружении касания в представлении, чтобы избежать повторного рисования всего представления (что приводит к заметному запаздыванию).
Чтобы обработать несколько касаний, я перебираю набор полученных касаний, проверяю, находится ли каждое касание в одной из клавиш, и если да, обновляю его и вызываю setNeedsDisplay с прямоугольником этого ключа. Короче говоря, setNeedsDisplay вызывается несколько раз в одной функции, но каждый раз с другим прямоугольником.
Я ожидал, что drawRect будет вызываться несколько раз с разными грязными областями, однако, кажется, что если я нажму одновременно крайнюю левую и дальнюю правую клавиши, весь вид перерисовывается, а не только крайний левый и крайние правые клавиши (как, впрочем, все промежуточные клавиши перерисовываются без необходимости).
Что я могу сделать, чтобы достичь того, чего я хочу? Я хочу просто нарисовать клавиши, к которым прикоснулись, а не все клавиши между двумя грязными клавишами.
2 ответа
Я столкнулся с этим и разместил свой вопрос здесь.
Любопытно, что я также рисовал клавиатуру (с 88 клавишами). Я никогда не решал это и решил, что буду иметь дело с этим, если это окажется проблемой производительности (не оптимизируйте, пока вам это не понадобится и т. Д.). Одна вещь, которую я сделал, была при запуске, преобразовать эту клавиатуру по умолчанию в изображение и использовать ее в качестве основы, так что я рисовал только клавиши, которые были нажаты, а не всю клавиатуру. Быстрее нарисовать изображение, чем все эти вещи CGPath.
Я показывал ноты миди, когда они играли, и производительность была в порядке - так что, может быть, вам не нужно беспокоиться об этом прямо сейчас.
Система отправит вам один drawRect:
сообщение за ход основного цикла выполнения, независимо от того, сколько раз вы звонили setNeedsDisplayInRect:
, Он передает вам прямоугольник, который является, по крайней мере, "объединением" всех грязных каналов, которые вы передавали setNeedsDisplayInRect:
, Система не позволяет точно определить, какие именно setNeedsDisplayInRect:
,
Вы могли бы переопределить setNeedsDisplayInRect:
сохранить массив грязных мест (вы найдете +[NSValue valueWithCGRect:]
полезно), и очистить массив в drawRect:
,
Вы можете создать свой собственный setNeedsDisplayForKey:
метод, который хранит массив грязных ключей и вызовов setNeedsDisplay
,