Я подклассифицирую CALayer для предоставления моего собственного метода рисования. Для оптимизации я звоню -[MyLayer setNeedsDisplayInRect:]
вместо -[MyLayer setNeedsDisplay]
. В методе рисования я получаю прямоугольник, который должен быть перерисован через CGContextGetClipBoundingBox()
.- [CALayer setNeedsDisplayInRect:] вызывает перерисовку всего слоя.
Если я использую этот слой как основу уровня UIView, каждая вещь работает так, как ожидалось. Проблема возникает, как только я использую свой пользовательский слой в качестве подуровня другого CALayer. Чем CGContextGetClipBoundingBox()
всегда возвращает прямоугольник границ этого слоя.
Любые идеи?
[EDIT]
Кажется, что нет никакой гарантии, что содержание CALayer кэшируется и только грязная часть получает перерисованы. Я сделал небольшой тест и сохранил прямоугольник, который нужно отображать как отдельное свойство. Результат состоял в том, что только эта часть была видна на экране.
Теперь я представляю контекст изображения и сохраняю это изображение как кеш. В методе рисования я покажу только кешированное изображение.
Имеются ли у слоев без просмотра свойство 'masksToBounds' для' YES'? Если нет, есть веская причина, почему они не будут зажимать. – MrMage
К сожалению, это не решает проблему. Проблема заключается в том, что 'CGContextGetClipBoundingBox()' возвращает границы слоя, а не область, которую необходимо обновить, как описано в Apple: * Подклассы, которые хотят найти реальную область для рисования, могут вызывать CGContextGetClipBoundingBox. * [DrawInCOntext:] (https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/drawInContext :) –
Вы когда-нибудь добирались до в нижней части этого? У меня такая же неприятная проблема. – mprivat