Swift

Label 안의 attributeText 관련 유용한 NSMutableAttributedString extension - swift

나른한코딩 2022. 6. 24. 16:15

 

 

 

UILabel에 여러개의 attributeText를 적용하다보니 가장 마지막에 작성된 속성만 적용되거나

레이블 선언부 혹은 기타 설정을 해주는 함수에서 코드가 매우 길어지게 되곤한다.

 

 

    let someLabel: UILabel = {
        let label = UILabel()
        label.textAlignment = .center
        label.font = .systemFont(ofSize: 16, weight: .bold)
        let colorAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue]
		let attributedString = NSAttributedString(string: label.text!, attributes: colorAttribute) 
		label.attributedText = attributedString
        return label
    }()

예를들어 위과 같은 방식으로 작성하게 되면 

글씨의 색상을은 파란색으로 적용이 되었을지라도 위에서 선언한 textAlignment가 적용이 안된다. 

(기존 labelattributesText에 새로운 속성추가한 attributedString 만들어 대입을 해줬기 때문)

 

 

 

 

 

그래서 모듈화를 해두면 좋을 것 같아서

extension으로 자주 사용하는 속성에 대한 메서드를 만들어보왔다. 

 

 


 

 

 

extension을 만들어 사용하면 아래와 같이 간결하고 가독성있는 코드로 작성할 수 있다.

 

    let someLabel: UILabel = {
        let label = UILabel()
        let text = "나는야 머찐 iOS 개발자"
        label.text = text
        label.lineBreakMode = .byCharWrapping
        label.font = .systemFont(ofSize: 14, weight: .regular)
        label.attributedText = NSMutableAttributedString()
            .lineSapcing(text, heightMultiple: 1.2)
            .highlight([.init(text: "iOS", color: .systemOrange])
        return label
    }()

 

이제 코드를 살펴보자!

 

 


 

 

 

 

하이라이트 처리 하기 (텍스트 색상 바꾸기)

extension NSMutableAttributedString {
    /// 프로퍼티 설명 - text: 변형하고자하는 텍스트, color: text의 변형예정인 tintColor 색상
    struct HighlightTarget {
        let text: String
        let color: UIColor
    }
    
    /// targets에 해당하는 HighlightTarget 의 text를 color로 변형하여 리턴한다.
    func highlight(_ targets: [HighlightTarget]) -> NSMutableAttributedString {
        let source = string
        
        for target in targets {
            let range = (source as NSString).range(of: target.text)
            addAttribute(.foregroundColor, value: target.color, range: range)
        }
        
        return self
    }
}

 

 

 

밑줄 긋는 함수

extension NSMutableAttributedString {
    /// targets의 text를 underlined로 변형하여 리턴한다.
    func underlined(_ targets: [String]) -> NSMutableAttributedString {
        let source = string
        
        for target in targets {
            let range = (source as NSString).range(of: target)
            addAttribute(.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: range)
        }
        
        return self
    }

 

 

 

 

 

행간 간격 (line spacing) 조정하는 함수

extension NSMutableAttributedString {
    /// target: 대상 문자열, Figma의 heightMultiple = lineHeightMultiple 값
    func lineSapcing(_ target: String, heightMultiple: CGFloat) -> NSMutableAttributedString {
        let style = NSMutableParagraphStyle()
        style.lineHeightMultiple = heightMultiple
        
        let attributes: [NSAttributedString.Key: Any] = [
            .paragraphStyle: style
        ]
        
        self.append(NSAttributedString(string: target, attributes:attributes))
        return self
    }
}

 

 

 

텍스트 정렬하는 함수

extension NSMutableAttributedString {
    /// target 텍스트 정렬하기
    func alignment(_ target: String, alignment: NSTextAlignment) -> NSMutableAttributedString {
        let source = string
        let style = NSMutableParagraphStyle()
        style.alignment = .center
        
        let range = (source as NSString).range(of: target)
        addAttribute(.paragraphStyle, value: style, range: range)
        return self
    }
}

 

 

 


 

 

코드 전문

import Foundation

extension NSMutableAttributedString {
    /// 프로퍼티 설명 - text: 변형하고자하는 텍스트, color: text의 변형예정인 tintColor 색상
    struct HighlightTarget {
        let text: String
        let color: UIColor
    }
    
    /// targets에 해당하는 HighlightTarget 의 text를 color로 변형하여 리턴한다.
    func highlight(_ targets: [HighlightTarget]) -> NSMutableAttributedString {
        let source = string
        
        for target in targets {
            let range = (source as NSString).range(of: target.text)
            addAttribute(.foregroundColor, value: target.color, range: range)
        }
        
        return self
    }
    
    /// targets의 text를 underlined로 변형하여 리턴한다.
    func underlined(_ targets: [String]) -> NSMutableAttributedString {
        let source = string
        
        for target in targets {
            let range = (source as NSString).range(of: target)
            addAttribute(.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: range)
        }
        
        return self
    }
    
    /// target: 대상 문자열, Figma의 heightMultiple = lineHeightMultiple 값
    func lineSapcing(_ target: String, heightMultiple: CGFloat) -> NSMutableAttributedString {
        let style = NSMutableParagraphStyle()
        style.lineHeightMultiple = heightMultiple
        
        let attributes: [NSAttributedString.Key: Any] = [
            .paragraphStyle: style
        ]
        
        self.append(NSAttributedString(string: target, attributes:attributes))
        return self
    }
    
    func alignment(_ target: String, alignment: NSTextAlignment) -> NSMutableAttributedString {
        let source = string
        let style = NSMutableParagraphStyle()
        style.alignment = .center
        
        let range = (source as NSString).range(of: target)
        addAttribute(.paragraphStyle, value: style, range: range)
        return self
    }
}
반응형