2016-06-11 5 views
0

Я пытаюсь повернуть CAShapeLayer вокруг своей центральной точки. Я действительно запутался в границах, кадрах, якорях и центрах.CAShapeLayer Driving me bonkers

Я создал круговой CAShape в UIView и хочу повернуть его вокруг его центра. Я включил только часть кода.

Функция Создать круг Я желаю, чтобы повернуть:

func drawCompassImage(){ 

    //Compass Bezel Ring 
    let baseCirclePath = UIBezierPath() 

    baseCirclePath.addArcWithCenter(CGPoint(x: CGFloat(self.frame.width/2), y: CGFloat(self.frame.width/2)), radius: CGFloat(baseCircleRadius), startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true) 
    compassImage.path = baseCirclePath.CGPath 
    compassImage.fillColor = UIColor.clearColor().CGColor; 
    compassImage.strokeColor = UIColor.whiteColor().CGColor 
    compassImage.lineDashPattern = [1.0,2.0] 
    compassImage.lineWidth = 10.0 
    self.layer.addSublayer(compassImage) 

} 

Функция создать красную точку:

func drawCompassRedDot() { 

    let compassBall = CAShapeLayer() 
    let compassBallPath = UIBezierPath() 
    let compassBallRadius :CGFloat = 5 

    let xStart: Float = Float(Float(baseCircleRadius) * cos(270 * Float(M_PI)/180)) + Float(self.frame.width/2) 
    let yStart: Float = Float(Float(baseCircleRadius) * sin(270 * Float(M_PI)/180)) + Float((self.frame.height/2)+0) 
    compassBallPath.addArcWithCenter(CGPoint(x: CGFloat(xStart), y: CGFloat(yStart)), radius: compassBallRadius, startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true) 
    compassBall.path = compassBallPath.CGPath 
    compassBall.fillColor = UIColor.redColor().CGColor; 
    compassBall.strokeColor = UIColor.redColor().CGColor 
    compassBall.lineWidth = 1.0 
    self.compassImage.addSublayer(compassBall) 
} 

Функции для вращения:

func animate(){ 

    compassImage.transform = CATransform3DMakeRotation(degree2radian(45), 0, 0, 1) 

} 

func degree2radian(a:CGFloat)->CGFloat { 
    let b = CGFloat(M_PI) * a/180 
    return b 
} 

Мой вопрос независимо Я стараюсь, чтобы он всегда заканчивался:

enter image description here

Два круга должны иметь одинаковый центр.

Пожалуйста, помогите это посылает меня помешанные ...

+0

Вы можете оставить немного больше контекста для того, где называются эти функции, так что я и другие могут помочь вам больше? @ duck1970 – Ike10

+0

Привет, я добавил полный код из класса – duck1970

ответ

1

Я работал его. Нужно добавить в пределы и точки привязки правильно:

compassImage.frame = bounds 
compassImage.anchorPoint = CGPoint(x: 0.5, y: 0.5) 

Поэтому код выглядит следующим образом:

func drawCompassImage(){ 

    //Compass Bezel Ring 
    let baseCirclePath = UIBezierPath() 

    baseCirclePath.addArcWithCenter(CGPoint(x: CGFloat(self.frame.width/2), y: CGFloat(self.frame.width/2)), radius: CGFloat(baseCircleRadius), startAngle: CGFloat(-M_PI_2), endAngle:CGFloat(M_PI_2*3), clockwise: true) 
    compassImage.path = baseCirclePath.CGPath 
    compassImage.frame = bounds 
    compassImage.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    compassImage.fillColor = UIColor.clearColor().CGColor; 
    compassImage.strokeColor = UIColor.whiteColor().CGColor 
    compassImage.lineDashPattern = [1.0,2.0] 
    compassImage.lineWidth = 10.0 
    self.layer.addSublayer(compassImage) 

} 
+0

Обратите внимание, что ваш baseCirclePath.addArcWithCenter() работает не потому, что кадр и границы одинаковы. Кадр является прямым видом, выраженным в системе координат супервизора. Поэтому, если ваше мнение будет повернуто, это, скорее всего, больше не будет работать так, как ожидалось. При вычислении кадров и позиций в пределах вида или слоя всегда используйте границы и не предполагайте, что bounds.origin будет равно 0,0. Таким образом, он будет продолжать работать, даже когда внешний мир вашего зрения будет искажать вас сумасшедшими способами. – Joride

+0

Большое спасибо за обновление. Так вы бы рекомендовали изменить эту строку? - baseCirclePath.addArcWithCenter (CGPoint (x: CGFloat (self.frame.width/2), y: CGFloat (self.frame.width/2)), радиус: CGFloat (baseCircleRadius), startAngle: CGFloat (-M_PI_2), endAngle: CGFloat (M_PI_2 * 3), по часовой стрелке: true) compassImage.path = baseCirclePath.CGPath – duck1970

+0

Да. Элемент shapeLayer позиционируется в своем супер-слое/представлении. Поэтому вы хотите использовать систему координат этого слоя/вида. И наоборот, ваше мнение хотело знать, какой именно ваш слой занимает в нем, он будет запрашивать кадр этого слоя. Не уверен, что вы уже проверили это, но если нет: проверьте это: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Coordinates/Coordinates.html – Joride

Смежные вопросы