Пользовательский круговой прогресс в awakeFromNib - PullRequest
0 голосов
/ 16 мая 2018

Я создал представление хода выполнения круга, используя UIBezierPath и CAShapeLayer со следующим кодом.

let center = self.center

let trackLayer = CAShapeLayer()

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

trackLayer.path = circularPath.cgPath

trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 10
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.lineCap = kCALineCapRound
self.layer.addSublayer(trackLayer)
shapeLayer.path = circularPath.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = 10
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineCap = kCALineCapRound
shapeLayer.strokeEnd = 0
self.layer.addSublayer(shapeLayer)
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

Если я добавлю этот код в viewDidLoad, он будет работать нормально. Однако, когда я добавляю UIView из раскадровки и устанавливаю его класс в пользовательский класс, затем копирую все коды в этот пользовательский класс UIView и вызываю его в функции awakeFromNib, это не работает, в чем может быть причина? И как я могу использовать приведенный выше код с пользовательским классом UIView?

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

1 Ответ

0 голосов
/ 16 мая 2018

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

Если вы хотите, чтобы круг в центре вашего обзора.Введите код в awakeFromNib и вычислите центр себя, не используйте self.center

override func awakeFromNib() {
  let center = CGPoint.init(x: frame.width / 2, y: frame.height / 2)

  let trackLayer = CAShapeLayer()
  let shapeLayer = CAShapeLayer()

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

  trackLayer.path = circularPath.cgPath

  trackLayer.strokeColor = UIColor.lightGray.cgColor
  trackLayer.lineWidth = 10
  trackLayer.fillColor = UIColor.clear.cgColor
  trackLayer.lineCap = kCALineCapRound
  self.layer.addSublayer(trackLayer)
  shapeLayer.path = circularPath.cgPath
  shapeLayer.strokeColor = UIColor.red.cgColor
  shapeLayer.lineWidth = 10
  shapeLayer.fillColor = UIColor.clear.cgColor
  shapeLayer.lineCap = kCALineCapRound
  shapeLayer.strokeEnd = 0
  self.layer.addSublayer(shapeLayer)
}

Результат

enter image description here

...