2017-02-02 4 views
1

У меня возникают проблемы с кругом, используя CAShapeLayer. У меня есть пользовательский вид MainLogoAnimationView код следующим образом:Позиция CAShapeLayer неверна

import UIKit 

class MainLogoAnimationView: UIView { 

    @IBOutlet var customView: UIView! 
    var redCircle: AnimationCircleView! 


    // MARK: Object Lifecycle 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    func setup() { 
     _ = Bundle.main.loadNibNamed("MainLogoAnimationView", owner: self, options: nil)?[0] as! UIView 
     self.addSubview(customView) 
     customView.frame = self.bounds 
     let circleWidth = frame.size.width*0.25 
     let yPos = frame.size.height/2 - circleWidth/2 
     redCircle = AnimationCircleView(frame: CGRect(x: 10, y: yPos, width: circleWidth, height: circleWidth)) 
     redCircle.backgroundColor = UIColor.yellow 
     addSubview(redCircle) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

    } 
} 

В интерфейсе строитель я создал светло-голубой UIView и выбран MainLogoAnimationView как подвид.

AnimationCircleView, как так:

import UIKit 

class AnimationCircleView: UIView { 

    // MARK: Object lifecycle 

    var circleColor = UIColor.red.withAlphaComponent(0.5).cgColor { 
     didSet { 
      shapeLayer.fillColor = circleColor 
     } 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    let shapeLayer = CAShapeLayer() 

    func setup() { 
     let circlePath = UIBezierPath(ovalIn: frame) 
     shapeLayer.path = circlePath.cgPath 
     shapeLayer.fillColor = circleColor 
     shapeLayer.frame = self.frame 
     shapeLayer.backgroundColor = UIColor.gray.cgColor 
     layer.addSublayer(shapeLayer) 
    } 

} 

Скриншот:

enter image description here

Is кажется CAShapeLayer кадра неверен, а также красный круг находится в неправильном положении. Он должен быть внутри желтого квадрата. Что я здесь делаю неправильно? Любые указатели были бы действительно оценены! Благодаря!

UPDATE:

enter image description here

ответ

2

В вашем AnimationCircleView внутри setup изменения

shapeLayer.frame = self.frame

в

shapeLayer.frame = self.bounds

Это должно обеспечить, чтобы серый цвет был нарисован внутри желтого прямоугольника.

Edit:

Подобно выше ответ, изменение

let circlePath = UIBezierPath(ovalIn: frame)

в

let circlePath = UIBezierPath(ovalIn: bounds)

решит вашу проблему и сделать круг внутри серой области.

CAShapeLayer рама рассчитывается относительно позиции вида, в которую она добавлена, при условии, что она установлена ​​равной раме, добавляет CAShapeLayer в положение ax и y, смещенное от начала координат на значение x и y, прошедшее в self.frame.

+0

Это переместило рамку в правильное положение, но круг не центрирован внутри. Изображение выше^ – KexAri

+0

Да, я собирался спросить, что во мне редактируют. 'let circlePath = UIBezierPath (ovalIn: frame)', откуда вы получаете значение кадра? Если вы отлаживаете его, вы увидите, что позиции x и y снова смещены. Здесь тоже должны быть границы! Это то же самое, что я ответил в основном :) Попробуйте изменить его на границы, и он будет работать – Rikh

+0

Это было! Благодаря! – KexAri

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