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가 적용이 안된다.
(기존 label의 attributesText에 새로운 속성추가한 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
}
}
반응형
'Swift' 카테고리의 다른 글
Class와 Struct에 대하여 간단정리 - Swift (0) | 2022.04.12 |
---|---|
문자열에서 특정문자"들"을 다른 문자로 치환하는 방법 - Swift (0) | 2021.10.23 |
문자열에서 특정문자"들"을 원하는 문자로 치환하는 방법 - Swift (0) | 2021.10.23 |
최대공약수, 최대공배수 구하는 함수 - swift (0) | 2021.09.30 |
sort, sorted의 차이는 무엇일까? - swift (0) | 2021.09.30 |