SplitViewController GestureRecognizer эффекты затрагивает левый край экрана - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть приложение, которое работает на iPhone и iPad и использует UISplitViewController, который я сворачиваю на iPhone и использую элемент навигации для перехода между главными и подробными контроллерами представления.На detailViewController у меня есть большой квадратный вид, который покрывает ширину iPhone, за вычетом некоторого края края.Это представление получает события touchesBegan, toughesEnded, tap, doubleTap и longTap для использования в приложении.

Недавно при реализации некоторого кода UITest я обнаружил, что получаю нежелательные события touchedEnded рядом с левой стороной экрана на iPhone6 Плюс симулятор.Позже я обнаружил, что на iPhone 8 Plus и iPhone XR я не получаю ни трогательных, ни начальных, ни трогательных событий.За 40-ой точкой на дисплее все работает нормально.Затем я обнаружил, что 2x устройства имеют эту проблему до 10pt, но это в основном поглощается моим краевым краем.У iPad нет этой проблемы вообще, даже в портретном свернутом режиме.

Я разобрал свое приложение, чтобы найти, что это происходит, когда я использую SplitViewController.Затем я воссоздал проблему в тестовом примере, где я создал приложение Master-Detail и добавил представление в представление detailViewController, назвал его GameInputView, а затем добавил следующий файл:

//
//  GameInputView.swift

import UIKit

private var debug:String? = String()

class GameInputView:UIView {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!

        self.isExclusiveTouch = true

        let tapRecognizer1 = UILongPressGestureRecognizer(target: self, action:#selector(gameboardPressed(_:)))
        tapRecognizer1.numberOfTouchesRequired = 1

        self.addGestureRecognizer(tapRecognizer1)

        let tapRecognizer2 = UITapGestureRecognizer(target: self, action:#selector(gameboardDoubleTapped(_:)))
        tapRecognizer2.require(toFail: tapRecognizer1)
        tapRecognizer2.numberOfTapsRequired = 2

        self.addGestureRecognizer(tapRecognizer2)

        let tapRecognizer3 = UITapGestureRecognizer(target: self, action:#selector(gameboardTapped(_:)))
        tapRecognizer3.numberOfTapsRequired = 1
        tapRecognizer3.require(toFail: tapRecognizer2)

        self.addGestureRecognizer(tapRecognizer3)
    }

    var locationSave:CGPoint = CGPoint.zero

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("     device = \(deviceName), scale = \(UIScreen.main.scale)")

        guard let touch = touches.first else { return }
        locationSave = touch.location(in: self)

        print("gameBoard touchesBegan, location \(locationSave)")
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("                                Unwanted gameBoard touchesEnded!")

        //assert(UIScreen.main.scale == 3.0,"touchEnded is never called unless scale is 3.0")
        //assert(false,"touchEnded should never called")
    }

    @objc func gameboardTapped(_ gesture: UITapGestureRecognizer) {
        print("    GameBoard Tapped Action")
        let location = gesture.location(in: self)
        //assert(location == locationSave, "touch and tap don't agree on location")
    }

    @objc func gameboardDoubleTapped(_ gesture: UITapGestureRecognizer) {
        print("\n    GameBoard Double Tapped Action")

    }

    @objc func gameboardPressed(_ gesture: UITapGestureRecognizer) {
        print("\n    GameBoard Long Press Action")

        if gesture.state == .began {
        } else if gesture.state == .ended {
        }
    }
}

Вы можете проверить егодля себя.

Я отправил отчет об ошибках в Apple и подумал, что смогу закодировать нежелательные прикосновенияEnded до тех пор, пока не обнаружу, что мне не хватает TouchGegan, которые также отсутствуют.

Так что в крайнем случаеЯ пытаюсь найти и уничтожить SplitViewController PanGestureRecognizer.Первым делом я создал файл сопутствующего swift для SplitViewController, чтобы я мог изучить его view.recognizer и т. Д. Я установил для presentWithGesture значение false, но это не помогло.Я установил view.recognizers = nil или [], не помогло.Установить view.gestureRecognizers! .First! .IsEnabled = false, не помогло.

Наконец, я добавил UISplitViewControllerDelegate, и это исправило проблему, но я получаю только detailViewController и не могу перейти обратно к masterViewController.Все методы в UISplitViewControllerDelegate являются необязательными, поэтому, когда я говорю, что создал делегата, я имею в виду пустой делегат, просто добавьте протокол в определение класса и установите делегат = self, и это изменило функциональность SplitViewController.Так что теперь у меня есть полубесконечный набор способов использования этих методов для восстановления функциональности при сохранении моих событий прикосновений.

Итак, вопрос в том, нашел ли кто-нибудь обходной путь, чтобы получить события прикосновенийработает?

Левый край iPhone XR теперь мертв для меня.

...