Показывать меню, пока пользователь взаимодействует - PullRequest
0 голосов
/ 31 января 2012

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

У меня есть UIViewController, на котором размещены пользовательские виды.Первый пользовательский вид - полный экран.Второй пользовательский вид - это фактически меню, которое скользит в вид из нижней части экрана, аналогично панели инструментов с пользовательской анимацией, а затем должно выдвигаться.

Текущее подтверждение: меню сдвигается в представление после задержки (после появления представления), и NSTimer начинает считать.Он остается в поле зрения в течение нескольких секунд, пока NSTimer не запустит другой метод, и этот метод вернет меню обратно.

Все работает нормально.

Что я хочу: Если пользователь начинает взаимодействовать с меню, переключателями, ползунком и т. Д., Я хочу, чтобы меню оставалось в представлении, задерживая запуск NSTimer до тех пор, пока пользователь не закончит взаимодействие.Затем уберите меню.

Для этого я использовал NSTimer в методе, который перемещает меню в представление, чтобы запустить другой метод, который убирает меню после X мсек.

Вметод, который убирает меню, я делаю недействительным таймер.

Я отверг метод tocuhesBegan, чтобы посмотреть, попадает ли область взаимодействия в границы меню, если так, то NSTimer сбрасывается для другогоX мсек.

Проблема: Если пользователь касается фона меню, это нормально, но если пользователь взаимодействует с переключателями, кнопками и слайдами в меню, menu.view нерегистрировать касания, что имеет смысл, потому что они являются передней линией и исчерпывают событие касания, поэтому событие касания не передается по иерархии.Но с другой стороны, это моя проблема !!

Я не могу переопределить каждый touchesBegan метод в каждом элементе menu.view.Как еще я могу зарегистрироваться для тех касаний, которые происходят в области menu.view?

Я пытался locationInView:nil, чтобы получить касания в окне, но это не регистрирует взаимодействия с кнопками и ползунками,и т. д.

Спасибо.

1 Ответ

1 голос
/ 31 января 2012

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

Создайте собственный класс UIWindow и реализуйте sendEvent следующим образом:

- (void)sendEvent:(UIEvent *)event 
{
    // Notify app to reset menu timer
    // ...

    [super sendEvent:event];
}

Использование вашего пользовательского интерфейса вместо стандартного зависит от того, как реализован ваш интерфейс.Если вы используете раскадровки, то вам необходимо реализовать метод getter window в делегате приложения следующим образом:

- (UIWindow*)window
{
    if (!_window) {
        _window = [[CustomWindow alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    }

    return _window;
}

В противном случае создайте экземпляр пользовательского UIWindow вместо стандартного в делегате приложения application:didFinishLaunchingWithOptions: метод.

У вас есть несколько вариантов получения уведомлений о сенсорных событиях.Вы можете использовать NSNotificationCenter для отправки и подписки на пользовательское уведомление, или вы можете реализовать свойство делегата в своем пользовательском UIWindow и установить свой UIViewController в качестве делегата для получения уведомлений о событиях касания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...