2010-08-17 1 views
2

У меня есть несколько CALayers в режиме размещения на уровне. Каждый из этих слоев имеет дополнительные слои для удержания (1) кнопку закрытия и (2) ручку изменения размера. Эти дополнительные «контрольные» уровни добавляются как подслои к родительскому слою.Предотвращение подуровней CALayer от масштабирования

В настоящее время, когда я увеличиваю рабочее пространство, в котором находятся эти слои, все масштабы - включая эти уровни управления. Однако я бы хотел, чтобы эти уровни управления не масштабировались.

Есть ли способ переопределить поведение, когда масштабные преобразования применяются ко всем подслоям, без необходимости переопределять метод drawInContext: для каждого уровня управления (предположительно, чтобы инвертировать любое существующее масштабируемое преобразование - если это возможно) и без необходимости вручную посылать каждый из этих уровней управления setNeedsDisplay: с каждым увеличением?

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

Redrawing CALayer subclass when super layer is scaled

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

How do I keep a CALayer, sublayer of a CATiledLayer, from changing it's scale after a zoom?

+0

Я решил решить эту проблему, переопределив метод layoutSublayers своих пользовательских CALayers, получив накопленный масштабный масштаб иерархии слоев и применив обратное преобразование к подслоям управления. – Dalmazio

ответ

3

Я в конечном итоге решить эту проблему путем переопределения метода layoutSublayers моих пользовательских CALayers, получение накопленного масштаба преобразования иерархии слоя, и применяя обратное преобразование к подуровню управления.

+0

Вы назвали '[layer setNeedsLayout]' в 'scrollViewDidZoom:' делегировать метод вашего контроллера представления для обработанных просмотров? – Benjohn

+1

Да, и нет. Приложение использовало AppKit, а не UIKit. Поскольку такие UIScrollView и UIScrollViewDelegate недоступны. Но если вы используете UIKit, то, как вы предлагаете, это один из способов сделать это. В этом приложении одноуровневое представление размещает контентный уровень, который, в свою очередь, содержит много подслоев. Преобразование масштабирования/масштабирования применяется непосредственно к контентному уровню, а затем «setNeedsLayout» отправляется всем слоям элементов в уровне содержимого, так что элементы подуровня могут устанавливать свои обратные преобразования, чтобы они оставались фиксированными. – Dalmazio