Удаление всех подслоев CALayer - PullRequest
59 голосов
/ 15 января 2010

У меня проблемы с удалением всех подслоев слоя. В настоящее время я делаю это вручную, но это приносит ненужный беспорядок. Я нашел много тем об этом в Google, но не получил ответа.

Я пытался сделать что-то вроде этого:

for(CALayer *layer in rootLayer.sublayers)
{
    [layer removeFromSublayer];
}

но это не сработало.

Также я пытался клонировать rootLayer.sublayers в отдельный NSArray, но результат был тот же.

Есть идеи?

Edit:

Я думал, что теперь это работает, но я ошибался. Он хорошо работает с CALayers, но не работает с CATextLayers. Есть идеи?

Ответы [ 14 ]

1 голос
/ 15 апреля 2016

Я должен был сделать это в Xamarin / C #. У меня был UITableViewCell с некоторыми CAShapeLayers для границ. Все вышеперечисленные параметры (включая копирование массива и последующее удаление слоев вызвали сбой). Подход, который работал для меня:

При добавлении CALayer я дал ему имя:

    var border = new CALayer();
    border.BackgroundColor = color.CGColor;
    border.Frame = new  CGRect(x, y, width, height);
    border.Name = "borderLayerName";
    Layer.AddSublayer(border);

В PrepareForReuse на UITableViewCell я создал копию свойства SubLayers и удалил все, что соответствовало имени, которое я назначил ранее:

    CALayer[] copy = new CALayer[Layer.Sublayers.Length];
    Layer.Sublayers.CopyTo(copy, 0);
    copy.FirstOrDefault(l => l.Name == "borderLayerName")?.RemoveFromSuperLayer();

Нет сбоев.

Надеюсь, это поможет!

0 голосов
/ 27 марта 2017

Что делать:

rootLayer.sublayers = @[];
0 голосов
/ 25 ноября 2016

Для swift3 +, вы можете использовать это.

yourView.layer.sublayers?.removeAll(keepingCapacity: true)

См. Здесь: Справочник по Apple API

Или вы можете: yourView.layer.sublayers?.forEach{ $0.removeFromSuperlayer()}

0 голосов
/ 28 апреля 2015

Конечно, вы можете сделать:
self.layer.sublayers=nil;
как предложил Паскаль Бурк. Но лучше вызывать метод установки для подслоев:
[self.layer setSublayers:nil];
Чтобы избежать проблем с очисткой, если они могут быть.

...