Iphone SDK отклоняет модальные ViewControllers на ipad, щелкая за пределами - PullRequest
53 голосов
/ 12 апреля 2010

Я хочу отклонить контроллер модального представления FormSheetPresentation, когда пользователь нажимает за пределами модального представления ... Я видел множество приложений, делающих это (например, ebay на ipad), но я не могу понять, как, поскольку нижние представления отключено от прикосновений, когда модальные представления отображаются следующим образом (возможно, они представляют его как поповер?) ... у кого-нибудь есть предложения?

Ответы [ 14 ]

0 голосов
/ 24 января 2016

В Swift 2 / Xcode Version 7.2 (7C68) у меня работал следующий код.

Внимание: этот код следует поместить в файл ViewController.swift представленного FormSheet или Page Sheet, здесь: «PageSheetViewController.swift»

class PageSheetViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidAppear(animated: Bool) {
        let recognizer = UITapGestureRecognizer(target: self, action:Selector("handleTapBehind:"))
        recognizer.delegate = self
        recognizer.numberOfTapsRequired = 1
        recognizer.cancelsTouchesInView = false
        self.view.window?.addGestureRecognizer(recognizer)
    }

    func gestureRecognizer(sender: UIGestureRecognizer,
        shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
            return true
    }

    func handleTapBehind(sender:UIGestureRecognizer) {
        if(sender.state == UIGestureRecognizerState.Ended){
            var location:CGPoint = sender.locationInView(nil)

            // detect iOS Version 8.0 or greater
            let Device = UIDevice.currentDevice()
            let iosVersion = Double(Device.systemVersion) ?? 0
            let iOS8 = iosVersion >= 8

            if (iOS8) {
                // in landscape view you will have to swap the location coordinates
                if(UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation)){
                    location = CGPointMake(location.y, location.x);
                }
            }

            if(!self.view.pointInside(self.view.convertPoint(location, fromView: self.view.window), withEvent: nil)){
                self.view.window?.removeGestureRecognizer(sender)
                self.dismissViewControllerAnimated(true, completion: nil)
            }
        }
    }
}
0 голосов
/ 22 января 2015

Вы можете использовать MZFormSheetController вот так:

MZFormSheetController *formSheet = [[MZFormSheetController alloc] initWithSize:customSize viewController:presentedViewController];
formSheet.shouldDismissOnBackgroundViewTap = YES;
[presentingViewController mz_presentFormSheetController:formSheet animated:YES completionHandler:nil];
0 голосов
/ 17 ноября 2014

Я знаю, что уже поздно, но подумайте об использовании CleanModal (протестировано с iOS 7 и 8).

https://github.com/orafaelreis/CleanModal

0 голосов
/ 24 сентября 2014

Это вполне выполнимо.

Взгляните сюда

https://stackoverflow.com/a/26016458/4074557

Это NavigationController (модальный), который автоматически отключается для ipad (при нажатии снаружи)

Используйте ваш viewcontroller внутри него.

Надеюсь, это поможет.

...