10

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];
4

1 に答える 1

14

マスクは特別な種類のサブレイヤーにすぎないため、マスクのスーパーレイヤーは常にマスクされているレイヤーになります。それを回避する方法はありません。また、ドキュメントのこの警告に違反しています:

マスクを新しいレイヤーに設定する場合、新しいレイヤーのスーパーレイヤーを最初に nil に設定する必要があります。そうしないと、動作が未定義になります。

行を削除する必要があり[[self layer] addSublayer:maskLayer];ます。

あなたの問題を解決するには、現在toggleViewにあるすべてのものを含む別のレイヤーまたはビューを作成し、そのレイヤーをサブレイヤーとしてtoggleLayerに追加します。そうすれば、マスクとは別に新しいサブレイヤーを配置できます。親レイヤーを移動すると、マスクとサブレイヤーの両方が一緒に移動します(正しく理解している場合は、これが必要です)。

于 2010-02-15T22:13:45.657 に答える