При создании UIViewController, который не занимает весь экран, как мне закрыть его, нажав снаружи?

Я подписан на это руководство, чтобы создать контроллер представления наложения, используя frameOfPresentedViewInContainerView в iOS 8, но мне любопытно, как мне закрыть этот контроллер представления, основываясь на касании за пределами видимой области?


person Doug Smith    schedule 02.04.2015    source источник


Ответы (1)


Существует одно популярное решение, в котором вы добавляете UITapGestureRecognizer в окно и затем выполните тест нажатия, чтобы проверить, не было ли касание за пределами модальной рамки просмотра.

Однако, поскольку вы используете UIPresentationController, я бы предложил более универсальное решение:

В вашем подклассе UIPresentationController переопределите presentationTransitionWillBegin:

override func presentationTransitionWillBegin() {
    var dimView = UIView() // Use your specific subclass here
    dimView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5) // No need for this if you have your subclass defined in IB

    self.containerView?.addSubview(dimView)
    dimView.snp_makeConstraints { (make) -> Void in // I use SnapKit to avoid the NSLayoutConstraint nonsense
        make.edges.equalTo(self.containerView!)
    }
    dimView.addSubview(self.presentedViewController.view)

    let transitionCoordinator = self.presentedViewController.transitionCoordinator()

    dimView.alpha = 0
    transitionCoordinator?.animateAlongsideTransition({ (context) -> Void in
        dimView.alpha = 1
    }, completion: { (context) -> Void in

        })
    }

Это даст вам правильное затемнение, которое будет размещено за представленным контроллером представления. Теперь все зависит от вас, что вы делаете с этим затемнением, вы можете стилизовать его или разместить там кнопки:

введите здесь описание изображения

Я рекомендую определить это представление в построителе интерфейса, это значительно упрощает задачу, пример может выглядеть так:

class MyDimView: UIView {
    var onPrevAction: (() -> ())?
    var onNextAction: (() -> ())?
    var onTapAction: (() -> ())?

    @IBOutlet private var prevButton: UIButton!
    @IBOutlet private var nextButton: UIButton!
    @IBOutlet private var button: UIButton!

    @IBAction private func onPrevButtonTouched() {
        if let prevAction = self.onPrevAction {
            prevAction()
        }
    }

    @IBAction private func onNextButtonTouched() {
        if let nextAction = self.onNextAction {
            nextAction()
        }
    }

    @IBAction private func onViewTouched() {
        if let tapAction = self.onTapAction {
            tapAction()
        }
    }
}

Таким образом, у вас есть абсолютный контроль над тем, что происходит снаружи или с вашим представленным контроллером представления.

person lawicko    schedule 01.09.2015