所以我有一个特定图案的圆圈。我想把这个圆变成一条直线。你知道我怎么做到吗?
我看了一下在圆上画一条uibezier路径,然后在没有任何帮助的情况下把它转换成一条直线。我在opencv(fast Cartesian to Polar to Cartesian in Python)中也看到过这样一个链接,但我更喜欢用本地swift。
最佳答案
如果您不关心转换的性质,最简单的方法是从一条路径到另一条路径设置CABasicAnimation
的动画。而要实现带path
的模式化路径,实际上就是要有两个重叠的CAShapeLayer
对象,一个对象上有虚线模式,另一个对象上没有虚线模式。
let fromPath = UIBezierPath(arcCenter: view.center, radius: 100, startAngle: 0, endAngle: CGFloat(M_PI) * 2.0, clockwise: true)
let toPath = UIBezierPath()
toPath.moveToPoint(CGPoint(x: view.frame.size.width / 2.0 - CGFloat(M_PI) * 100.0, y:view.center.y))
toPath.addLineToPoint(CGPoint(x: view.frame.size.width / 2.0 + CGFloat(M_PI) * 100.0, y: view.center.y))
let shapeLayer = CAShapeLayer()
shapeLayer.path = fromPath.CGPath
shapeLayer.lineWidth = 5
shapeLayer.strokeColor = UIColor.redColor().CGColor
shapeLayer.fillColor = UIColor.clearColor().CGColor
let shapeLayer2 = CAShapeLayer()
shapeLayer2.path = fromPath.CGPath
shapeLayer2.lineWidth = 5
shapeLayer2.strokeColor = UIColor.blackColor().CGColor
shapeLayer2.fillColor = UIColor.clearColor().CGColor
shapeLayer2.lineDashPattern = [100,50]
view.layer.addSublayer(shapeLayer)
view.layer.addSublayer(shapeLayer2)
以及
shapeLayer.path = toPath.CGPath
shapeLayer2.path = toPath.CGPath
CATransaction.begin()
CATransaction.setAnimationDuration(5)
let animation = CABasicAnimation(keyPath: "path")
animation.fromValue = fromPath.CGPath
animation.toValue = toPath.CGPath
shapeLayer.addAnimation(animation, forKey: nil)
let animation2 = CABasicAnimation(keyPath: "path")
animation2.fromValue = fromPath.CGPath
animation2.toValue = toPath.CGPath
shapeLayer2.addAnimation(animation, forKey: nil)
CATransaction.commit()
顺从的:
如果你想要对转换的性质有更多的控制,那么你必须使用更多的手动技术,例如手动调整路径的a
CAShapeLayer
。但那更复杂。关于swift - 如何快速地将圆变成直线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38116247/