私が必要なのは、NSAttributedString
のすべての属性をループして、フォントサイズを大きくすることだけです。これまでのところ、属性をループして操作することに成功しましたが、NSAttributedString
に保存できません。コメントアウトした行が機能しません。保存する方法?
NSAttributedString *attrString = self.richTextEditor.attributedText;
[attrString enumerateAttributesInRange: NSMakeRange(0, attrString.string.length)
options:NSAttributedStringEnumerationReverse usingBlock:
^(NSDictionary *attributes, NSRange range, BOOL *stop) {
NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
UIFont *font = [mutableAttributes objectForKey:NSFontAttributeName];
UIFont *newFont = [UIFont fontWithName:font.fontName size:font.pointSize*2];
[mutableAttributes setObject:newFont forKey:NSFontAttributeName];
//Error: [self.richTextEditor.attributedText setAttributes:mutableAttributes range:range];
//no interfacce for setAttributes:range:
}];
このようなものはうまくいくはずです:
NSMutableAttributedString *res = [self.richTextEditor.attributedText mutableCopy];
[res beginEditing];
__block BOOL found = NO;
[res enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, res.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value) {
UIFont *oldFont = (UIFont *)value;
UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize * 2];
[res removeAttribute:NSFontAttributeName range:range];
[res addAttribute:NSFontAttributeName value:newFont range:range];
found = YES;
}
}];
if (!found) {
// No font was found - do something else?
}
[res endEditing];
self.richTextEditor.attributedText = res;
この時点で、res
には、すべてのフォントが元のサイズの2倍の新しい属性付き文字列があります。
開始する前に、元の属性付き文字列からNSMutableAttributedString
を作成します。ループの各反復で、変更可能な属性付き文字列に対してaddAttribute:value:range:
を呼び出します(これにより、その範囲の古い属性が置き換えられます)。
ここにSwift maddyの回答のポートがあります(これは私にとって非常にうまく機能します!)。これは、小さな拡張機能で囲まれています。
import UIKit
extension NSAttributedString {
func changeFontSize(factor: CGFloat) -> NSAttributedString {
guard let output = self.mutableCopy() as? NSMutableAttributedString else {
return self
}
output.beginEditing()
output.enumerateAttribute(NSAttributedString.Key.font,
in: NSRange(location: 0, length: self.length),
options: []) { (value, range, stop) -> Void in
guard let oldFont = value as? UIFont else {
return
}
let newFont = oldFont.withSize(oldFont.pointSize * factor)
output.removeAttribute(NSAttributedString.Key.font, range: range)
output.addAttribute(NSAttributedString.Key.font, value: newFont, range: range)
}
output.endEditing()
return output
}
}