Swift - все атрибуты текста с использованием раскадровки сбрасываются при программной настройке размера шрифта и запуске симулятора - PullRequest
0 голосов
/ 29 января 2020

На раскадровке я создал текстовое представление. Вставлено два абзаца текстового содержимого внутри textview. Выбрал пользовательские атрибуты на раскадровке и сделал несколько слов жирным. Когда я запускаю симулятор, все в порядке. Но когда я устанавливаю размер шрифта программно по отношению к «view.frame.height», жирные слова, которые я установил на раскадровке, сбрасываются на обычные слова.

Код: "abcTextView.font = abcTextView.font? .WithSize (self.view.frame.height * 0.021)"

Не удалось обойти эту проблему. Как я могу решить это?

1 Ответ

0 голосов
/ 30 января 2020

Проблема в том, что вы работаете с AttributedString. Посмотрите на превосходный ответ Мэнмала, если вам нужно больше контекста, и объяснение того, как работает код:

NSAttributedString, измените общий шрифт, НО оставьте все остальные атрибуты?

Вот простое применение расширения, которое он предоставляет, чтобы поместить его в контекст вашей проблемы:

class ViewController: UIViewController {

    @IBOutlet weak var myTextView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let newString = NSMutableAttributedString(attributedString: myTextView.attributedText)
        newString.setFontFace(font: UIFont.systemFont(ofSize: self.view.frame.height * 0.033))
        myTextView.attributedText = newString

    }

}

extension NSMutableAttributedString {
    func setFontFace(font: UIFont, color: UIColor? = nil) {
        beginEditing()
        self.enumerateAttribute(
            .font,
            in: NSRange(location: 0, length: self.length)
        ) { (value, range, stop) in

            if let f = value as? UIFont,
              let newFontDescriptor = f.fontDescriptor
                .withFamily(font.familyName)
                .withSymbolicTraits(f.fontDescriptor.symbolicTraits) {

                let newFont = UIFont(
                    descriptor: newFontDescriptor,
                    size: font.pointSize
                )
                removeAttribute(.font, range: range)
                addAttribute(.font, value: newFont, range: range)
                if let color = color {
                    removeAttribute(
                        .foregroundColor,
                        range: range
                    )
                    addAttribute(
                        .foregroundColor,
                        value: color,
                        range: range
                    )
                }
            }
        }
        endEditing()
    }
}
...