Toast UILabel 出现在屏幕外,尽管我正确设置了 y

Toast UILabel appears off screen, despite me setting y correctly

我在 ViewController 上有一个继承 class ViewControllerList: UITableViewController, UIPopoverPresentationControllerDelegate { 的 Toast 扩展,一切都很好,除了当我这样做时

extension UIViewController {

  func showToast(message : String) {
      let height = UIScreen.main.bounds.height
      let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 75, y:  height-100, width: 150, height: 35))
      toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6)
      toastLabel.textColor = UIColor.white
      toastLabel.textAlignment = .center;
      toastLabel.font = UIFont(name: "Montserrat-Light", size: 12.0)
      toastLabel.text = message
      toastLabel.alpha = 1.0
      toastLabel.layer.cornerRadius = 10;
      toastLabel.clipsToBounds  =  true
      self.view.addSubview(toastLabel)
      UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: {
          toastLabel.alpha = 0.0
      }, completion: {(isCompleted) in
          toastLabel.removeFromSuperview()
      })
   }
}

toast 总是出现在屏幕外..在一个长的 uitableview 中..无论我如何设置 y 它总是根据文档来思考..我已经调试了它并且 y=676它似乎位于最后一个单元格内的 tableView 底部约 ~900 ...100 处

为什么会这样,我该如何解决?

请不要标记这个 - 尝试给出答案

添加一个新函数addToTopView(view : UIView)并像这里一样使用。

extension UIViewController {

    /// adding views as a subview of the top view = window
    func addToTopView(view : UIView) {
        if let d = UIApplication.shared.delegate, let window = d.window! {
            window.addSubview(view)
            // handle constraints or anythings
        }
    }

    func showToast(message : String) {
        let height = UIScreen.main.bounds.height
        let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 75, y:  height-100, width: 150, height: 35))
        toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6)
        toastLabel.textColor = UIColor.white
        toastLabel.textAlignment = .center;
        toastLabel.font = UIFont(name: "Montserrat-Light", size: 12.0)
        toastLabel.text = message
        toastLabel.alpha = 1.0
        toastLabel.layer.cornerRadius = 10;
        toastLabel.clipsToBounds  =  true
        addToTopView(view: toastLabel) // here is update
        UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: {
            toastLabel.alpha = 0.0
        }, completion: {(isCompleted) in
            toastLabel.removeFromSuperview()
        })
    }
}

不要添加到 self.view,而是将 toast 标签添加为 window:

的子视图
extension UIViewController {

  func showToast(message : String) {
      let window = (UIApplication.shared.delegate as! AppDelegate).window
      let height = window.bounds.height
      let toastLabel = UILabel(frame: CGRect(x: window.bounds.width/2 - 75, y:  height-100, width: 150, height: 35))
      toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6)
      toastLabel.textColor = UIColor.white
      toastLabel.textAlignment = .center;
      toastLabel.font = UIFont(name: "Montserrat-Light", size: 12.0)
      toastLabel.text = message
      toastLabel.alpha = 1.0
      toastLabel.layer.cornerRadius = 10;
      toastLabel.clipsToBounds  =  true

      // notice the change here
      window.addSubview(toastLabel)
      UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: {
          toastLabel.alpha = 0.0
      }, completion: {(isCompleted) in
          toastLabel.removeFromSuperview()
      })
   }
}

这样就避免了当super view是scroll view时你要处理的问题