Маскирование CALayer - iPhone

Я создаю пользовательское на / от переключателя для iPhone (подобный стандартному переключателю), и я в точке, где я устанавливаю маску ползунка, но вызов [[myView layer] setMask:maskLayer] устанавливает положение маскирующего слоя относительно слоя, который это маскирует, не относительно контейнерного слоя маскирующего слоя. Для этого конкретного сценария положение маскирующего слоя должно быть установлено относительно, он содержит слой, потому что ползунок переключателя переместится под маской, и маска должна остаться стационарной.

Не имея необходимость анимировать маску И компонент ползунка переключателя для достижения желаемого эффекта кто-либо знает, как сделать эту работу? Вот то, что я имею до сих пор:

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef path = CGPathCreateMutable();

CGPathAddEllipseInRect(path, nil, CGRectMake(0, 0, 13, 13));
CGPathAddEllipseInRect(path, nil, CGRectMake(30, 0, 13, 13));
CGPathAddRect(path, nil, CGRectMake(6, 0, 32, 13));

[maskLayer setPath:path];
[maskLayer setFillColor:[[UIColor greenColor] CGColor]];

[[self layer] addSublayer:maskLayer];

[maskLayer setPosition:CGPointMake(2, 2)];

[self addSubview:toggleView];

[[toggleView layer] setMask:maskLayer];
10
задан jtrim 15 February 2010 в 17:18
поделиться

1 ответ

Маска - это просто особый вид подслоя, поэтому суперслой маски всегда будет маскируемым слоем. Нет никакого способа обойти это. Кроме того, вы нарушаете это предупреждение в документации:

При установке маски для нового слоя суперслой нового слоя сначала должен быть установлен на ноль, в противном случае поведение не определено.

Вы должны удалить строку [[self layer] addSublayer: maskLayer]; .

Чтобы решить вашу проблему, я бы создал другой слой или представление, содержащее все, что сейчас находится в вашем toggleView, а затем добавил бы этот слой в ваш toggleLayer в качестве подслоя. Таким образом, вы можете расположить новый подслой независимо от маски, и если вы переместите родительский слой, и маска, и подслой будут перемещаться вместе (это то, что они должны делать, если я правильно вас понимаю).

14
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: