Почему нарисованный UIBezierPath расположен внизу справа без указания центральной позиции в CAShapeLayer? - PullRequest
0 голосов
/ 14 января 2019

Я пытался централизовать UIBezierPath в суперпредставлении, но UIBezierPath расположен внизу справа, а не в центре.

Я установил значение anchorPoint на (0.5, 0.5), position self.view.center или self.view.frame.width / 2, но UIBezierPath не отцентрировано.

import UIKit

/* ViewSection */
class ViewController: UIViewController {
    @IBOutlet weak var Toolbar: UIToolbar!
    @IBOutlet weak var UIToolbarButtonItem: UIBarButtonItem!
    @IBAction func UIToolbarButtonItem(_ sender: Any) {
        let objectFramePath = UIBezierPath.init(roundedRect: CGRect(x: 0, y:  0, width: 150, height: 150), byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 39.5, height: 39.5))

        let shapeLayer = CAShapeLayer()
        shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
        shapeLayer.position = self.view.center
        shapeLayer.fillColor = UIColor.blue.cgColor
        shapeLayer.path = objectFramePath.cgPath

        self.view.layer.addSublayer(shapeLayer)
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
}

Результат таков:

screenshot of the result

1 Ответ

0 голосов
/ 14 января 2019

Якорь не работает, потому что новый слой не имеет frame. Если вы установите это, это работает:

let rect = CGRect(x: 0, y:  0, width: 150, height: 150)
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 39.5, height: 39.5))

let shapeLayer = CAShapeLayer()
shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
shapeLayer.frame = rect
shapeLayer.position = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
shapeLayer.fillColor = UIColor.blue.cgColor
shapeLayer.path = path.cgPath

view.layer.addSublayer(shapeLayer)

Кроме того, вы можете просто установить источник path:

let size = CGSize(width: 150, height: 150)
let origin = CGPoint(x: view.bounds.midX - size.width / 2,
                     y: view.bounds.midY - size.height / 2)

let path = UIBezierPath(roundedRect: CGRect(origin: origin, size: size), byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 39.5, height: 39.5))

let shapeLayer = CAShapeLayer()
shapeLayer.fillColor = UIColor.blue.cgColor
shapeLayer.path = path.cgPath

view.layer.addSublayer(shapeLayer)

Кстати, обратите внимание, что я не ссылаюсь на center, потому что , как документы говорят: «Центральная точка указана в точках в системе координат ее суперпредставления».

Всегда используйте bounds (а если вам нужен центр этого, midX и midY bounds), потому что это всегда будет в системе координат рассматриваемого вида. В этом случае это просто не имеет большого значения, но мы должны отметить, что середина bounds и center в суперпредставлении - это две совершенно разные вещи.

...