Как установить переменную contentGravity CALayer в «resizeAspectFill»? - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь установить переменную contentGravity для CALayer, но я не совсем уверен, как это сделать.Я безуспешно пробовал следующее:

var layer = CAShapeLayer.init()
layer.contentGravity = .resizeAspectFill // This is not recognised

Мой UIImageView представляет изображение, снятое с камеры телефона.Затем я использую Vision Framework для обнаружения прямоугольников, которые возвращают четыре угловые координаты обнаруженного прямоугольника.Затем я рисую прямоугольник в слое UIImageView.Режим содержимого UIIMageView - «Aspect Fill».Мой прямоугольник в настоящее время смещен, и я думаю, что это связано с contentGravity слоя.См. Изображение ниже:

Прямоугольник, нарисованный в CAShapelayer:

let rec = UIBezierPath.init()
    rec.move(to: CGPoint.init(x: topLeft.x, y: topLeft.y))
    rec.addLine(to: CGPoint.init(x: topRight.x, y: topRight.y))
    rec.addLine(to: CGPoint.init(x: bottomRight.x, y: bottomRight.y))
    rec.addLine(to: CGPoint.init(x: bottomLeft.x, y: bottomLeft.y))
    rec.close()

    self.layer.opacity = 0.4
    self.layer.path = rec.cgPath
    self.layer.lineWidth = 5
    self.layer.strokeColor = UIColor.yellow.cgColor
    self.layer.frame = self.imgPreViewOutlet.bounds

    self.imgPreViewOutlet.layer.addSublayer(self.layer)

изображение показывает смещенный прямоугольник, нарисованный в слое UIImageView

1 Ответ

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

Нет смысла устанавливать гравитацию содержимого CAShapeLayer, поскольку это никоим образом не повлияет на способ рисования фигуры.Гравитация содержимого имеет смысл только для слоя с содержимым , например, CGImage, который обращается к его свойству contents.

Вот пример, где contentsGravity имеет значение;то же изображение, тот же размер слоя, разное содержание гравитация:

enter image description here

override func viewDidLoad() {
    super.viewDidLoad()
    do {
        let layer = CALayer()
        layer.frame = CGRect(x: 100, y: 100, width: 250, height: 200)
        layer.contents = UIImage(named:"smiley")!.cgImage
        layer.borderWidth = 1
        self.view.layer.addSublayer(layer)
        layer.contentsGravity = .center
    }
    do {
        let layer = CALayer()
        layer.frame = CGRect(x: 100, y: 300, width: 250, height: 200)
        layer.contents = UIImage(named:"smiley")!.cgImage
        layer.borderWidth = 1
        self.view.layer.addSublayer(layer)
        layer.contentsGravity = .resize
    }
}

Но если мы попробуем то же самое со слоем формы, содержимоесила тяжести не имеет значения:

enter image description here

override func viewDidLoad() {
    super.viewDidLoad()
    do {
        let layer = CAShapeLayer()
        layer.frame = CGRect(x: 100, y: 100, width: 250, height: 200)
        layer.path = CGPath(rect: CGRect(x: 0, y: 0, width: 20, height: 20), transform: nil)
        layer.borderWidth = 1
        self.view.layer.addSublayer(layer)
        layer.contentsGravity = .center
    }
    do {
        let layer = CAShapeLayer()
        layer.frame = CGRect(x: 100, y: 300, width: 250, height: 200)
        layer.path = CGPath(rect: CGRect(x: 0, y: 0, width: 20, height: 20), transform: nil)
        layer.borderWidth = 1
        self.view.layer.addSublayer(layer)
        layer.contentsGravity = .resize
    }
}
...