サーチ…
テキストを変更する
迅速
textView.text = "Hello, world!"
目標-C:
textView.text = @"Hello, world!";
属性付きテキストを設定する
// 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
テキストの配置を変更する
迅速
textView.textAlignment = .left
目標-C
textView.textAlignment = NSTextAlignmentLeft;
UITextViewDelegateメソッド
通知の編集への対応
-
textViewShouldBeginEditing(_:)
-
textViewDidBeginEditing(_:)
-
textViewShouldEndEditing(_:)
-
textViewDidEndEditing(_:)
テキストの変更に対する応答
-
textView(_:shouldChangeTextIn:replacementText:)
-
textViewDidChange(_:)
URLへの応答
-
textView(_: UITextView, shouldInteractWithURL: NSURL, inRange: NSRange) -> Bool
フォントを変更
迅速
//System Font
textView.font = UIFont.systemFont(ofSize: 12)
//Font of your choosing
textView.font = UIFont(name: "Font Name", size: 12)
目標-C
//System Font
textView.font = [UIFont systemFontOfSize:12];
//Font of your choosing
textView.font = [UIFont fontWithName:@"Font Name" size:12];
テキストの色を変更する
迅速
textView.textColor = UIColor.red
目標-C
textView.textColor = [UIColor redColor];
HTMLテキストを含むUITextView
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];
リンク、アドレス、日付などを自動検出する
UITextView
は、さまざまなデータを自動検出するためのサポートを内蔵しています。現在、自動検出できるデータには次のものが含まれます。
enum {
UIDataDetectorTypePhoneNumber = 1 << 0,
UIDataDetectorTypeLink = 1 << 1,
UIDataDetectorTypeAddress = 1 << 2,
UIDataDetectorTypeCalendarEvent = 1 << 3,
UIDataDetectorTypeNone = 0,
UIDataDetectorTypeAll = NSUIntegerMax
};
自動検出を有効にする
// you may add as many as you like by using the `|` operator between options
textView.dataDetectorTypes = (UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber);
有効にすると、テキストはUITextView
ハイパーリンクとして表示されます
クリック可能なデータ
リンクをクリックできるようにするには(データタイプによってアクションが異なる)、 UITextView
が選択可能だが編集可能でないことと、ユーザー対話が有効であることを確認する必要があります
textView.editable = NO;
textView.selectable = YES;
textView.userInteractionEnabled = YES; // YES by default
空または無しを確認する
迅速
if let text = self.textView.text where !text.isEmpty {
// Do stuff for text
} else {
// Do stuff for nil text or empty string
}
目標-C
if (self.textView.text.length > 0){
// Do stuff for text
} else {
// Do stuff for nil text or empty string
}
カーソル・ポジションの取得と設定
有用な情報
テキストフィールドテキストの最初の部分:
let startPosition: UITextPosition = textView.beginningOfDocument
テキストフィールドテキストの最後。
let endPosition: UITextPosition = textView.endOfDocument
現在選択されている範囲:
let selectedRange: UITextRange? = textView.selectedTextRange
カーソル位置を取得する
if let selectedRange = textView.selectedTextRange {
let cursorPosition = textView.offsetFromPosition(textView.beginningOfDocument, toPosition: selectedRange.start)
print("\(cursorPosition)")
}
カーソル位置を設定する
位置を設定するために、これらのメソッドはすべて実際に同じ開始値と終了値で範囲を設定しています。
最初に
let newPosition = textView.beginningOfDocument
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
最後まで
let newPosition = textView.endOfDocument
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
現在のカーソル位置の左側の1つの位置
// 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)
}
}
任意の位置
最初から始め、5文字を右に移動します。
let arbitraryValue: Int = 5
if let newPosition = textView.positionFromPosition(textView.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) {
textView.selectedTextRange = textView.textRangeFromPosition(newPosition, toPosition: newPosition)
}
関連する
すべてのテキストを選択
textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.endOfDocument)
テキストの範囲を選択する
// 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!)
}
現在のカーソル位置にテキストを挿入する
textView.insertText("Hello")
ノート
この例は、もともとこのStack Overflowの答えの適応から来ています 。
この答えはテキストフィールドを使用しますが、
UITextView
も同じ概念が適用されUITextView
。textView.becomeFirstResponder()
を使用して、テキストフィールドにフォーカスを合わせ、キーボードを表示させます。テキストをある範囲で取得する方法については、 この回答を参照してください。
関連する
- スウィフトに範囲を作成する方法 (私たちが使用しなければならない理由の問題で、間接的にお得な
selectedTextRange
いうだけよりも、ここでselectedRange
)
正確に測定されたテキストに合わせて余分なパディングを削除します。
UITextView
はデフォルトで追加のUITextView
があります。ビューインスタンスなしでテキストをいくつか測定し、ある特定の場所に正確に配置したい場合は、特に迷惑です。
このようなパディングを削除するには、これを実行します。
messageTextView.textContainerInset = UIEdgeInsetsZero
messageTextView.textContainer.lineFragmentPadding = 0
NSAttributedString.boundingRectWithSize(...)
を使用してテキストサイズを測定し、テキストに合わせるためにUITextView
サイズを変更することができます。
let budget = getSomeCGSizeBudget()
let text = getSomeAttributedString()
let textSize = text.boundingRectWithSize(budget, options: [.UsesLineFragmentOrigin, .UsesFontLeading], context: nil).size
messageTextView.frame.size = textSize // Just fits.