Я реализовал собственное решение. На самом деле два решения, так как мне нужны были разные для случаев, когда я разрешал и запрещал 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