2013-08-12 3 views
8

На Mac всегда можно найти местоположение мыши «вне потока событий» (т. Е. Даже если вы не подписались на какие-либо методы делегата для mouseUp: и др.), Позвонив по номеру [NSEvent mouseLocation].Прикосновение к запуску на iOS

Есть ли какой-либо способ для iOS получать текущие события касания, не прослушивая touchesBegan:?

Я спрашиваю потому, что есть по крайней мере одна ситуация, в которой touchesBegan не называется: при запуске приложения, если прикосновение уже идет, touchesBegan никогда не называют. На самом деле, ни один из методов UIEvent, связанных с касанием, не был близок к тому, что я могу сказать (и, видимо, UIApplication/UIWindow's sendEvent:).

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

+0

Что означает «при запуске приложения» означает для вас приложение? Выполняете ли вы какие-то трудоемкие действия по основному потоку во время загрузки? – yurish

+0

«при запуске приложения» - это «когда пользователь нажимает значок приложения на трамплине, и приложение открывается». Не получать события касания не *, а потому, что приложение чрезмерно обременено тяжелой обработкой; это потому, что прикосновения, которые происходят, когда приложение открывается, не доставляются в приложение обычными средствами. Я пытаюсь выяснить, знает ли кто-нибудь путь вне нормального цикла, возможно, подклассифицирует и переопределяет, чтобы получить прикосновения, которые происходят произвольно, с любого метода, в любое время. – SG1

+0

Я думаю, что это невозможно. UIApplication не подходит для подкласса, и это точка входа для вашего приложения. –

ответ

6

Этого не может быть сделано. Простая причина: события касания не относятся к вашему приложению. Каждое касание принадлежит некоторому элементу пользовательского интерфейса (или ответчику). Как вы уже знаете, этот элемент получает начатые, перемещенные, завершенные, отмененные сообщения.

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

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

И на Mac вы можете запросить позицию мыши, но в нормальном потоке приложения всегда будет указатель мыши, прежде чем вы получите событие mouse up.

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

+0

Спасибо за время, поставленное в ответ, и разъяснение. Хотя это, по-видимому, настоящий канонический ответ, я чувствую, что хочу подождать, пока не будет ответа на этот вопрос, например, в iOS 9 после того, как будет рассмотрен отчет об ошибке;) Я думаю, что позже я смогу изменить ответы ... – SG1

0

Я думаю, вы могли бы просто «расширить» запуск приложения. Когда у меня были трудоемкие задачи во время запуска приложения, я показывал один и тот же экран заставки с помощью идентификатора UIActivityIndicator, когда действие выполнялось.

Вы можете просто создать NSTimer, подождать около 2 секунд и в течение этого времени проверить наличие касаний, пока экран всплеска будет отображаться.

Для этого в приложенииDidFinishLaunch нажмите ViewController, который выглядит точно таким же, как заставка, и проверяет наличие касаний в этом ViewController. После этих 2 секунд продолжите нормальную инициализацию. Такое поведение также помогает, если у вас есть трудоемкие задачи во время инициализации.

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

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

-2

Вы можете попробовать обработать hitTest: withEvent: вместо этого.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

Поскольку в соответствии с яблочным доком «Возвращает дальний потомок приемника в иерархии вида (в том числе себя), который содержит заданную точку.»

Смежные вопросы