所以我有一个特定图案的圆圈。我想把这个圆变成一条直线。你知道我怎么做到吗?
我看了一下在圆上画一条uibezier路径,然后在没有任何帮助的情况下把它转换成一条直线。我在opencv(fast Cartesian to Polar to Cartesian in Python)中也看到过这样一个链接,但我更喜欢用本地swift。
swift - 如何快速地将圆变成直线?-LMLPHP

最佳答案

如果您不关心转换的性质,最简单的方法是从一条路径到另一条路径设置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()

顺从的:
swift - 如何快速地将圆变成直线?-LMLPHP
如果你想要对转换的性质有更多的控制,那么你必须使用更多的手动技术,例如手动调整路径的aCAShapeLayer。但那更复杂。

关于swift - 如何快速地将圆变成直线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38116247/

10-12 01:26