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;