【问题标题】:Swift 5 & sheetPresentationController passing dataSwift 5 & sheetPresentationController 传递数据
【发布时间】:2022-12-29 18:21:36
【问题描述】:

我正在学习 swift 并尝试将变量传递给工作表,但是当工作表弹出时它并没有改变变量,有没有不同的方法来做到这一点?

let bottomSheet = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "bottomSheet")
    
    if let sheet = bottomSheet.sheetPresentationController{
        sheet.detents = [.medium()]
        sheet.prefersGrabberVisible = true
        sheet.preferredCornerRadius = 24
        sheet.prefersGrabberVisible = true
    }

    bottomSheet.isEnabled = true
    self.present(bottomSheet, animated: true, completion: nil)

在 bottomSheet 视图控制器中我有变量

var isEnabled: Bool = false

但即使我把它设置为 true,它总是显示为 false

【问题讨论】:

    标签: xcode swift5


    【解决方案1】:

    像这样尝试,您需要做的是将其指定为视图控制器。

    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
    if let bottomSheet = mainStoryboard.instantiateViewController(withIdentifier: "bottomSheet") as? BottomSheetVC{
            if let sheet = bottomSheet.sheetPresentationController{
                sheet.detents = [.medium()]
                sheet.prefersGrabberVisible = true
                sheet.preferredCornerRadius = 24
                sheet.prefersGrabberVisible = true
            }
            
            bottomSheet.isEnabled = true
            self.present(bottomSheet, animated: true)
        }
    

    【讨论】:

      【解决方案2】:

      sheetPresentationController 仅适用于 ios 15 及更高版本,对于以前的版本,您需要设置 .custom modalPresentationStype

              controller.modalPresentationStyle = .pageSheet
              if #available(iOS 15.0, *) {
      
                  if let sheet = controller.sheetPresentationController {
                      sheet.detents = [.medium()]
                  }
                  
              } else {
                  
                  controller.modalPresentationStyle = .custom
                  controller.transitioningDelegate = self
              }
              self.present(controller, animated: true, completion: nil)
      

      // MARK: - UIViewControllerTransitioningDelegate

      extension CPPdfPreviewVC: UIViewControllerTransitioningDelegate {
      
      
      func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
          PresentationController(presentedViewController: presented, presenting: presenting)
          }
      

      并按给定添加演示控制器

      class PresentationController: UIPresentationController {
      
        let blurEffectView: UIVisualEffectView!
        var tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()
        
        override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
            let blurEffect = UIBlurEffect(style: .dark)
            blurEffectView = UIVisualEffectView(effect: blurEffect)
            super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
            tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissController))
            blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            self.blurEffectView.isUserInteractionEnabled = true
            self.blurEffectView.addGestureRecognizer(tapGestureRecognizer)
        }
        
        override var frameOfPresentedViewInContainerView: CGRect {
            CGRect(origin: CGPoint(x: 0, y: self.containerView!.frame.height * 0.4),
                   size: CGSize(width: self.containerView!.frame.width, height: self.containerView!.frame.height *
                    0.6))
        }
      
        override func presentationTransitionWillBegin() {
            self.blurEffectView.alpha = 0
            self.containerView?.addSubview(blurEffectView)
            self.presentedViewController.transitionCoordinator?.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) in
                self.blurEffectView.alpha = 0.7
            }, completion: { (UIViewControllerTransitionCoordinatorContext) in })
        }
        
        override func dismissalTransitionWillBegin() {
            self.presentedViewController.transitionCoordinator?.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) in
                self.blurEffectView.alpha = 0
            }, completion: { (UIViewControllerTransitionCoordinatorContext) in
                self.blurEffectView.removeFromSuperview()
            })
        }
        
        override func containerViewWillLayoutSubviews() {
            super.containerViewWillLayoutSubviews()
          presentedView!.roundCorners([.topLeft, .topRight], radius: 22)
        }
      
        override func containerViewDidLayoutSubviews() {
            super.containerViewDidLayoutSubviews()
            presentedView?.frame = frameOfPresentedViewInContainerView
            blurEffectView.frame = containerView!.bounds
        }
      
        @objc func dismissController(){
            self.presentedViewController.dismiss(animated: true, completion: nil)
        }
      }
      
      extension UIView {
        func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners,
                                    cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }
      }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2022-12-29
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        相关资源
        最近更新 更多