Ios 复制图层并移动它

Ios 复制图层并移动它,ios,calayer,caanimation,Ios,Calayer,Caanimation,我想创建一个动画“创建一个视图的副本,将该副本从一个点移动到另一个点,同时降低不透明度,直到它完全消失” 我想我需要通过CABasicAnimation来实现这一点,所以我尝试了类似的方法: CGPoint point = CGPointMake(200, 0); // copy layer CALayer *layer = [[CALayer alloc] initWithLayer:self.animatedView.layer]; [self.animat

我想创建一个动画“创建一个视图的副本,将该副本从一个点移动到另一个点,同时降低不透明度,直到它完全消失”

我想我需要通过
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方法。在任何情况下使用此方法 其他情况将产生未定义的行为。例如,不要 使用此方法可以使用现有图层的属性初始化新图层 内容

以前有人做过这种动画吗

谢谢你的帮助

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’:)

解决方案1:CALayers 我在Swift 4.2中采用了@Sriram解决方案,并倾向于使用更适合的CALayer,而不是
UIImageView

//我们使用屏幕的比例来支持视网膜显示
UIGraphicsBeginImageContextWithOptions(viewtopy.frame.size,false,UIScreen.main.scale)
如果let context:CGContext=UIGraphicsGetCurrentContext(){
//我们将viewToCopy的图层转换为UIImage
viewtopy.layer.render(在:上下文中)
让屏幕截图=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsSendImageContext()
//我们创建一个层来保存图像。这个层可以在道路的另一端设置动画。
let layer=CALayer()
layer.contents=screenshot?.cgImage//不要忘记.cgImage,否则它将无法工作
layer.frame=viewtopy.frame//例如
view.layer.addSublayer(层)
}
我想这一个在大多数情况下都很好,但是我在使用
UIVisualEffectView
执行此操作时遇到了一些问题(效果不好)。所以我必须想出第二个解决办法

解决方案2:UIView复制 首先,您需要对
UIView
进行一个小的扩展,以便能够轻松地复制它。我用过,但为了清楚起见,我会把它复制到这里

//标记:-ui查看+复制
扩展UIView{
func copyView()->T{
将NSKeyedArchiver.unarchiveObject(带:NSKeyedArchiver.ArchiveData(带根对象:self))返回为!T
}
}
一旦有了它,您就可以复制视图,将其添加并布局到视图层次结构中,然后像使用任何其他
UIView
一样使用它

让animationcardwiew=cardwiew.copyView()
animationCardView.translatesAutoresizingMaskIntoConstraints=false
view.addSubview(animationCardView)
NSLayoutConstraint.activate([animationCardView.leadingAnchor.constraint(等同于:cardView.leadingAnchor)),
animationCardView.trailingAnchor.constraint(等式:cardView.trailingAnchor),
animationCardView.topAnchor.constraint(等于:cardView.topAnchor),
animationCardView.bottomAnchor.constraint(等式:cardView.bottomAnchor)])

为什么要复制?为什么是一层呢?为什么不移动并淡出原始视图?因为这不是我想要做的。我正在将一个视图从左控制器复制到右控制器(分割的屏幕),所以我想要一个效果,在保持在左控制器上的同时假装从左到右的移动,所以您想要复制,但您仍然可以在视图级别执行此操作
UIView
符合
NSCoding
的要求,因此您可以复制它。我说的是要概括的UIView,但实际上它是一个UITableViewCell。当然,一个标准的表格视图很容易工作。自定义子类需要花费更多的精力。视图复制的主要限制是控件的目标和操作将丢失,自定义视图类可能不遵守编码约定。我发现这个答案有一些优点。我还想补充一点,如果您希望渲染的图像是视网膜(@2x,@3x),可以用以下内容替换第一行:
UIGraphicsBeginImageContextWithOptions(theView.frame.size,false,UIScreen.main.scale)