IOS 7 Back Button Pop Gesture

В iOS 7 появился новый салфетка для поп-жестов: вы прокручиваете слева направо в левой части экрана, а UINavigationController возвращается к предыдущему UIViewController.

Когда я создаю пользовательскую кнопку возврата, подобную этой, салфетки для поглаживания не работают больше:

UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:self action:@selector(navigateBack)];
[customBackButton setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[customBackButton setBackButtonBackgroundImage:barBackBtnImgHighlighted forBarMetrics:UIBarMetricsDefault];
self.navigationItem.backBarButtonItem = customBackButton;

Как я могу использовать пользовательскую кнопку "Назад" и иметь собственный салфетки для поглаживания?

Update:

Что происходит в navigateBack:

- (void)navigateBack {
    [self.navigationController popViewControllerAnimated:YES];
}

Ответы

Ответ 1

Просто добавьте следующую строку кода:

[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

Вы можете добавить свой собственный UIGestureRecognizer и поместить UIViewController самостоятельно. Для получения дополнительной информации см. docs.

Ответ 2

Нет необходимости добавлять свой собственный распознаватель жестов. UINavigationController уже делает это за вас. Перед включением необходимо установить делегат для интерактивногоPopGestureRecognizer.

Сделайте следующие две вещи:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];

Ответ 3

Я использую

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"nav_back.png"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"nav_back.png"]];

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];

Ответ 4

Чтобы избежать сбоев, вы должны быть осторожны с тем, как вы добавляете и удаляете свой настраиваемый селектор. Причина в том, что контроллер навигации остается во время нажатия на контроллер popping. Как уже было сказано после добавления пользовательской кнопки "Назад" + "Селектор", вы должны сделать следующее в viewDidApear.

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
       self.navigationController.interactivePopGestureRecognizer.enabled = YES;
       self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
       [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(navigateBack)];
    }

Затем в viewWillDisapear do

        if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
        {
           [self.navigationController.interactivePopGestureRecognizer removeTarget:self action:@selector(performCompletion)];
        }

Время этих вызовов - это ключ. В противном случае вы можете столкнуться с сбоями, подробнее см. Причину в здесь

Ответ 5

Появится новый распознаватель жестов UIScreenEdgePanGestureRecognizer. Вы можете добавить его в свой вид и обработать соответственно (вызов navigateBack), реплицируя поведение навигации диспетчера представлений.

Ответ 6

Что вы делали в "navigateBack"?

Используйте этот метод следующим образом:

- (void)navigateBack
{
    [self.navigationController popViewControllerAnimated:YES];
}

Ответ 7

попробуйте добавить это в пользовательскую кнопку возврата   self.navigationController.interactivePopGestureRecognizer.delegate = (id) self;