我有这个形状,我在drawRect()中绘制
var rectanglePath = UIBezierPath() override func drawRect(rect: CGRect) { rectanglePath = UIBezierPath(rect: self.bounds) rectanglePath.fillWithBlendMode(kCGBlendModeMultiply,alpha: 0.7) layer.shouldRasterize = true }
当调用prepareForEditing函数时,我想为rectanglePath设置动画.我试过了
func prepareForEditing(editing:Bool){ UIView.animateWithDuration(0.5,animations: { self.rectanglePath = makeNewShape() } ) }
什么都没发生.你能告诉我我的代码有什么问题吗?
要为CGPath设置动画,您不能使用UIView.animation方法.
我创建了自定义UIView子类来向您展示如何为CGPaths形状设置动画,请参考注释并根据您的要求进行修改:
我创建了自定义UIView子类来向您展示如何为CGPaths形状设置动画,请参考注释并根据您的要求进行修改:
class MyView: UIView { let shapeLayer = CAShapeLayer() let maskLayer = CAShapeLayer() var rectanglePath = UIBezierPath() override func didMoveToSuperview() { super.didMoveToSuperview() backgroundColor = UIColor.clear // initial shape of the view rectanglePath = UIBezierPath(rect: bounds) // Create initial shape of the view shapeLayer.path = rectanglePath.cgPath shapeLayer.strokeColor = UIColor.black.cgColor shapeLayer.fillColor = UIColor.clear.cgColor layer.addSublayer(shapeLayer) //mask layer maskLayer.path = shapeLayer.path maskLayer.position = shapeLayer.position layer.mask = maskLayer } func prepareForEditing(editing:Bool){ let animation = CABasicAnimation(keyPath: "path") animation.duration = 2 // Your new shape here animation.toValue = UIBezierPath(ovalIn: bounds).cgPath animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaSEOut) // The next two line preserves the final shape of animation,// if you remove it the shape will return to the original shape after the animation finished animation.fillMode = kCAFillModeForwards animation.isRemovedOnCompletion = false shapeLayer.add(animation,forKey: nil) maskLayer.add(animation,forKey: nil) } }