Swift에서의 UITextField 및 UITextView 커서 위치 가져오기 및 설정
제가 실험하고 있는 건UITextField
커서 위치 조작 방법에 대해 설명합니다.목표-C의 답변과 같은 여러 가지 관계를 찾았습니다.
하지만 Swift와 함께 작업하고 있기 때문에 현재 커서 위치를 Swift로 설정하는 방법을 배우고 싶었습니다.
아래 답변은 Objective-C에서 제가 실험하고 번역한 결과입니다.
다음 내용은 다음 두 가지 모두에 적용됩니다.UITextField
그리고.UITextView
.
유용한 정보
텍스트 필드 텍스트의 맨 앞부분:
let startPosition: UITextPosition = textField.beginningOfDocument
텍스트 필드 텍스트의 맨 끝:
let endPosition: UITextPosition = textField.endOfDocument
현재 선택된 범위:
let selectedRange: UITextRange? = textField.selectedTextRange
커서 위치 가져오기
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("\(cursorPosition)")
}
커서 위치 설정
위치를 설정하기 위해 이러한 모든 방법은 실제로 시작 및 종료 값이 동일한 범위를 설정합니다.
처음부터
let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
끝까지
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
현재 커서 위치 왼쪽에 있는 한 위치로
// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {
// and only if the new position is valid
if let newPosition = textField.position(from: selectedRange.start, offset: -1) {
// set the new position
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
}
임의의 위치로
처음부터 시작해서 오른쪽으로 5자 이동합니다.
let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
관련된
모든 텍스트 선택
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
텍스트 범위 선택
// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)
if startPosition != nil && endPosition != nil {
textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}
현재 커서 위치에 텍스트 삽입
textField.insertText("Hello")
메모들
사용하다
textField.becomeFirstResponder()
텍스트 필드에 초점을 맞추고 키보드를 표시합니다.
「 」를 참조해 주세요.
제 경우 Dispatch Queue를 사용해야 했습니다.
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async {
textField.selectedTextRange = ...
}
}
이것과 다른 스레드에서는 아무것도 동작하지 않았다.
PS: 어떤 스레드에서 textViewDidBeginEditing이 실행되고 있는지 다시 확인했는데, 모든 UI가 실행되어야 하는데, main.asynch를 사용한 약간의 지연이 왜 기능하는지 모르겠습니다.
let range = field.selectedTextRange
field.text = "hello world"
field.selectedTextRange = range
점에서의 커서 위치 설정:
textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))
커서 위치를 재설정하는 경우:
textView.endFloatingCursor()
주의: 이 예는 Textview와 Textfield 모두에서 작동합니다.
게시된 앱 중 하나에서 textView가 실제로 textView의 맨 위 줄에 있는 단어를 삭제한 후 왼쪽부터 시작된다는 것도 몰랐습니다.캐럿이 왼쪽으로 이동했을 뿐만 아니라 텍스트를 입력할 때 캐럿이 있던 위치에서 왼쪽으로 이동했습니다.맨 위에 있는 선이 삭제되었을 때만 중간선이나 맨 아래선에는 표시되지 않습니다.
func textViewDidChange(_ textView: UITextView)
{
if myTextView.text!.count > 0
{
myTextView.textAlignment = .center
}
}
캐럿은 여전히 왼쪽으로 이동하므로 이상적이지는 않지만 적어도 'if' 문이 추가된 경우 중앙에서 의도한 대로 텍스트를 추가할 뿐 왼쪽에서 텍스트를 추가할 수는 없습니다.
언급URL : https://stackoverflow.com/questions/34922331/getting-and-setting-cursor-position-of-uitextfield-and-uitextview-in-swift
'programing' 카테고리의 다른 글
Forked Repo에서 풀 요청을 업데이트하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
---|---|
WPF 바인딩을 사용한2개의 명령어파라미터 전달 (0) | 2023.04.09 |
WPF 앱과 Winform의 비즈니스 앱의 장점 (0) | 2023.04.09 |
Select-String에서 캡처된 그룹을 가져오려면 어떻게 해야 합니까? (0) | 2023.04.09 |
Respect Router v4 - 현재 경로를 얻는 방법 (0) | 2023.04.04 |