Маскировка 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];

Ответ 1

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

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

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

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