2

「ビューのコピーを作成し、完全に消えるまで不透明度を下げながら、このコピーをあるポイントから別のポイントに移動する」アニメーションを作成したいと考えています。

私はそれを行う必要があると思うので、CABasicAnimationそのようなことを試しました:

    CGPoint point = CGPointMake(200, 0);

    // copy layer
    CALayer *layer = [[CALayer alloc] initWithLayer:self.animatedView.layer];
    [self.animatedView.layer addSublayer:layer];

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.fromValue = [layer valueForKey:@"position"];
    animation.toValue = [NSValue valueWithCGPoint:point];
    animation.duration = 2.0f;

    CABasicAnimation *oanimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    oanimation.fromValue = @1;
    oanimation.toValue = @0;
    oanimation.duration = 1.0f;

    // move copy layer
    [layer addAnimation:animation forKey:@"position"];
    [layer addAnimation:oanimation forKey:@"opacity"];

しかし、何も追加されず、ドキュメンテーションに関しては通常の状況だと思います:

この初期化子は、たとえば、presentationLayer メソッド用にレイヤーのシャドウ コピーを作成するために使用されます。このメソッドを他の状況で使用すると、未定義の動作が発生します。たとえば、このメソッドを使用して、既存のレイヤーのコンテンツで新しいレイヤーを初期化しないでください。

誰かがこの種のアニメーションを以前にやったことがありますか?

ありがとうございます。

4

2 に答える 2

1
UIGraphicsBeginImageContext(theView.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[theView.layer renderInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImageView *imgView = [[UIImageView alloc] initWithImage:screenShot];
imgView.frame = theView.frame;
[self.view addSubview:imgView];

次に、「imgView」で遊んでください:)

于 2014-10-24T15:28:30.013 に答える
0

ソリューション 1: CALayers

Swift 4.2 で @Sriram ソリューションを採用し、より適合した CALayer を使用することを好みましたUIImageView

// We use the screen's scale to support Retina displays
UIGraphicsBeginImageContextWithOptions(viewToCopy.frame.size, false, UIScreen.main.scale)
if let context: CGContext = UIGraphicsGetCurrentContext() {
    // We convert the layer of the viewToCopy into an UIImage
    viewToCopy.layer.render(in: context)
    let screenshot = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    // We create a layer that will hold the image. This layer can be animated further down the road.
    let layer = CALayer()
    layer.contents = screenshot?.cgImage // Don't forget .cgImage, otherwise it won't work
    layer.frame = viewToCopy.frame // For example
    view.layer.addSublayer(layer)
}

これはほとんどの場合うまくいくと思いますが、これを a で実行しているときにいくつかの問題が発生しましたUIVisualEffectView(効果が壊れました)。そのため、2 つ目の解決策を見つけなければなりませんでした。

解決策 2: UIView コピー

UIViewまず、簡単にコピーできるように小さな拡張機能が必要です。この回答を使用しましたが、わかりやすくするためにここにコピーします。

// MARK: - UIView + Copy

extension UIView {
    func copyView<T: UIView>() -> T {
        return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
    }
}

これを取得したら、ビューをコピーして追加し、ビュー階層にレイアウトして、他の と同じように使用できますUIView

let animationCardView = cardView.copyView()
animationCardView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(animationCardView)

NSLayoutConstraint.activate([animationCardView.leadingAnchor.constraint(equalTo: cardView.leadingAnchor),
                                     animationCardView.trailingAnchor.constraint(equalTo: cardView.trailingAnchor),
                                     animationCardView.topAnchor.constraint(equalTo: cardView.topAnchor),
                                     animationCardView.bottomAnchor.constraint(equalTo: cardView.bottomAnchor)])
于 2019-02-17T09:43:07.187 に答える