Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 通过点击视图控制器外部关闭部分显示的模态视图控制器_Swift_Uiviewcontroller_Transition_Modalviewcontroller - Fatal编程技术网

Swift 通过点击视图控制器外部关闭部分显示的模态视图控制器

Swift 通过点击视图控制器外部关闭部分显示的模态视图控制器,swift,uiviewcontroller,transition,modalviewcontroller,Swift,Uiviewcontroller,Transition,Modalviewcontroller,我使用UIViewControllerAnimatedTransitioning进行了自定义模式转换。转换完成后,以模式显示的视图控制器将填充父视图的一部分,而父视图控制器的某些部分仍然可见 我需要知道如何检测所示视图控制器(或部分显示的父视图控制器)外部的点击,以便使用它关闭模式。我知道如何向视图添加手势,但找不到要向哪个视图添加手势 我查看了stackoverflow,但并没有专门针对自定义模式转换的示例 下面是自定义转换的代码 class PartialSlideInAnimationCo

我使用UIViewControllerAnimatedTransitioning进行了自定义模式转换。转换完成后,以模式显示的视图控制器将填充父视图的一部分,而父视图控制器的某些部分仍然可见

我需要知道如何检测所示视图控制器(或部分显示的父视图控制器)外部的点击,以便使用它关闭模式。我知道如何向视图添加手势,但找不到要向哪个视图添加手势

我查看了stackoverflow,但并没有专门针对自定义模式转换的示例

下面是自定义转换的代码

class PartialSlideInAnimationController: NSObject, UIViewControllerAnimatedTransitioning {

    var direction: SlideAnimationDirectionStyle

    var duration: TimeInterval = 0.125
    var presentedControllerWidth: CGFloat      = 250

    let fadeAlpha: CGFloat = 0.5

    init(direction: SlideAnimationDirectionStyle) {
        self.direction = direction
        super.init()
    }

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return TimeInterval(duration)
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        // Setup Views
        guard let presentedFromVC = transitionContext.viewController(forKey: .from) else {transitionContext.completeTransition(false); return }
        guard let presentingToVC  = transitionContext.viewController(forKey: .to)   else {transitionContext.completeTransition(false); return }
        let contrainerView = transitionContext.containerView // アニメーションはこのViewで行われる、アニメーションを実装する presenter, presenteeをこの上に載せないとアニメーションが動かない

        // Setup Frames
        let positionHidden = CGRect(x: contrainerView.frame.width + 1, y: 0, width: presentedControllerWidth, height: contrainerView.frame.height)
        let positionShown  = CGRect(x: contrainerView.frame.width - presentedControllerWidth, y: 0, width: presentedControllerWidth, height: contrainerView.frame.height)

        switch direction {

        case .slideIn:

            contrainerView.addSubview(presentingToVC.view)
            presentingToVC.view.frame = positionHidden

            UIView.animate(withDuration: duration, animations: {
                presentingToVC.view.frame = positionShown
                presentedFromVC.view.alpha = self.fadeAlpha

            }, completion: { success in
                transitionContext.completeTransition( success )
            })

        case .slideOut:

            contrainerView.addSubview(presentedFromVC.view)
            presentedFromVC.view.frame = positionShown

            UIView.animate(withDuration: duration, animations: {
                presentedFromVC.view.frame = positionHidden
                presentingToVC.view.alpha = 1.0

            }, completion: { success in
                transitionContext.completeTransition( success )

            })
        }
    }

}

您是否尝试过使用
UIgestureRecognitor
?UIGestureRecognitor可用于识别子视图控制器和父视图控制器内的点击事件。对于swift 3,应该有
UIRecognitizerDelegate
handleTapBehind
功能,该功能应允许您执行所需操作

查看是否记录了什么内容

请参阅链接文章中的“Swift 3.1解决方案,可在纵向和横向两种情况下工作”