iPad: трогает Начал не вызываться при перетаскивании пальца от верхней границы экрана - PullRequest
3 голосов
/ 15 ноября 2010

Я пишу приложение для iPad, где вы можете перетаскивать экран одним или двумя пальцами.Я использую методы touchesBegan, touchesMoved и touchesEnded для распознавания касаний.У меня включено несколько касаний для просмотра.

Теперь я узнал одно странное поведение.Если я наведу палец за верхнюю границу экрана и перетащу его вниз на экран, я не получу вызов touchsBegan или touchesMoved.Это не может быть воспроизведено для других границ экрана.

Единственный другой случай, когда это может быть воспроизведено, - это когда я использую альбомную ориентацию с кнопкой «Домой» влево.В этом случае я получаю такое же поведение для верхней границы экрана.

Кто-нибудь знает об этом или испытывает то же самое при тестировании?

Редактировать: я провел дополнительное тестирование.Область, в которой обычно находится строка состояния, очень хорошо принимает прикосновения или начало касания, если я опущу палец в этой области или сдвину его вверх из любого нижнего положения экрана.Ввод не будет распознан, только если я проведу пальцем вниз от позиции, которая находится полностью над краем экрана.

Edit2: Дополнительная информация: - Мое приложение использует представление OpenGL.- Статусная строка скрыта.- touchesBegan вызывается правильно при касании (скрытых) областей строки состояния во всех ориентациях.

Ответы [ 3 ]

3 голосов
/ 14 июня 2011

Я полагаю, что основная проблема заключается в том, что сенсорный слой на экране простирается на несколько пикселей выше видимого экрана, что означает, что касания, возникающие там, технически начинаются за пределами вашего представления UIViewController.Так как ваш UIViewController видит только касания, которые происходят в его представлении, он не увидит эти касания.Поэтому, если на экране вашего устройства коснуться пикселя или двух над видимыми пикселями, прикосновение будет отправлено на любой виртуальный слой, который существует в этой области за пределами экрана (возможно, в строке состояния?).Это препятствует тому, чтобы ваш UIViewController получал какие-либо касания, так как свип не возник в области просмотра вашего UIViewController.

Чтобы обойти это, во время applicationDidLaunch вы можете изменить размер вашего UIWindow, скажем, на 10 пикселей больше для каждогосторона, и создайте промежуточный слой 'background' UIViewController внутри него, соответствующий расширенному размеру окна.Затем установите представление основного интерфейса UIViewController как дочернее по отношению к представлению «фон», вставив 10 пикселей со всех сторон, чтобы соответствовать физическому размеру экрана.Если ваш интерфейс вращается, 10-пиксельное увеличение фонового представления придется повторно применять в методе willAnimateRotationToInterfaceOrientation в фоновом UIViewController каждый раз.

Наконец, в методах touchesBegan / Moved / Ended естьКонтроллер фонового представления направляет их касания непосредственно соответствующим методам в вашем основном контроллере пользовательского интерфейса.Вуаля!

Надеюсь, это поможет, Бен

0 голосов
/ 15 ноября 2010

к сожалению, touchSegan нельзя вызвать из области строки состояния.

0 голосов
/ 15 ноября 2010

Звучит правильно для меня. Если вы сначала проведете пальцем по строке состояния, он будет получать все сенсорные события для этого пальца, пока вы не поднимите его. Все события касания доставляются в представление, в котором началось касание.

...