Настраиваемая UILabel и отображаемые атрибуты в Interface Builder Swift 4.2

#ios #swift

#iOS #swift

Вопрос:

Я создал пользовательский UILabel и определил некоторые стили. Он отображал атрибуты только в Interface Builder. При сборке ничего не изменилось. Чего мне здесь не хватает?

 @objc public enum CustomLabelStyle: Int {
    case ScreenTitle = 0
    case H2 = 1
    case H3 = 2
    case BodyText = 3
    case BodyTextGray = 4
    case DescriptionText = 5
}

@IBDesignable class JWLabel: UILabel {

    @IBInspectable open var style: Int = 0 {
        didSet {
            customStyle(style: style)
        }
    }

    func customStyle(style: Int){
        var font = UIFont(name: "HelveticaNeue-Bold", size: 12)
        var color = UIColor(hexString: "#8E8E8E")
        var paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 3

        switch style {
        case CustomLabelStyle.ScreenTitle.rawValue:
            font = UIFont(name: "HelveticaNeue", size: 18)
            color = UIColor(hexString: "#404040")
            break
        case CustomLabelStyle.H2.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 20)
            color = UIColor(hexString: "#404040")
            paragraphStyle.lineSpacing = 5
            break
        case CustomLabelStyle.H3.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 16)
            color = UIColor(hexString: "#404040")
            paragraphStyle.lineSpacing = 4
        case CustomLabelStyle.BodyText.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 13)
            color = UIColor(hexString: "#404040")
            paragraphStyle.lineSpacing = 3
            break
        case CustomLabelStyle.BodyTextGray.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 13)
            color = UIColor(hexString: "#8E8E8E")
            paragraphStyle.lineSpacing = 3
            break
        case CustomLabelStyle.DescriptionText.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 12)
            color = UIColor(hexString: "#8E8E8E")
            paragraphStyle.lineSpacing = 2
            break
        default:
            break
        }

        let attribute = [NSAttributedString.Key.font : font,
                         NSAttributedString.Key.foregroundColor : color,
                         NSAttributedString.Key.paragraphStyle : paragraphStyle]
        self.attributedText = NSAttributedString(string: self.text ?? "", attributes: attribute)
    }
}
  

Комментарии:

1. Вы должны установить свой пользовательский стиль при изменении текста. Прямо сейчас этот пользовательский стиль применяется к тексту при инициализации UILabel и вызове first didSet for style . На данный момент текст пуст, поэтому он не отображается ни в чем. Когда вы задаете свой текст, он не получает оформления.

Ответ №1:

Проблема заключается в customStyle вызове метода перед заданным текстом на метке. итак, изменение связано с вызовом customStyle метода.

 @IBDesignable class JWLabel: UILabel {

    @IBInspectable open var style: Int = 0

    func customStyle(style: Int){
        var font = UIFont(name: "HelveticaNeue-Bold", size: 12)
        var color = UIColor(hexString: "#8E8E8E")
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 3

        switch style {
        case CustomLabelStyle.ScreenTitle.rawValue:
            font = UIFont(name: "HelveticaNeue", size: 18)
            color = UIColor(hexString: "#404040")
            break
        case CustomLabelStyle.H2.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 20)
            color = UIColor(hexString: "#404040")
            paragraphStyle.lineSpacing = 5
            break
        case CustomLabelStyle.H3.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 16)
            color = UIColor(hexString: "#404040")
            paragraphStyle.lineSpacing = 4
        case CustomLabelStyle.BodyText.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 13)
            color = UIColor(hexString: "#404040")
            paragraphStyle.lineSpacing = 3
            break
        case CustomLabelStyle.BodyTextGray.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 13)
            color = UIColor(hexString: "#8E8E8E")
            paragraphStyle.lineSpacing = 3
            break
        case CustomLabelStyle.DescriptionText.rawValue:
            font = UIFont(name: "HelveticaNeue-Bold", size: 12)
            color = UIColor(hexString: "#8E8E8E")
            paragraphStyle.lineSpacing = 2
            break
        default:
            break
        }

        let attribute = [NSAttributedString.Key.font : font,
                         NSAttributedString.Key.foregroundColor : color,
                         NSAttributedString.Key.paragraphStyle : paragraphStyle]
        self.attributedText = NSAttributedString(string: self.text ?? "", attributes: attribute)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.customStyle(style: style)
    }
}

//Set text on a label
    lblTest.text = "This is the dummy text for test"
  

Комментарии:

1. У меня есть вопрос. Я выполняю функцию customStyle в layoutSubviews экземпляре didSet для рендеринга IB. Это плохая производительность?