Маскировка UIView с UILabel с использованием AutoLayout - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над проектом, который приведет к желаемому эффекту:

enter image description here

Я успешно рисую свой круг, используя следующий код:

let circle = CircleView()
circle.translatesAutoresizingMaskIntoConstraints = false
circle.backgroundColor = UIColor.clear
self.addSubview(circle)

    // Setup constraints
    circle.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    circle.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    circle.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.6).isActive = true
    circle.heightAnchor.constraint(equalTo: circle.widthAnchor, multiplier: 1.0/1.0).isActive = true

Для справки, это мой класс CircleView:

class CircleView: UIView {

    override func draw(_ rect: CGRect) {

        // Set the path
        let path = UIBezierPath(ovalIn: rect)

        // Set the fill color
        UIColor.black.setFill()

        // Fill
        path.fill()
    }
}

Затем я создаю свою UILabel следующим образом:

let myLabel = UILabel()
myLabel.translatesAutoresizingMaskIntoConstraints = false
myLabel.text = "HELLO"
myLabel.textColor = UIColor.white
circle.addSubview(myLabel)

    // Setup constraints
    myLabel.centerXAnchor.constraint(equalTo: circle.centerXAnchor).isActive = true
    myLabel.centerYAnchor.constraint(equalTo: circle.centerYAnchor).isActive = true

Я пыталсячтобы замаскировать мой круг, используя:

circle.mask = myLabel

Это, однако, приводит к эффекту противоположного , который мне нужен (мой текст не вырезан в UIView, а скорее,мой текст теперь черный).Где я могу пойти не так, чтобы достичь этого эффекта?

1 Ответ

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

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

Поскольку выВы не можете достичь этого, используя UILabel, вам нужно использовать что-то другое в качестве маски, например CALayer.

Если вы ищете "UILabel see through text", вы должны найти результаты, похожие на это , которое в основном относится и к вам (с некоторыми изменениями).

Создайте экземпляр CircleView, затем создайте экземпляр CATextLayer и используйте его в качестве маски для UIView

...