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:
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.
3 Réponses :
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
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.
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!
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.
Peut-être définir les
typingAttributtes
: developer.apple.com/documentation/appkit/nstextview/... ?Pourriez-vous s'il vous plaît élaborer plus?