I have an NSAttributedString which may have multiple subranges with different font styles and other attributes. How do I modify the size of font for the whole attributed string? Setting a font size of 20 should set pointSize of all fonts in the string to 20.
With these extensions you will be able to easily change font size of the NSAttributedString
in all of the subranges leaving other font parameters the same.
Usage
let label: UILabel = ...
let string: NSAttributedString = ...
label.attributedText = string.mutable.setFontSize(20)
Extensions
extension NSMutableAttributedString {
func setFontSize(_ fontSize: CGFloat) {
beginEditing()
enumerateAttribute(.font, in: completeRange) { value, range, _ in
guard
let fontFromAttribute = value as? UIFont,
let descriptor = fontFromAttribute.fontDescriptor
.withSymbolicTraits(fontFromAttribute.fontDescriptor.symbolicTraits)
else { return }
let font = UIFont(descriptor: descriptor, size: fontSize)
addAttribute(.font, value: font, range: range)
}
endEditing()
}
}
extension NSAttributedString {
var mutable: NSMutableAttributedString {
NSMutableAttributedString(attributedString: self)
}
var completeRange: NSRange {
NSRange(location: 0, length: self.length)
}
}