Можно скопировать CALayer из UIView? - PullRequest
5 голосов
/ 07 июня 2009

Вот мои настройки: у меня есть CALAyer, к которому я хочу добавить подслои. Я создаю эти подслои, устанавливая UILabel, а затем добавляю слой UILables в мой основной слой. Конечно, тяжелый объект UILabel остается на заднем плане. Можно ли получить слой со всем его содержимым из UIView и избавиться от самого UIView? Я уже пробовал это:

UILabel* label;
[...]
[mainLayer addSublayer:[label.layer copy]];
[label release];

Но всякий раз, когда я выпускаю UIView, содержимое слоя также удаляется. Это вообще возможно, или для слоя UIView всегда нужен сам UIView, чтобы показать его содержимое? Я думал о слое как о холсте, на котором рисует UIView. Думаю, я могу ошибаться в этом предположении:)

Ответы [ 5 ]

4 голосов
/ 07 июня 2009

Я не могу понять, почему вы не сможете скопировать слой. Истинный слой является «неотъемлемой частью» UIView. Но, в конце концов, это просто еще один объект с несколькими свойствами.

На самом деле есть метод для CALayer, который называется:

- (id)initWithLayer:(id)layer

Но оно не предназначено для копирования слоя. (Вы можете прочитать документы Apple по причинам, почему)

CALayer не соответствует NSCopying, поэтому у вас есть два варианта:

  1. Подкласс это и реализовать «copyWithZone:» (и соответствует NSCopying)
  2. Напишите метод / функцию, которая будет вернуть «копию» CALayer

Независимо от того, какой путь вы выберете, вы должны задать вопрос: какие свойства CALlayer вы хотите скопировать?

Допустим, вы хотите скопировать только содержимое и фрейм:

CALayer copyLayer = [CALayer layer];

copyLayer.contents = theLayerToBeCopied.contents;
copyLayer.frame = theLayerToBeCopied.frame;

return copyLayer;

Вы можете пройти и скопировать каждое свойство слоя или просто скопировать те, которые вам нужны. Может быть хорошим методом для размещения в категории CALayer.

1 голос
/ 07 июня 2009

Это невозможно: слой является свойством UIView. Поэтому, когда вы выпускаете UIView, его слой исчезает. Ваша идея думать о слое как о холсте не ошибается. Но слой является неотъемлемой частью его UIView.

0 голосов
/ 03 марта 2015

используйте CAReplicatorLayer, вы сможете полностью скопировать этот слой

0 голосов
/ 15 декабря 2011

Вы также можете полностью обойти UILabel и создать свой текст с помощью CATextLayer .

0 голосов
/ 13 июня 2009

UILabel на самом деле не очень сложный элемент управления. Я предлагаю вам отказаться от этой линии атаки и научиться рисовать то, что вы хотите, используя Quartz, в новый CGImage Затем вы можете назначить это свойству содержимого CALayer, не беспокоясь обо всем этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...