Make part of a UILabel bold in Swift

后端 未结 9 1927
面向向阳花
面向向阳花 2020-12-02 12:50

I have a UILabel I\'ve made programmatically as:

var label = UILabel()

I\'ve then declared some styling for the label, includi

相关标签:
9条回答
  • 2020-12-02 13:30

    Just sharing my own quite-flexible implementation in Swift 4.0. Cause there are some requirements, like mine currently, that you need to set not only bold but italic the part of a label's text.

    import UIKit
    
    extension UILabel {
    
        /** Sets up the label with two different kinds of attributes in its attributed text.
         *  @params:
         *  - primaryString: the normal attributed string.
         *  - secondaryString: the bold or highlighted string.
         */
    
        func setAttributedText(primaryString: String, textColor: UIColor, font: UIFont, secondaryString: String, secondaryTextColor: UIColor, secondaryFont: UIFont) {
    
            let completeString = "\(primaryString) \(secondaryString)"
    
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.alignment = .center
    
            let completeAttributedString = NSMutableAttributedString(
                string: completeString, attributes: [
                    .font: font,
                    .foregroundColor: textColor,
                    .paragraphStyle: paragraphStyle
                ]
            )
    
            let secondStringAttribute: [NSAttributedStringKey: Any] = [
                .font: secondaryFont,
                .foregroundColor: secondaryTextColor,
                .paragraphStyle: paragraphStyle
            ]
    
            let range = (completeString as NSString).range(of: secondaryString)
    
            completeAttributedString.addAttributes(secondStringAttribute, range: range)
    
            self.attributedText = completeAttributedString
        }
    }
    
    0 讨论(0)
  • 2020-12-02 13:33

    You can directly do on String if you prefer:

    extension String {
    func withBoldText(text: String, font: UIFont? = nil) -> NSAttributedString {
      let _font = font ?? UIFont.systemFont(ofSize: 14, weight: .regular)
      let fullString = NSMutableAttributedString(string: self, attributes: [NSAttributedString.Key.font: _font])
      let boldFontAttribute: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: _font.pointSize)]
      let range = (self as NSString).range(of: text)
      fullString.addAttributes(boldFontAttribute, range: range)
      return fullString
    }}
    

    Usage:

    label.attributeString = "my full string".withBoldText(text: "full")
    
    0 讨论(0)
  • 2020-12-02 13:34

    You will want to use attributedString which allows you to style parts of a string etc. This can be done like this by having two styles, one normal, one bold, and then attaching them together:

    let boldText = "Filter:"
    let attrs = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 15)]
    let attributedString = NSMutableAttributedString(string:boldText, attributes:attrs)
    
    let normalText = "Hi am normal"
    let normalString = NSMutableAttributedString(string:normalText)
    
    attributedString.append(normalString)
    

    When you want to assign it to a label:

    label.attributedText = attributedString
    
    0 讨论(0)
  • 2020-12-02 13:34

    for the ones who prefer extensions

    Swift 5.0

        /// will set a regual and a bold text in the same label
        public func setRegualAndBoldText(regualText: String,
                                           boldiText: String) {
    
            let attrs = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: font.pointSize)]
            let regularString = NSMutableAttributedString(string: regualText)
            let boldiString = NSMutableAttributedString(string: boldiText, attributes:attrs)
            regularString.append(boldiString)
            attributedText = regularString
        }
    

    and use:

    label.setRegualAndBoldText(regualText: "height: ", boldiText: "1.65 :(")
    
    0 讨论(0)
  • 2020-12-02 13:37

    Swift 4.0 solution

    let font = UIFont.systemFont(ofSize: 14)
    
    func boldSearchResult(searchString: String, resultString: String) -> NSMutableAttributedString {
        let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: resultString)
    
        guard let regex  = try? NSRegularExpression(pattern: searchString.lowercased(), options: []) else {
            return attributedString
        }
    
        let range: NSRange = NSMakeRange(0, resultString.count)
    
        regex.enumerateMatches(in: resultString.lowercased(), options: [], range: range) { (textCheckingResult, matchingFlags, stop) in
            guard let subRange = textCheckingResult?.range else {
                return
            }
    
            attributedString.addAttributes([NSAttributedString.Key.font : font], range: subRange)
        }
    
        return attributedString
    }
    
    0 讨论(0)
  • 2020-12-02 13:41

    If you know which character place values you want to bold I created a function which takes ranges of characters and optional fonts (use nil if you just want to use the standard system font of size 12), and returns an NSAttributedString which you can attach to a label as its attributed text. I wanted to bolden the 0th, 10th, 22-23rd, 30th and 34th characters of my string so i used [[0,0], [10,10], [22,23], [30,30], [34,34]] for my boldCharactersRanges value.

    Usage:

    func boldenParts(string: String, boldCharactersRanges: [[Int]], regularFont: UIFont?, boldFont: UIFont?) -> NSAttributedString {
        let attributedString = NSMutableAttributedString(string: string, attributes: [NSAttributedString.Key.font: regularFont ?? UIFont.systemFont(ofSize: 12)])
        let boldFontAttribute: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: boldFont ?? UIFont.boldSystemFont(ofSize: regularFont?.pointSize ?? UIFont.systemFontSize)]
        for range in boldCharactersRanges {
            let currentRange = NSRange(location: range[0], length: range[1]-range[0]+1)
            attributedString.addAttributes(boldFontAttribute, range: currentRange)
            }
        return attributedString
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 180, height: 50)
        label.numberOfLines = 0
        label.center = view.center
        let text = "Under the pillow is a vogue article"
        let secretMessage = boldenParts(string: text, boldCharactersRanges: [[0,0], [10,10], [22,23], [30,30], [34,34]], regularFont: UIFont(name: "Avenir", size: 15), boldFont: UIFont(name: "Avenir-Black", size: 15))
        label.attributedText = secretMessage
        view.addSubview(label)
    }
    
    0 讨论(0)
提交回复
热议问题