Добавление CAShapeLayer в подпредставление - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь добавить CAShapeLayer в меньший UIView на главном экране (приложение с одним представлением).У меня есть слой формы, анимированный и реагирующий на жест касания, чтобы начать рисовать его.Но он рисуется из центра основного вида, и мне нужно иметь возможность его перемещать и ограничивать в целях макета.Я видел другой пост, у которого, казалось, были те же самые проблемы, но я думаю, что запутал себя больше.У меня есть код ниже в функции viewDidLoad на главном ViewController.

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

Iпопытался добавить UIView в MainStoryBoard проекта и добавить ссылку на него в файл ViewController.swift (перетаскивание элемента управления), чтобы создать выход, а затем добавить shapeLayer и trackLayer в UIView.

Код ниже

@IBOutlet weak var gaugeView: UIView!


override func viewDidLoad() {
    super.viewDidLoad()

    let centre = view.center

    let circularPath = UIBezierPath(arcCenter: centre, radius: 100, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)

    // Track Layer Under Gauge
    trackLayer.path = circularPath.cgPath
    trackLayer.strokeColor = UIColor.lightGray.cgColor
    trackLayer.lineWidth = 10
    trackLayer.fillColor = UIColor.clear.cgColor
    //view.layer.addSublayer(trackLayer)
    gaugeView.layer.addSublayer(trackLayer)

    // Animated Circular Guage
    shapeLayer.path = circularPath.cgPath
    shapeLayer.strokeColor = UIColor.green.cgColor
    shapeLayer.lineWidth = 10
    shapeLayer.lineCap = .round
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.strokeEnd = 0
    //view.layer.addSublayer(shapeLayer)
    gaugeView.layer.addSublayer(shapeLayer)
  }

Как только у меня есть приложение в симуляторе, оно рисует и анимирует круг, когда view.layer.addSubLayer не закомментирован, но не добавит его в контейнер UIView с помощью gaugeView.layer.addSubView находится там.

Screen dump of the main storyboard

Screen dump once let center = gaugeView.center updated..

1 Ответ

0 голосов
/ 27 декабря 2018

Вам необходимо установить center на gaugeView center вместо view.center здесь,

override func viewDidLoad() {
    super.viewDidLoad()

    let centre = CGPoint(x: gaugeView.frame.width/2, y: gaugeView.frame.height/2)
    ...
}

Примечание: При использовании Autolayout, viewDidLoad никогда не является правильным местом для использования frame из subView, который еще не изложен в autolayout.Лучшее место для получения и использования frame - viewDidLayoutSubviews.

...