Как включить детекторы данных в (иногда) редактируемом UITextView - PullRequest
2 голосов
/ 10 октября 2010

Кто-нибудь знает, как встроенному приложению Notes удается отображать детекторы данных, но при этом его UITextView все еще можно редактировать?

Я попытался изменить значение по умолчанию на NO (чтобы работали детекторы данных), а затем переопределитьUITextView затрагивает методы и устанавливает его в YES, но в итоге он прокручивается до конца, и мне приходится снова нажимать, чтобы фактически начать редактирование.

Я также попробовал его с помощью распознавателя жестов касания, и происходит то же самое.Я пытаюсь увидеть сенсорное событие в полете и повернуть его для редактирования в ДА, чтобы UITextView начал редактирование в точке касания, но без костей - я не могу заставить его передать событие касания в UITextView, если ябеспорядок с его редактируемым свойством.

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Простым хаком было бы поставить прозрачный вид поверх текстового представления, который бы перехватывал сенсорные события. Когда кто-то коснется прозрачности, установите текстовое представление на редактируемое, а также сделайте его первым респондентом, чтобы появилась клавиатура.

Затем, когда вы переуступаете статус первого респондента на клавиатуре (т.е. пользователь завершил редактирование), установите для редактируемого флага значение NO.

[EDIT]

Чтобы найти размер строки, чтобы вы могли выяснить, где сопоставить касание / курсор. Используйте это:

 CGSize *sizeOfString = [YourString sizeWithFont:[UIFont systemFontOfSize:yourTextViewFontSize]
                               constrainedToSize:CGSizeMake(widthOfYourTextView,
                                                            heightOfYourTextView)
                                   lineBreakMode:UILineBreakModeWordWrap];

[РЕДАКТИРОВАТЬ x2] Вы пытались поместить два textview друг на друга? Один из них недоступен для редактирования с включенными детекторами данных, а другой - для редактирования, но с альфа-значением 0,0. Когда текст изменяется в одном, скопируйте текст в другой.

0 голосов
/ 24 июля 2017

Просто создайте подкласс UITextView и переопределите func touchesEnded(_:with:) следующим образом (в Swift 4):

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)

    // Only triggered when not in editing mode.
    if !isEditable {

        // Turning off editable will make the data detectors available.
        // (I set my data detectors in Interface Builder)
        isEditable = true

        // Retreive the insert point from touch.
        guard let location = touches.first?.location(in: self) else { fatalError() }
        guard let position = closestPosition(to: location) else { fatalError() }
        guard let range: UITextRange = self.textRange(from: position, to: position) else { fatalError() }

        // You will want to make the text view enter editing mode by one tap, not two.
        becomeFirstResponder()

        // Set the insert point.
        selectedTextRange = range
    }
}

Поскольку эта функция не будет вызываться, если вы нажимаете ссылки или выбираете строки, она хорошо работает сДетекторы данных.

Чтобы снова включить детекторы данных, просто установите isEditable на false, вероятно в объекте делегата:

func textViewDidEndEditing(_ textView: UITextView) {
    textView.isEditable = false
}

Ключ находится при повороте точки вставки изприкосновение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...