欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

如何修改modal(弹出控制器)出来的控制器的位置以及大小

程序员文章站 2022-04-12 22:09:37
1.创建弹出的控制器 let popVc = PopoverViewController() popVc.modalPresentationStyle = .customPopoverViewController这是我自己创建的控制器,继承自UIViewController,原因是方便我管理给控制器设置modalPresentationStyle属性为custom,因为只有设置了这个属性,我们在弹出控制器的时候后面的控制器才不会被移除,并且只有设置了...

1.创建弹出的控制器

        let popVc = PopoverViewController()
        
        popVc.modalPresentationStyle = .custom
  • PopoverViewController这是我自己创建的控制器,继承自UIViewController,原因是方便我管理
  • 给控制器设置modalPresentationStyle属性为custom,因为只有设置了这个属性,我们在弹出控制器的时候后面的控制器才不会被移除,并且只有设置了这个属性,才可以修改弹出控制器的尺寸

2.弹出控制器

present(popVc, animated: true, completion: nil)
  • 直接在当前控制器使用present方法即可

3.设置转场动画的代理

popVc.transitioningDelegate = self
  • 设置代理必须遵守代理方法UIViewControllerTransitioningDelegate

4.实现代理方法(一般我们都会扩展出来)

extension HomeViewController : UIViewControllerTransitioningDelegate {
    // 修改弹出控制器的大小
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        return MrHongtaoPresentationController(presentedViewController: presented, presenting: presenting)
    }
}
  • MrHongtaoPresentationController是我自己创建的控制器,继承自UIPresentationController
  • 因为这个方法返回的就是UIPresentationController,所以我们直接返回,但是为了在内部修改尺寸所以我们自己创建一个控制器继承自UIPresentationController
  • 返回UIPresentationController的时候调用里面自带的方法,参数都是方法给我们传进来的直接填写就可以

5.在MrHongtaoPresentationController里面实现方法从而改变尺寸

override func containerViewWillLayoutSubviews() {
        // MARK: - 系统回调
        super .containerViewWillLayoutSubviews()
        
        // 1.设置弹出View的尺寸
        presentedView?.frame = CGRect(x: 100, y: 50, width: 180, height: 250)
        
        // 2.添加蒙版
        setupCoverView()
        
    }
  • presentedView直接就可以使用,代表的是弹出的控制器
  • 在这里我们最好添加一个蒙版,因为当控制器弹出的时候,我们想要点击了任意位置,控制器自动收回

6.蒙版的添加(还是扩展)

extension MrHongtaoPresentationController {
    // 添加蒙版
    private func setupCoverView() -> Void {
        // 添加蒙版
        containerView?.insertSubview(coverView, at: 0)
        
        // 设置蒙版的属性
        coverView.backgroundColor = UIColor(white: 0.0, alpha: 0.2)
        coverView.frame = containerView!.bounds
        
        // 添加手势
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.coverViewClick))
        coverView.addGestureRecognizer(tapGesture)
        
        
    }
}
  • 我们在蒙版上添加一个手势,这样子可以监听我们点击了蒙版之后可以让控制器收回
  • coverView就是我们懒加载出来的View
// 蒙版View
    private lazy var coverView : UIView = {
        let tempCoverView = UIView()
        return tempCoverView
    }()

7.监听手势(扩展)

extension MrHongtaoPresentationController {
    @objc private func coverViewClick() -> Void {
        presentedViewController.dismiss(animated: true, completion: nil)
    }
}
  • presentedViewController代表已经modal出来的控制器s

本文地址:https://blog.csdn.net/weixin_44729579/article/details/108712729

相关标签: swift iOS开发