如何修改modal(弹出控制器)出来的控制器的位置以及大小
程序员文章站
2024-01-07 22:16:22
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