5

特定の理由で、これを行うためにCAScrollLayerを使用しないようにしています。私が追求している効果は、CALayerのコンテンツ(以前にロードしたpng)を徐々に(下から上に)明らかにすることです。だから私はこれを行うことを考えました:

    layer.anchorPoint = CGPointMake(.5, 1);
    CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"];
    a.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    a.fillMode = kCAFillModeBoth;
    a.removedOnCompletion = NO;
    a.duration = 1;
    a.fromValue = [NSNumber numberWithFloat:0.];
    a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height];
    [layer addAnimation:a forKey:nil];

これに伴う問題は、レイヤーのコンテンツが境界に合わせてスケーリングされていることがわかることです。境界を変更しようとしましたが、コンテンツは常に元のサイズのままであるため、境界は効果的に画像をクリップし、bounds.heightを増やすと、画像自体が「表示」されます。

それをどのようにやってのけるか、または私が何を見逃している可能性があるかについてのアイデアはありますか?

4

4 に答える 4

3

動作しましたが、アンカーポイントの変更を反映するために、基本的にレイヤーのフレームも更新する必要がありました。

  [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
  layer.contentsGravity = kCAGravityTop;
  layer.masksToBounds = YES;
  layer.anchorPoint = CGPointMake(.5, 1);
  CGRect newFrame = layer.frame;
  newFrame.origin.y += newFrame.size.height / 2;
  layer.frame = newFrame;
  [CATransaction setValue:(id)kCFBooleanFalse forKey:kCATransactionDisableActions];

  a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height];
  [layer addAnimation:a forKey:nil];
于 2012-04-26T20:08:53.980 に答える
3

「お父さん」が正解です。

CAShapeLayerを作成し、それをマスクとしてレイヤーにインストールします。

単なる長方形であるCGPathを作成し、そのパスをシェイプレイヤーにインストールします。パスの内容によって、マスクされたレイヤーのどの領域が表示されるかが決まります。パスがレイヤーの中央にある三角形の場合、三角形のみが表示されます。

次に、パスをアニメーション化するアニメーションを作成します。

下から画像を表示するには、レイヤーの一番下に高さ0の長方形のパスを設定してから、toValueがレイヤー全体の高さの同じ長方形であるCAAnimationを作成します。あなたが明らかにしたい。システムは、画像をスイープで表示するアニメーションを生成します。

これと同じテクニックを使用して、納屋のドア、ベネチアンブラインド、「アイリスワイプ」など、あらゆる種類のクールな効果を実現できます。

于 2012-04-27T02:41:42.387 に答える
2

代わりにクリッピングマスクを変更した場合はどうなりますか?(またはマスクレイヤーを使用します)。

于 2012-04-26T19:36:41.150 に答える
0

別の画像をターゲット画像の上に置いて、緞帳のように上に移動することができます。

于 2012-04-26T19:18:47.387 に答える