0

我正在按照本教程制作一个覆盖视图控制器,frameOfPresentedViewInContainerView在 iOS 8 中使用,但我很好奇,我将如何根据在可见区域之外的点击来关闭这个视图控制器?

4

1 回答 1

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()
        }
    }
}

这样,您就可以绝对控制外部或呈现的视图控制器发生的事情。

于 2015-09-01T11:51:50.167 回答