[ios] iOS 7의 UINavigationController에서 뒤로 스 와이프 동작을 비활성화하는 방법

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의 답변을 약간 수정했습니다.

  1. 뷰 컨트롤러가 다른 제스처 인식기의 대리인으로 설정되었을 수 있습니다.
  2. 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