iOS 7에서 Apple은 새로운 기본 탐색 동작을 추가했습니다. 화면 왼쪽 가장자리에서 스 와이프하여 탐색 스택으로 돌아갈 수 있습니다. 그러나 내 앱 에서이 동작은 내 사용자 정의 왼쪽 메뉴와 충돌합니다. UINavigationController에서이 새로운 제스처를 비활성화 할 수 있습니까?
답변
해결책을 찾았습니다.
목표 -C :
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
스위프트 3+ :
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
답변
제스처를 비활성화로 설정하는 것이 항상 작동하지는 않는다는 것을 알았습니다. 그것은 효과가 있지만, 한 번은 backgesture를 사용한 후에 만되었습니다. 두 번째로 백 제스처를 트리거하지 않습니다.
나를 위해 수정은 제스처를 위임하고 NO를 반환하도록 shouldbegin 메소드를 구현하는 것이 었습니다.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Disable iOS 7 back gesture
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Enable iOS 7 back gesture
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
답변
NavigationController에서 제스처 인식기를 제거하십시오. iOS 8에서 작동합니다.
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
[self.navigationController.view removeGestureRecognizer:self.navigationController.interactivePopGestureRecognizer];
답변
iOS 8부터 허용되는 답변이 더 이상 작동하지 않습니다. 메인 게임 화면에서 제스처를 해제하려면 스 와이프를 중지해야했습니다.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
답변
Twan의 답변을 약간 수정했습니다.
- 뷰 컨트롤러가 다른 제스처 인식기의 대리인으로 설정되었을 수 있습니다.
nil
루트 뷰 컨트롤러로 돌아가서 다른 곳으로 이동하기 전에 스 와이프 제스처를 만들 때 델리게이트를 설정하면 중단 문제가 발생합니다.
다음 예제는 iOS 7을 가정합니다.
{
id savedGestureRecognizerDelegate;
}
- (void)viewWillAppear:(BOOL)animated
{
savedGestureRecognizerDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.interactivePopGestureRecognizer.delegate = savedGestureRecognizerDelegate;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
return NO;
}
// add whatever logic you would otherwise have
return YES;
}
답변
루트 vc에서 이것을 설정하십시오 :
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:YES];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
답변
스위프트
navigationController!.interactivePopGestureRecognizer!.enabled = false