CALayer围绕中心旋转

问题描述:

我想做类似圆形进度条的东西,在UIView中绘制贝塞尔路径,但它看起来是通过PI/2旋转的。所以我需要通过PI/2来旋转它。问题是,它围绕着一些非常奇怪的点旋转,我不知道如何处理它。 我试图按照these的说明操作,但它没有帮助,因为我想围绕中心旋转它。 这里是我的代码:CALayer围绕中心旋转

required init(coder aDecoder: NSCoder) { 
    ringLayer = CAShapeLayer() 
    ringLayerBackground = CAShapeLayer() 
    super.init(coder: aDecoder) 
    ringLayer.lineCap = kCALineCapButt 
    ringLayer.fillColor = nil 
    ringLayerBackground.lineCap = kCALineCapButt 
    ringLayerBackground.fillColor = nil 
    ringLayerBackground.strokeColor = UIColor(white: 0.5, alpha: 0.1).CGColor 
    } 


override func layoutSubviews() { 
    layer.addSublayer(ringLayer) 
    layer.addSublayer(ringLayerBackground) 
    addSubview(imageView) 
    let rectForRing = CGRectInset(bounds, lineWidth/2, lineWidth/2)   
    //ringLayer.setAffineTransform(CGAffineTransformMakeRotation(5)) 
    ringLayer.transform = CATransform3DRotate(ringLayer.transform, CGFloat(-M_PI/20), 0.0, 0.0, 1.0) 
    //Tried both ways 
    ringLayer.path = CGPathCreateWithEllipseInRect(rectForRing, nil) 
    ringLayerBackground.path = CGPathCreateWithEllipseInRect(rectForRing, nil) 
    super.layoutSubviews() 
    } 

Here is what I’m getting

我知道有很多类似的问题,但他们没有帮助。 谢谢!

UPDATE 找到神奇的数字,是在iPhone 6的工作原理:140

let o = 140.0 
ringLayer.transform = CATransform3DTranslate(ringLayer.transform, CGFloat(o), CGFloat(o), 0) 
ringLayer.transform = CATransform3DRotate(ringLayer.transform, CGFloat(-M_PI/2), 0.0, 0.0, 1.0) 
ringLayer.transform = CATransform3DTranslate(ringLayer.transform, CGFloat(-o), CGFloat(-o), 0) 

工作正常,但我无法推测这个数字从何而来。

UPDATE 解决了它。这是ringLayer.position中的事情,需要将它设置为视图的中心。之后,我为贝塞尔路径做了修改,所以它的中心和ringLayer.position一样。所以代码变得复杂了,来自@chrisco的解决方案更加适用。

+0

阅读anchorPoint的CALayer的文档,它定义了位置和旋转原点。 – 2014-10-03 21:30:20

+0

@chrisco改变定位点完全没有区别,我不知道为什么。改变超级层的锚点移动它。 – 2014-10-03 22:08:48

+0

如果你正在试图做的是画一个圆形进度条所有,然后只需创建一个方法初始化一个UIBezier路径(arcCenter中心:CGPoint, 半径半径:CGFloat的, 由startAngle由startAngle:CGFloat的, endAngle endAngle:CGFloat的, 顺时针顺时针:Bool) - > UIBezierPath。如果你想从顶部开始进度,使用起始角度-M_PI_2,结束角度为3 * M_PI_2,顺时针=真,将路径指定给形状图层,给定它的笔触颜色,宽度等,然后你很好去。 – 2014-10-03 22:17:33

要回答你的问题,但不是你的眼前问题:

var progreessLayer = CAShapeLayer() 
    // add layer to your view etc 

    var path = UIBezierPath(arcCenter:center, 
     radius:100, startAngle:CGFloat(-M_PI_2), 
     endAngle:CGFloat(3 * M_PI_2), clockwise:true) 
    progreessLayer.path = path.CGPath 
    progreessLayer.lineWidth = 10 
    progreessLayer.strokeColor = UIColor.blackColor().CGColor 
    progreessLayer.fillColor = nil