2014-09-02 9 views
8

Obecnie używamy rozwiązania podobnego do wspomnianego here (patrz odpowiedź Aresa). To nie działa w iOS8.iOS8: Odrzuć arkusz formularza na zewnątrz kranu

Mam arkusz formularza i chcę go zamknąć, gdy tylko użytkownik kliknie w przyciemniony widok "za" arkuszem formularza Wcześniej wydawało się to możliwe, dodając do okna funkcję rozpoznawania gestów i sprawdzając lokalizację kliknięcia, aby sprawdzić, czy znajdował się poza bieżącym arkuszem formularza;

Zauważyłem również, że punkt musi zostać przekonwertowany (przełącznik X i Y) urządzenia jest używany w trybie poziomym. Poza tym, teraz odbiera tylko gesty, które pojawiły się z poziomu arkusza formularza, gdzie przed każdym naciśnięciem palca w dowolnym miejscu na ekranie wywołałoby zdarzenie.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)]; 
    self.recognizer.numberOfTapsRequired = 1; 
    self.recognizer.cancelsTouchesInView = NO; 
    [self.view.window addGestureRecognizer:self.recognizer]; 
} 

- (void)handleTapBehind:(UITapGestureRecognizer *)sender 
{ 
    if (sender.state == UIGestureRecognizerStateEnded) 
    { 
     CGPoint location = [sender locationInView:nil]; 
     if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) && IOS8) 
     { 
      location = CGPointMake(location.y, location.x); 
     } 

     // if tap outside pincode inputscreen 
     BOOL inView = [self.view pointInside:[self.view convertPoint:location  fromView:self.view.window] withEvent:nil]; 
     if (!inView) 
     { 
      [self.view.window removeGestureRecognizer:sender]; 
      [self dismissViewControllerAnimated:YES completion:nil]; 
     } 
    } 
} 

Odpowiedz

10

Jak wspomniano w wątku ty odwołanie, należy dodać UIGestureRecognizerDelegate i wdrożenie metod:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    return YES; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    return YES; 
} 
+0

Nie jestem pewien co masz na myśli? W jaki sposób odzwierciedla zmiany API w ios8? Wspomniany kod działa dobrze w ios7. Czy jest to sposób na obejście błędu ios8? –

+0

Aby opublikowany kod działał w iOS8, dodaj "UIGestureRecognizerDelegate" do swojego 'self.recognizer' i dodaj te delegowane metody. – Erich

+0

Tak, to rozwiązało! Dzięki :) –