UITextView Горизонтальная и вертикальная прокрутка с правильным позиционированием курсора в Swift - PullRequest
5 голосов
/ 31 мая 2019

Я работаю над проектом, в котором мне нужно сделать UITextView с горизонтальной прокруткой. Формулировка проблемы определена ниже

Я попытался поместить UITextview в ScrollView для горизонтальной прокрутки, как было предложенов другом подобном решении вопроса о переполнении стека, в то время как прокрутка работает, есть несколько проблем, связанных с положением курсора, таких как:

  • Динамическая установка ширины UITextView в соответствии с шириной самой большой строки контента (достижимо)
  • Курсор не отображается на экране при увеличении или уменьшении содержимого, т.е. при добавлении содержимого в той же строке или удалении содержимого между ними UITextView не обрабатывает положение курсора, курсор отлично переходит на начало строки и возвращается к текущемуположение, и не отображается на экране.
  • UITextView должен иметь возможность прокрутки только по горизонтали или вертикали. (Необходимо отключить диагональную прокрутку).

Прикрепление текущего кода яэкспериментируя, такжепробовал другие ответы на подобные вопросы, не работает.: * 10101

class ViewController: UIViewController, UITextViewDelegate, UIScrollViewDelegate {

@IBOutlet weak var scroll:UIScrollView!
@IBOutlet weak var textView:UITextView!

var displayStr = ""
var strSize:CGRect!
var font:UIFont!
var maxSize:CGSize!

override func viewDidLoad() {
    super.viewDidLoad()

    displayStr = textView.text
    textView.delegate = self
    scroll.delegate = self
    scroll.addSubview(textView)
    textView.isEditable = true
    textView.isScrollEnabled = false
    maxSize = CGSize(width: 9999, height: 9999)
    font = UIFont(name: "Menlo", size: 16)!
    textView.font = font
    updateWidth()
}

func updateWidth() {

    strSize = (displayStr as NSString).boundingRect(with: maxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font : font!], context: nil)

    if strSize.width > self.view.frame.width {
        textView.frame = CGRect(x: 0, y: 0, width: strSize.width + 50, height: view.frame.height+10)
    }
    scroll.frame = CGRect(x: 0, y: 100, width: view.frame.width, height: view.frame.height)
    scroll.contentSize = CGSize(width: strSize.width + 30, height: strSize.height)
}

func textViewDidChange(_ textView: UITextView) {
    updateWidth()
}

Вот так выглядит мой вывод

This is how my output looks

...