Как центрировать подпредставление в UIView? - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь создать таймер.У меня есть круг с использованием UIBezierPath, который я буду анимировать, чтобы показать оставшееся время.Это код, который рисует фигуру и добавляет ее в представление:

func drawBgShape() {
    bgShapeLayer.path = UIBezierPath(arcCenter: CGPoint(x: center.x , y: center.y), radius:
        bounds.width/2, startAngle: -.pi/2, endAngle: 1.5*.pi, clockwise: true).cgPath
    bgShapeLayer.strokeColor = UIColor.red.cgColor
    bgShapeLayer.fillColor = UIColor.clear.cgColor
    bgShapeLayer.lineWidth = 10
    layer.addSublayer(bgShapeLayer)
}

Однако, когда код выполняется, он выглядит так:

Not in the centre

Я пробовал несколько способов центрировать индикатор выполнения, но ни один из них, похоже, не работает.Например, использование frame.height / 2 не имеет никакого эффекта.

Как можно отцентрировать индикатор выполнения?

Спасибо.

РЕДАКТИРОВАТЬ: bgShapeLayer определен какэто:

let bgShapeLayer = CAShapeLayer()

1 Ответ

0 голосов
/ 23 октября 2018

Проблема, вероятно, заключается в следующей фразе:

arcCenter: CGPoint(x: center.x , y: center.y)

Центр представления - это то место, где вид находится в своем суперпредставлении.Это не то, что вы хотите.Вы хотите центр из вид.Попробуйте это:

arcCenter: CGPoint(x: bounds.midX , y: bounds.midY)

Однако было бы лучше, если бы вы дали слою фигуры рамку, размер и положение и сделали все с точки зрения слоя фигуры (который, в конце концов, где фигурарисуется).Например:

bgShapeLayer.frame = self.layer.bounds
self.layer.addSublayer(bgShapeLayer)
bgShapeLayer.path = UIBezierPath(
    arcCenter: CGPoint(x: bgShapeLayer.bounds.midX, y: bgShapeLayer.bounds.midY), 
    radius: bgShapeLayer.bounds.width/2, 
    startAngle: -.pi/2, endAngle: 1.5*.pi, clockwise: true).cgPath

Таким образом, мы не путаем координаты вида и координаты слоя, как это делает ваш код.В какой-то степени вы можете избежать неприятностей с этим, потому что бывает, что в этой ситуации есть общая эквивалентность внутренних координат вида, внутренних координат его слоя и внутренних координат bgShapeLayer, но такая путаница не является хорошей привычкойв.Вы должны сказать, что вы имеете в виду, а не полагаться на непредвиденные обстоятельства.

...