Маскировка CALayer - iPhone - PullRequest
       18

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

10 голосов
/ 15 февраля 2010

Я создаю собственный переключатель вкл / выкл для 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];

1 Ответ

14 голосов
/ 16 февраля 2010

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

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

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

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

...