iOS 15 이후에 사용되며 개별 문자 또는 문자 범위에 대한 attributes
이 있는 문자열입니다.
Attributes
시각적 스타일, 안내 액세스를 위한 접근성, 데이터 원본 간 연결을 위한 하이퍼링크 데이터와 같은 특성을 제공합니다.
Attribute key는 각 속성의 이름과 값 유형을 제공합니다.
Foundation 및 SwiftUI와 같은 frameworks는 공통 키를 정의하며, custom extension에서 고유한 키를 정의할 수 있습니다.
String Attributes
가장 자세하게 설명하면 다음과 같이 AttributeContainer
를 만들고 기존 특성 문자열에 병합하여 특성을 설정합니다.
var attributedString = AttributedString("This is a string with empty attributes.")
var container = AttributeContainer()
container[AttributeScopes.AppKitAttributes.ForegroundColorAttribute.self] = .red
attributedString.mergeAttributes(container, mergePolicy: .keepNew)
attributed's string의 subscript(_:) method
를 사용하면 AttributeContainer
의 명시적인 사용을 생략하여 설정할 수 있습니다.
attributedString[AttributeScopes.AppKitAttributes.ForegroundColorAttribute.self] = .yellow
AttributedString은 Swift의 [[Attributes]]에 설명된대로 동적 멤버 조회를 지원하기 때문에 dot syntax를 사용하여 아래 첨자에 액세스할 수 있습니다.
attributedString.foregroundColor = .green
🚧 색이 적용되지 않는 이슈
공식 문서와 같은 코드로 UIkit의 UIButton attributedTitle에 테스트
attributedString.foregroundColor = .green
: 적용되지 않음attributedString.foregroundColor = .systemGreen
: 적용됨attributedString[AttributeScopes.AppKitAttributes.ForegroundColorAttribute.self] = .green
: 적용됨
AttributedString
의 runs
속성을 반복하여 고유한 특성 조합으로 문자열의 일부에 액세스할 수 있습니다.
AttributedString.Runs은 문자의 특성이 변경될 때 시작되고 끝납니다. 이 속성을 사용하면 for-in syntax로 반복됩니다.
특정 범위의 색을 변경
var attributedString = AttributedString("The first month of your subscription is free")
attributedString.foregroundColor = .systemGray
let range = attributedString.range(of: "free")!
attributedString[range].foregroundColor = UIColor.systemRed
Custom attributes
AttributedStringKey
를 준수하는 형식을 만들고 AttributeScope
에서 수집하여 고유한 custom attributes
을 정의할 수 있습니다. 또한 사용자 지정 키는 호출자가 점 구문을 사용하여 특성에 액세스할 수 있도록 AttributeDynamicLookup
를 확장해야 합니다.
// AttributedString에서 Key값으로 접근 가능
enum OutlineColorAttribute : AttributedStringKey {
typealias Value = UIColor
static let name = "OutlineColor"
}
enum ShadowColorAttribute : AttributedStringKey {
typealias Value = UIColor
static let name = "OutlineColor"
}
extension AttributeScopes {
struct MyTextStyleAttributes : AttributeScope {
let outlineColor : OutlineColorAttribute // OutlineColorAttribute.Value == Color
let shadowColor : ShadowColorAttribute // ShadowColorAttribute.Value == Color
// etc.
}
}
// dot syntax를 사용하게 만드는 extension
extension AttributeDynamicLookup {
subscript<T: AttributedStringKey>(dynamicMember keyPath: KeyPath<AttributeScopes.MyTextStyleAttributes, T>) -> T {
return self[T.self]
}
}
// 사용되는 custom attributes
var myAttributedString = AttributedString("Hello, world")
myAttributedString.outlineColor = .red
🚥 Custom attributes 언제 사용할까?
GitHub에 찾아보니 링크와 같은 특정 문장의 경우에 밑줄, 다른 색상 등을 적용하기 위해 사용됩니다.
- 참고한 링크
NSAttributedString 그리고 AttributedString
SwiftUI
가 이전에는 NSAttributedString
에 대한 지원이 부족했으나 새로운 AttributedString
을 통해 완벽한 지원을 하게 되었습니다. 반면 UIkit
에서는 NSAttributedString
을 지원했습니다.
// NSAttributedString -> AttributedString
AttributedString.init(_ nsStr: NSAttributedString)
// AttributedString -> NSAttributedString
convenience NSAttributedString.init(_ attrStr: AttributedString)
SwiftUI에서 좀 더 NSAttributedString과 같이 사용하기 위해 만들어진 거라 생각됩니다.
사용하기 좋은 부분으로는 문자열에서 특정 부분만 다르게 표현하기에 편리할 거라 생각됩니다.
Custom attributes의 사용은 다양한 방법으로도 사용될 수 있겠지만, 몇 개의 예제를 GitHub로 찾아보니 링크 관련 문자열을 변경하여 사용되는 것을 확인할 수 있었습니다.
'Language > Swift' 카테고리의 다른 글
[Swift] UIImage, CGImage 그리고 CIImage 언제 사용되나 (0) | 2024.02.14 |
---|---|
[Swift] Timer vs DispatchSourceTimer (1) | 2023.11.26 |
[Swift] UIButton Configuration (0) | 2023.11.15 |
[Swift] AutoLayout 오토레이아웃 변경 (0) | 2023.11.07 |
[SwiftUI] WWDC23 Discover Observation in SwiftUI (1) | 2023.09.17 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!