我正在按照本教程制作一个覆盖视图控制器,frameOfPresentedViewInContainerView
在 iOS 8 中使用,但我很好奇,我将如何根据在可见区域之外的点击来关闭这个视图控制器?
问问题
618 次
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 回答