是否可以在视图上重新定位已绘制的CGPath / UIBezierPath?我想移动或改变路径的位置然后可能回想起drawinRect方法再次显示图形。
答案 0 :(得分:20)
从您的问题来看,听起来您正在使用drawRect:
内的核心图形绘制路径(与使用CAShapeLayer
相比),所以我将首先解释该版本。
您可以通过转换另一条路径来创建新路径。平移变换将变换后的对象在x和y中移动一定距离。因此,使用平移变换,您可以在x和y中移动现有路径一定数量的点。
CGAffineTransform translation = CGAffineTransformMakeTranslation(xPixelsToMove,
yPixelsToMove);
CGPathRef movedPath = CGPathCreateCopyByTransformingPath(originalCGPath,
&translation);
然后您可以使用movedPath
以与您现在相同的方式绘制。
您也可以更改修改相同的路径
yourPath = CGPathCreateCopyByTransformingPath(yourPath,
&translation);
并简单地重新绘制。
如果您使用的是形状图层,移动它会更容易。然后,您只需使用position
属性更改图层的位置。
如果要使用形状图层,只需创建一个新的CAShapeLayer并将其路径设置为CGPath即可。因为CAShapeLayer是Core Animation的一部分,所以你需要QuartzCore.framework。
CAShapeLayer *shape = [CAShapeLayer layer];
shape.path = yourCGParth;
shape.fillColor = [UIColor redColor].CGColor;
[someView.layer addSublayer:shape];
然后移动形状你只需改变它的位置。
shape.position = thePointYouWantToMoveTheShapeTo;
答案 1 :(得分:1)
///为它提供cgpath并按给定点对其进行tanslate。
func translate(path : CGPath?, by point: CGPoint) -> CGPath? {
let bezeirPath = UIBezierPath()
guard let prevPath = path else {
return nil
}
bezeirPath.cgPath = prevPath
bezeirPath.apply(CGAffineTransform(translationX: point.x, y: point.y))
return bezeirPath.cgPath
}
答案 2 :(得分:0)
///从中心转换cgPath给点。无需移动形状图层。移动路径将使应用程序流畅
func translate(path : CGPath?, by point: CGPoint) -> CGPath? {
let bezeirPath = UIBezierPath()
guard let prevPath = path else {
return nil
}
bezeirPath.cgPath = prevPath
bezeirPath.apply(CGAffineTransform(translationX: point.x, y: point.y))
return bezeirPath.cgPath
}
答案 3 :(得分:0)
我做的和上面的其他回答有些不同。
假设您要移动一个圆,首先我在全局变量中定义其中心坐标和半径,如下所示:
var center: CGPoint = CGPoint(x: UIScreen.main.bounds.width/2, y: UIScreen.main.bounds.height/2)
var radius: CGFloat = 10
我在下面的代码中画出了这个圆圈:
override func draw(_ rect: CGRect) {
super.draw(rect)
drawCircle()
}
func drawCircle() {
let circle = UIBezierPath(
arcCenter: self.center,
radius: CGFloat(self.radius),
startAngle: CGFloat(0),
endAngle: CGFloat(2*Double.pi),
clockwise: true)
let circleLayer = CAShapeLayer()
circleLayer.path = circle.cgPath
circleLayer.fillColor = UIColor.clear.cgColor
circleLayer.strokeColor = UIColor.black.cgColor
circleLayer.lineWidth = 10.0
layer.addSublayer(circleLayer)
}
在UIView中,我有一个touchesMoved(),如下所示:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?){
if let touch = touches.first {
let pos = touch.location(in: self)
if (pow(pos.x-self.center.x,2) + pow(pos.y-self.center.y,2) <= pow(self.radius,2)){
self.center = CGPoint(x: pos.x, y: pos.y)
}
setNeedsDisplay()
}
}
每次触摸都在圆内时,其中心坐标都会更新,并使用setNeedDisplay()
重绘UIView,因此圆会移动。
希望它对某人有帮助!