Swift 4 UITextView를 편리하게 사용하는 Extension을 작성해 보았습니다.

소개



안녕하세요
UITextView를 세밀하게 제어하려고 할 때,
조사했을 때에 기사가 조금 낡았거나, Swift4. 0으로 이름이 바뀌거나 하거나 조금 고민했기 때문에, 정리로서 써 보았습니다. 도움이되면 다행입니다.Apple Swift version 4.1 Xcode Version 9.3.1

샘플



caret의 위치를 ​​취득한다


  • currentCaretOffset

  • 왼쪽에서 세어, 외형상의 몇번째에 caret가 있는지 돌려줍니다.

    // デフォルトにあるプロパティ
    textView.selectedRange.location // 8
    // Extension
    textView.currentCaretOffset     // 7
    

    캐럿을 선두·말미로 이동시킨다


  • caretMove(to: UITextViewDirection)


  • // ←ボタン 先頭へ移動します
    textView.caretMove(to: .leading)
    // →ボタン 末尾に移動します
    textView.caretMove(to: .trailing)
    

    캐럿을 현재 위치에서 이동


  • caretMove(to: Int)

  • 현재의 위치로부터 지정의 수를 이동시킵니다.+ 그렇다면 오른쪽 방향으로, - 그렇다면 왼쪽 방향으로 이동합니다.

    // →ボタン
    textView.caretMove(to: 1)
    // ←ボタン
    textView.caretMove(to: -1)
    

    caret의 색 변경


  • caretColor

  • 실은 기호로 변수명을 바꾼 것뿐입니다.

    // キャレットを緑色に変更する
    textView.caretColor = UIColor.green
    

    모든 문자 선택


  • selectAllTexts()

  • UITextView의 모든 문자를 선택합니다.


    // 文字全てを選択します
    textView.selectAllTexts()
    

    문자를 지정된 범위에서 선택


  • selectTexts(start:length:)

  • start는 시작 위치이고 length는 선택하는 범위입니다.


    // 見た目上の文字の長さから選択します
    textView.selectTexts(start: 0, length: 7)
    

    문자가 선택되었는지 여부


  • isTextSelected
  • UITextRangeisEmpty 는 아래 이미지와 같아서 조금만 개선해 보았습니다.



    소스 코드



    변수명 등 자유롭게 변경해 주십시오.

    UITextFieldExt.swift
    import UIKit
    
    extension UITextView {
    
        enum UITextViewDirection {
            case leading
            case trailing
        }
    
        // キャレットの色を変更します
        var caretColor: UIColor {
            get { return self.tintColor }
            set { self.tintColor = newValue}
        }
    
        // 文字が選択されているかどうか
        var isTextSelected: Bool {
            guard let range = selectedTextRange else { return false }
            return !range.isEmpty
        }
    
        // 先頭から数えたキャレットの見た目上の文字の位置を示します
        var currentCaretOffset: Int {
            let current = selectedRange.location
            let diff = text.length - text.count
            return current - diff
        }
    
        // キャレットを移動させます
        func caretMove(to direction: UITextViewDirection) {
            switch direction {
            case .leading:
                self.selectedTextRange = textRange(from: beginningOfDocument, to: beginningOfDocument)
            case .trailing:
                self.selectedTextRange = textRange(from: endOfDocument, to: endOfDocument)
            }
        }
    
        // キャレットを移動させます
        func caretMove(to offset: Int) {
            let current = selectedRange.location
            let to = current + offset
            self.selectedRange = NSRange(location: to, length: 0)
        }
    
        // 文字全てを選択します
        func selectAllTexts() {
            self.selectedTextRange = textRange(from: beginningOfDocument, to: endOfDocument)
        }
    
        // 見た目上の文字の長さから選択します
        func selectTexts(start: Int = 0, length: Int) {
            let diff = text.length - text.count
            self.selectedRange = NSRange(location: start, length: length + diff)
        }
    
        // NSRangeとして取得します
        var selectedTextNSRange: NSRange? {
            guard let range = selectedTextRange else { return nil }
            let location = offset(from: beginningOfDocument, to: range.start)
            let length = offset(from: range.start, to: range.end)
            return NSRange(location: location, length: length)
        }
    }
    

    참고로 한 기사


  • UITextField apple
  • UITextField의 캐럿을 조작 (UITextRange 및 UITextPosition) the moon at dawn

  • 봐 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기