Проведите навигацию с помощью PKRevealController

У меня есть PKRevealController с видом спереди и справа. Жест панорамирования включен, поэтому я могу открыть нужный вид смахиванием — отлично. Смахивание в другую сторону ничего не делает, как и должно быть, потому что нет левого контроллера для открытия — отлично. Поэтому вместо этого я хочу реализовать пролистывание (слева направо), которое вызовет обратную навигацию моего приложения.

Я добавил распознаватель жестов смахивания в свой контроллер (спереди) - ничего не происходит.

Если я устанавливаю RecognizesPanningOnFrontView:NO на контроллере показа, то мой недавно добавленный распознаватель жестов работает — я могу вернуться назад.

Так что сейчас или то, или другое. Я хочу оба. Как я могу это сделать?


person artooras    schedule 19.07.2013    source источник


Ответы (1)


Я реализовал собственное решение. На самом деле два решения, так как мне нужны были разные для случаев, когда я разрешал и запрещал PKRevealController действия смахивания.

Случай 1: setRecognizesPanningOnFrontView:NO

Этот случай довольно прост — я просто добавляю UISwipeGestureRecognizer, который вызывает мой метод back:

UISwipeGestureRecognizer *backSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(back)];
[backSwipe setDirection:UISwipeGestureRecognizerDirectionRight];
[self.view addGestureRecognizer:backSwipe];

Случай 2: setRecognizesPanningOnFrontView:YES

Этот немного сложнее. Чтобы избежать конфликта с распознавателем жестов, мне пришлось использовать распознаватель жестов PKRevealController. Конечно, я реализовал это только тогда, когда PKRevealController не имеет leftViewController.

Итак, я регистрирую класс, который хочу реализовать обратную навигацию, в качестве слушателя уведомлений:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(back:)
                                             name:NOTIFICATION_BACK_SWIPE
                                           object:self];

А затем в файле PKRevealController.m в методе - (void)moveFrontViewRightwardsIfPossible просто опубликуйте уведомление:

[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_BACK_SWIPE object:[(UINavigationController *)self.frontViewController topViewController]];

Здесь я передаю в качестве объекта уведомления самого получателя UIViewController. Я делаю это для того, чтобы только этот конкретный экземпляр UIViewController реагировал на это уведомление. В противном случае, если бы у вас было больше UIViewControllers в стеке UINavigationController, которые подписаны на получение этого уведомления, все они вызвали бы UINavigationController до popViewController, что привело бы к случайному количеству шагов назад, в то время как мы хотим, чтобы это произошло только один раз.

Вот и все. Наслаждаться.

person artooras    schedule 06.01.2014