2017-09-11 3 views
0

Ich versuche, mich mit CoreText vertraut zu machen, und ich begann, indem ich meine eigene Notiz-Anwendung machte.Wie man Text wie eine Blockquote in einem UITextView formatiert

Ich habe Regex in Verbindung mit AttributedStrings und versuche, im Wesentlichen die Funktionalität des StackOverflow Textfelds nachzuahmen, das ich jetzt eintippe.

Ich habe alle gemeinsamen Dinge wie:

fett

kursiv

Header

emphasis blocks

Aber ich kämpfen, um einen Block Zitat zu machen/Codeblock.

So etwas, wo es zu einer eigenen Zeile bricht und eine Box erstellt, die an den Rand geht, egal wie lang der Text ist.

And it changes the background color 

Ist dies überhaupt möglich streng AttributedStrings zu tun mit? Ich habe einige alte Beispiele gesehen, wo HTML/CSS injiziert wird, aber ich hatte gehofft, dass ich es mit einer speziellen Kombination von NSAttributedStringKey erreichen könnte.

Antwort

1

Ja, das ist möglich. Hier ist ein Beispiel Spielplatz in Swift 3:

import UIKit 
import PlaygroundSupport 

let richText = NSMutableAttributedString() 

let chunk0 = NSAttributedString(string: "But I am struggling to make a block quote/code block.\n\n") 
richText.append(chunk0) 

let paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.headIndent = 20 
// Note that setting paragraphStyle.firstLineHeadIndent 
// doesn't use the background color for the first line's 
// indentation. Use a tab stop on the first line instead. 
paragraphStyle.tabStops = [NSTextTab(textAlignment: .left, location: paragraphStyle.headIndent, options: [:])] 

let chunk1 = NSAttributedString(string: "\tSomething like this where it breaks to its own line and creates a box that goes to the edge no matter how long the text is.\n", attributes: [ 
    NSParagraphStyleAttributeName: paragraphStyle, 
    NSBackgroundColorAttributeName: UIColor.yellow 
]) 
richText.append(chunk1) 

let chunk2 = NSAttributedString(string: "\nIs this even possible to do strictly using AttributedStrings?") 
richText.append(chunk2) 

let textView = UITextView(frame: CGRect(x: 0, y: 0, width: 120, height: 400)) 
textView.backgroundColor = .white 
textView.attributedText = richText 
PlaygroundPage.current.liveView = textView 

Hier ist die Ausgabe:

result

Aber es ist wichtig, im Auge zu behalten, dass UITextView ist viel weniger leistungsfähig (für Layout und Styling) als eine Web Aussicht. Wenn Sie sich etwas einfallen lassen wollen (wie Stackoverflow mit der dunkleren Farblinie am linken Rand der Blockquote-Box), sollten Sie nur HTML und CSS erzeugen und eine Web-Ansicht verwenden.

+0

Ahh, das ist, wie Sie das Absatz-Styling verwenden :) Danke! Mir sind auch die Optionen aufgefallen: [...] an die ich gar nicht gedacht habe, aber hilfreich wäre. Also danke doppelt! – sargturner

Verwandte Themen