0
votes

Formater instantanément un UITextView en utilisant AttributedString

Je développe un éditeur de texte enrichi macOS qui applique un style prédéfini pour chaque ligne de la vue de texte.

Pour formater les lignes, j'utilise NSAttributedString , puis NSAttributedString cette chaîne dans mon UITextView . Pour faciliter les choses, j'utilise un outil appelé SwiftRichString .

Mon code ressemble à ci-dessous. C'est simple et fonctionne bien.

import Cocoa
import SwiftRichString
import AppKit

class ViewController: NSViewController {
    @IBOutlet var textView: NSTextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Format the string
        let style = Style {
            $0.font = NSFont(name: "Arial", size: 20)
            $0.color = NSColor.black
            $0.alignment = .center
        }
        let attributedText = "Hello World!".set(style: style)

        // Add formatted string to the text view
        textView.textStorage?.append(attributedText)
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

}

Situation actuelle:

L'utilisateur tape une ligne formatée. Ensuite, lorsque l'utilisateur frappe Return et tape quelque chose, le format de la nouvelle ligne revient au style par défaut de UITextView.

Ce que je veux:

L'utilisateur tape une certaine ligne formatée, puis il appuie sur Retour . La ligne suivante doit être formatée dans un autre style prédéfini lors de vos déplacements .

Exemple:

  1. L'utilisateur tape la ligne de titre . Le style actuel est (Arial, gras, 20 pt).
  2. Il frappe Retour .
  3. La ligne suivante doit être stylisée en texte normal en utilisant un style prédéfini (Arial, 12 pt).

Note importante:

Dans mon code ci-dessus, j'ai pu formater la ligne facilement car elle est codée en dur. Mon vrai problème est de savoir comment formater instantanément la ligne suivante, car la ligne suivante sera saisie par l'utilisateur. Le style doit être appliqué à la ligne suivante avant que l'utilisateur ne commence à l'écrire.


2 commentaires

Peut-être définir les typingAttributtes : developer.apple.com/documentation/appkit/nstextview/... ?


Pourriez-vous s'il vous plaît élaborer plus?


3 Réponses :


0
votes

Peut-être que vous pourriez utiliser la optional func textViewDidChange(_ textView: UITextView)

https://developer.apple.com/documentation/uikit/uitextviewdelegate/1618599-textviewdidchange

et après le changement, analysez simplement le texte, trouvez de nouvelles lignes, divisez-les et appliquez tout le style que vous voulez


1 commentaires

textViewDidChange (et textDidChange pour macOS) ne feraient pas grand chose ici, car je dois appliquer le nouveau style avant que l' utilisateur ne commence à taper la ligne suivante.



2
votes

D'accord, je viens de comprendre comment utiliser typingAttributtes pour résoudre cette question (merci à @Larme pour l'indice).

   // Define next attributes
   let attributes: [NSAttributedString.Key: Any] = [
       .foregroundColor: NSColor.red,
       .font: NSFont(name: "Arial", size: 12)!,
   ]
   
   // Assign attributes to the text view typing attributes
   textView.typingAttributes = attributes

Très facile!


0 commentaires

1
votes

Pardon hors sujet. Si vous créez un éditeur de texte, vous pouvez envisager d'utiliser une vue de tableau, où chaque ligne de texte est une cellule - c'est un travail supplémentaire pour vous en tant que programmeur, mais cela améliorera considérablement les performances. C'est ainsi que l'éditeur Xcode est construit.


0 commentaires