Sök…
Ändra text
Snabb
textView.text = "Hello, world!"
Objective-C:
textView.text = @"Hello, world!";
Ställ in tillskriven text
// Modify some of the attributes of the attributed string.
let attributedText = NSMutableAttributedString(attributedString: textView.attributedText!)
// Use NSString so the result of rangeOfString is an NSRange.
let text = textView.text! as NSString
// Find the range of each element to modify.
let tintedRange = text.range(of: NSLocalizedString("tinted", comment: ""))
let highlightedRange = text.range(of: NSLocalizedString("highlighted", comment: ""))
// Add tint.
attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue, range: tintedRange)
// Add highlight.
attributedText.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellow, range: highlightedRange)
textView.attributedText = attributedText
Ändra textjustering
Snabb
textView.textAlignment = .left
Objective-C
textView.textAlignment = NSTextAlignmentLeft;
UITextViewDelegate-metoder
Svara på redigeringsmeddelanden
-
textViewShouldBeginEditing(_:)
-
textViewDidBeginEditing(_:)
-
textViewShouldEndEditing(_:)
-
textViewDidEndEditing(_:)
Svara på textändringar
-
textView(_:shouldChangeTextIn:replacementText:)
-
textViewDidChange(_:)
Svara på URL
-
textView(_: UITextView, shouldInteractWithURL: NSURL, inRange: NSRange) -> Bool
Byt teckensnitt
Snabb
//System Font
textView.font = UIFont.systemFont(ofSize: 12)
//Font of your choosing
textView.font = UIFont(name: "Font Name", size: 12)
Objective-C
//System Font
textView.font = [UIFont systemFontOfSize:12];
//Font of your choosing
textView.font = [UIFont fontWithName:@"Font Name" size:12];
Ändra textfärg
Snabb
textView.textColor = UIColor.red
Objective-C
textView.textColor = [UIColor redColor];
UITextView med HTML-text
NSString *htmlString = @"<p> This is an <b>HTML</b> text</p>";
NSAttributedString *attributedString = [[NSMutableAttributedString alloc]
initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding]
options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
documentAttributes: nil
error: nil
];
_yourTextView.attributedText = attributedString;
// If you want to modify the font
field.font = [UIFont fontWithName:@"Raleway-Regular" size:15];
Autodetektera länkar, adresser, datum och mer
UITextView
har inbyggt stöd för att automatiskt upptäcka en mängd data. Data som kan upptäckas automatiskt inkluderar för närvarande:
enum {
UIDataDetectorTypePhoneNumber = 1 << 0,
UIDataDetectorTypeLink = 1 << 1,
UIDataDetectorTypeAddress = 1 << 2,
UIDataDetectorTypeCalendarEvent = 1 << 3,
UIDataDetectorTypeNone = 0,
UIDataDetectorTypeAll = NSUIntegerMax
};
Aktiverar automatisk upptäckt
// you may add as many as you like by using the `|` operator between options
textView.dataDetectorTypes = (UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber);
Om den är aktiverad visas texten som en hyperlänk på UITextView
Klickbar data
För att låta klicka på länken (vilket resulterar i olika åtgärder beroende på datatyp) måste du se till att UITextView
är valbar men inte redigerbar och att användarinteraktion är aktiverad
textView.editable = NO;
textView.selectable = YES;
textView.userInteractionEnabled = YES; // YES by default
Kontrollera om det är tomt eller noll
Snabb
if let text = self.textView.text where !text.isEmpty {
// Do stuff for text
} else {
// Do stuff for nil text or empty string
}
Objective-C
if (self.textView.text.length > 0){
// Do stuff for text
} else {
// Do stuff for nil text or empty string
}
Få och ställa in markörpositionen
Användbar information
Själva början av textfälttexten:
let startPosition: UITextPosition = textView.beginningOfDocument
Slutet på textfälttexten:
let endPosition: UITextPosition = textView.endOfDocument
Det för närvarande valda intervallet:
let selectedRange: UITextRange? = textView.selectedTextRange
Få markörens position
if let selectedRange = textView.selectedTextRange {
let cursorPosition = textView.offsetFromPosition(textView.beginningOfDocument, toPosition: selectedRange.start)
print("\(cursorPosition)")
}
Ställ in markörens position
För att ställa in positionen ställer alla dessa metoder faktiskt in ett område med samma start- och slutvärden.
Till början
let newPosition = textView.beginningOfDocument
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
Till slutet
let newPosition = textView.endOfDocument
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
Till en position till vänster om den aktuella markörpositionen
// only if there is a currently selected range
if let selectedRange = textView.selectedTextRange {
// and only if the new position is valid
if let newPosition = textView.positionFromPosition(selectedRange.start, inDirection: UITextLayoutDirection.Left, offset: 1) {
// set the new position
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
}
}
Till en godtycklig position
Börja i början och flytta 5 tecken till höger.
let arbitraryValue: Int = 5
if let newPosition = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) {
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
}
Relaterad
Välj all text
textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.endOfDocument)
Välj ett textintervall
// Range: 3 to 7
let startPosition = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 3)
let endPosition = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 7)
if startPosition != nil && endPosition != nil {
textView.selectedTextRange = textView.textRangeFromPosition(startPosition!, toPosition: endPosition!)
}
Infoga text i den aktuella markörpositionen
textView.insertText("Hello")
anteckningar
Detta exempel kommer ursprungligen från en anpassning av detta Stack Overflow-svar .
Detta svar använder ett textfält, men samma begrepp gäller för
UITextView
.Använd
textView.becomeFirstResponder()
för att fokuseratextView.becomeFirstResponder()
och få tangentbordet att visas.Se det här svaret för hur du får texten inom ett visst intervall.
Relaterad
- Hur man skapar ett intervall i Swift (behandlar indirekt frågan om varför vi måste använda
selectedTextRange
här snarare än baraselectedRange
)
Ta bort extra paddningar för att passa en exakt uppmätt text.
UITextView
har extra paddningar som standard. Ibland är det irriterande, särskilt om du vill mäta lite text utan att se instans och placera dem på något område exakt.
Gör detta för att ta bort sådana stoppningar.
messageTextView.textContainerInset = UIEdgeInsetsZero
messageTextView.textContainer.lineFragmentPadding = 0
Nu kan du mäta textstorlek med hjälp av NSAttributedString.boundingRectWithSize(...)
och ändra storlek på en UITextView
bara för att passa den i texten.
let budget = getSomeCGSizeBudget()
let text = getSomeAttributedString()
let textSize = text.boundingRectWithSize(budget, options: [.UsesLineFragmentOrigin, .UsesFontLeading], context: nil).size
messageTextView.frame.size = textSize // Just fits.