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)