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

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

Однако , предоставленное CGImage для свойства CALayer.contents не отображается в представлении ни в одной точке (насколько я могу судить).Я пытался разобраться в этом поведении некоторое время, и я озадачен документацией Apple:

Если вы используете слой для отображения статического изображения , выможете установить это свойство для CGImage, содержащего изображение , которое вы хотите отобразить .... Присвоение значения этому свойству заставляет слой использовать ваше изображение, а не создавать отдельное резервное хранилище.

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

Это здорово знать!Вероятно, именно так и происходит в этом сценарии: UIView обновляет и заменяет свое содержимое.За исключением того, что предоставленный обходной путь не очень понятен, и я не смог найти примеры, которые решают эту проблему.

У всех есть какие-либо предложения о том, как установить статическое изображение 'косвенно' на CAShapeLayer и избежать его удаления суперпредставлением (почти сразу)?

1 Ответ

0 голосов
/ 27 сентября 2018

Сначала я подумал, что вы не можете установить образ в содержимое CAShapeLayer и заставить его работать, но я ошибся.Это работает.Рассмотрим этот код:

class ImageWithShapeView: UIView {

    let shapeLayer = CAShapeLayer()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        layer.borderWidth = 1.0
        shapeLayer.frame = self.bounds
        //Load an image into the shape layer's contents property.
        if let image = UIImage(named: "WareToLogo") {
            shapeLayer.contents = image.cgImage
            layer.addSublayer(shapeLayer)
        }
        let path = UIBezierPath()
        shapeLayer.lineWidth = 2.0
        shapeLayer.strokeColor = UIColor.blue.cgColor
        shapeLayer.fillColor = UIColor.clear.cgColor
        let radius = (bounds.midX + bounds.midY) / 4.0
        path.addArc(withCenter: CGPoint(x: bounds.midX, y: bounds.midY), radius: radius, startAngle: 0, endAngle: CGFloat.pi * 2, clockwise: true)
        path.move(to: CGPoint(x:0, y:0))
        path.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
        path.move(to: CGPoint(x: bounds.width, y: 0))
        path.addLine(to: CGPoint(x: 0, y: bounds.height))
        shapeLayer.path = path.cgPath
    }
}

Это работает и создает следующее, когда я добавляю ImageWithShapeView в свой проект.(Я использую раскадровку, поэтому я реализовал UIView.init(coder:). Если вы создаете свои представления в коде, возможно, вы захотите вместо этого реализовать UIView.init(frame:))

enter image description here

...