2014-10-03 157 views
3

我想做類似圓形進度條的東西,在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

回答

2

要回答你的問題,但不是你的眼前問題:

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