programing

Swift에서의 UITextField 및 UITextView 커서 위치 가져오기 및 설정

lovejava 2023. 4. 9. 20:53

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