У меня есть приложение, которое работает на 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 теперь мертв для меня.