NSAttributedString не подчиняется ForegroundColor

#swift #swiftui #uikit

#swift #swiftui #uikit

Вопрос:

У меня есть UIViewRepresentable , который используется NSAttributedString для установки обводки заданного текста.

Это работает нормально, за исключением одного: текст не имеет заливки — только обводка.

 struct StrokedText: UIViewRepresentable {
    let text: String
    let width: CGFloat
    let color: Color
    let fontSize: CGFloat
    
    func makeUIView(context: Context) -> UILabel {
        let attributedStringParagraphStyle = NSMutableParagraphStyle()
        attributedStringParagraphStyle.alignment = NSTextAlignment.center
        let attributedString = NSAttributedString(
            string: text,
            attributes:[
                NSAttributedString.Key.paragraphStyle: attributedStringParagraphStyle,
                NSAttributedString.Key.strokeWidth: fontSize * 0.05,
                NSAttributedString.Key.foregroundColor: UIColor.white,
                NSAttributedString.Key.strokeColor: UIColor(color),
                NSAttributedString.Key.font: UIFont(name:"Coiny-Regular", size: fontSize)!
            ]
        )

        let strokeLabel = UILabel(frame: CGRect.zero)
        strokeLabel.attributedText = attributedString
        strokeLabel.backgroundColor = UIColor.clear
        strokeLabel.sizeToFit()
        strokeLabel.center = CGPoint.init(x: 0.0, y: 0.0)
        return strokeLabel
    }

    func updateUIView(_ uiView: UILabel, context: Context) {}
}
 

Использование:

 struct MyView: View {
   var body: some View {
     GeometryReader { geo in
        StrokedText(text: "STORE", width: 0.5, color: Color.black, fontSize: geo.size.width * 0.08)
     }
   }
}
 

Если .foregroundColor не работает, как я могу установить цвет заливки для текста?

Ответ №1:

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

 .strokeWidth: fontSize * -0.05