Изменение шрифта NSAttributedString при сохранении атрибутов формата

У меня есть существующая NSAttributedString, которая может включать измененные пользователем атрибуты (то есть Bold, Italic, Underline). Мне нужно изменить базовый шрифт от Georgia до Helvetica, сохраняя атрибуты формата. Установка шрифта так же отменяет все атрибуты формата (например, Georgia-Bold):

NSDictionary *fontFaceStyle = [[NSDictionary alloc] init]; fontFaceStyle = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:12.0]}; [combinedAttributedTextString setAttributes:fontFaceStyle range:NSMakeRange(0, combinedAttributedTextString.length)]; 

Я видел несколько разных, но связанных потоков, которые предлагают перечисление каждого диапазона атрибутов в строке, изменение шрифта, а затем повторное применение соответствующих атрибутов формата. Это кажется довольно интенсивным, и я не уверен, как вы примените его, когда могут присутствовать несколько атрибутов (т. Е. Bold AND Italic AND Underline).

Спасибо за любые предложения.

У меня была одна и та же проблема, и перечисление работает хорошо. Здесь «диапазон» – это диапазон, над которым вы хотите работать, а «newFamily» – это семейство шрифтов. Я использую textStorage, который, как я полагаю, делает полезную очистку для этих типов исправлений, когда beginEditing() вызовами beginEditing() / endEditing() .

 textStorage.beginEditing() textStorage.enumerateAttributes(in: range, options: [], using: { attr, attrRange, _ in if let font = attr[NSFontAttributeName] as? NSFont { let newFont = NSFontManager.shared().convert(font, toFamily: newFamily) storage.addAttribute(NSFontAttributeName, value: newFont, range: attrRange) } }) textStorage.endEditing()