Плъзнете навигация с 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