수색…
텍스트 변경
빠른
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)
현재 커서 위치의 왼쪽에있는 한 위치
// 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
에도 같은 개념이 적용됩니다.textView.becomeFirstResponder()
를 사용하여 텍스트 필드에 포커스를두고 키보드를 표시합니다.일부 범위에서 텍스트를 가져 오는 방법은 이 대답 을 참조하십시오.
관련
- 어떻게 스위프트의 범위 만들기 (우리가 사용하는 이유의 문제를 간접적으로 비교
selectedTextRange
단지보다는 여기selectedRange
)
정확하게 측정 된 텍스트에 맞게 추가 패딩을 제거하십시오.
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.