ASP.NET C # - метод уведомлений в реальном времени

Apple делает это очень сложно. Как отмечают другие, метод делегата вызывается, но только тогда, когда isEditable является false, или когда пользователь делает нажатие и удерживает вложение. Если вы хотите получить информацию о простом взаимодействии с краном во время редактирования, забудьте об этом.

Я пошел по путям touchesBegan: и hitTest:, как с проблемами. Способы касания называются после , [[8] уже обработали взаимодействие, а hitTest: слишком грубо, потому что оно противоречит первому статусу ответчика и т. Д.

] Мое решение в конце концов было распознавателями жестов. Apple использует их внутри, что объясняет, почему touchesBegan: в действительности не является жизнеспособным: распознаватели жестов уже обработали событие.

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

Класс распознавателя жестов ниже, наряду с расширение для добавления к UITextView. Я добавляю его в свой подкласс UITextView в awakeFromNib, вот так. (Вам не нужно использовать подкласс, если у вас его нет.)

override func awakeFromNib() {
    super.awakeFromNib()

    let recognizer = AttachmentTapGestureRecognizer(target: self, action: #selector(handleAttachmentTap(_:)))
    add(recognizer)

, и я обрабатываю действие, вызывая существующий метод UITextViewDelegate textView(_:,shouldInteractWith:,in:,interaction:). Вы можете так же легко поместить код обработки непосредственно в действие, а не использовать делегат.

@IBAction func handleAttachmentTap(_ sender: AttachmentTapGestureRecognizer) {
    let _ = delegate?.textView?(self, shouldInteractWith: sender.attachment!, in: NSRange(location: sender.attachmentCharacterIndex!, length: 1), interaction: .invokeDefaultAction)
}

Вот основной класс.

import UIKit
import UIKit.UIGestureRecognizerSubclass

/// Recognizes a tap on an attachment, on a UITextView.
/// The UITextView normally only informs its delegate of a tap on an attachment if the text view is not editable, or a long tap is used.
/// If you want an editable text view, where you can short cap an attachment, you have a problem.
/// This gesture recognizer can be added to the text view, and will add requirments in order to recognize before any built-in recognizers.
class AttachmentTapGestureRecognizer: UIGestureRecognizer {

    /// Character index of the attachment just tapped
    private(set) var attachmentCharacterIndex: Int?

    /// The attachment just tapped
    private(set) var attachment: NSTextAttachment?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        attachmentCharacterIndex = nil
        attachment = nil

        let textView = view as! UITextView
        if touches.count == 1, let touch = touches.first, touch.tapCount == 1 {
            let point = touch.location(in: textView)
            let glyphIndex: Int? = textView.layoutManager.glyphIndex(for: point, in: textView.textContainer, fractionOfDistanceThroughGlyph: nil)
            let index: Int? = textView.layoutManager.characterIndexForGlyph(at: glyphIndex ?? 0)
            if let characterIndex = index, characterIndex < textView.textStorage.length {
                if NSAttachmentCharacter == (textView.textStorage.string as NSString).character(at: characterIndex) {
                    attachmentCharacterIndex = characterIndex
                    attachment = textView.textStorage.attribute(.attachment, at: characterIndex, effectiveRange: nil) as? NSTextAttachment
                    state = .recognized
                } else {
                    state = .failed
                }
            }
        } else {
            state = .failed
        }
    }
}

extension UITextView {

    /// Add an attachment recognizer to a UITTextView
    func add(_ attachmentRecognizer: AttachmentTapGestureRecognizer) {
        for other in gestureRecognizers ?? [] {
            other.require(toFail: attachmentRecognizer)
        }
        addGestureRecognizer(attachmentRecognizer)
    }

}

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

0
задан madth3 22 November 2013 в 16:53
поделиться