代码之家  ›  专栏  ›  技术社区  ›  user924

每个约束项都必须是视图或布局指南

  •  0
  • user924  · 技术社区  · 7 年前

    我试图在UIViewController的底部添加Admob横幅:

    func addBannerViewToView() {
        bannerView = GADBannerView(adSize: kGADAdSizeBanner)
        bannerView.adUnitID = "ca-app-pub-HIDDEN/HIDDEN"
        bannerView.rootViewController = self
        bannerView.delegate = self
        bannerView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(bannerView)
        view.addConstraints(
            [NSLayoutConstraint(item: bannerView,
                                attribute: .bottom,
                                relatedBy: .equal,
                                toItem: view.safeAreaLayoutGuide.bottomAnchor,
                                attribute: .top,
                                multiplier: 1,
                                constant: 0),
             NSLayoutConstraint(item: bannerView,
                                attribute: .centerX,
                                relatedBy: .equal,
                                toItem: view,
                                attribute: .centerX,
                                multiplier: 1,
                                constant: 0)
            ])
        bannerView.load(GADRequest())
    }
    

    我调用这个函数 viewDidLoad 但应用程序崩溃的原因是:

    由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:“NSLayoutConstraint for” >:每个约束项都必须是一个 查看或布局指南。”

    我用了一个官方的例子 https://developers.google.com/admob/ios/banner

    0 回复  |  直到 7 年前
        1
  •  18
  •   Domingo Gallardo    7 年前

    错误出现在第一个约束中。iOS 12中的正确公式是:

    NSLayoutConstraint(item: bannerView,
                       attribute: .bottom,
                       relatedBy: .equal,
                       toItem: view.safeAreaLayoutGuide,
                       attribute: .bottom,
                       multiplier: 1,
                       constant: 0)
    

    这意味着属性 bottom 关于 bannerView 一定是 equal 底部 属性 view.safeAreaLayoutGuide .

        2
  •  4
  •   Shehata Gamal    7 年前

    代替

    toItem: view.safeAreaLayoutGuide.bottomAnchor,
    

    具有

    toItem: view.safeAreaLayoutGuide,
    

    toItem: view,
    

    您可以指定一个定位点,但例外情况是,它必须是常规视图或布局指南

        3
  •  1
  •   Salman Khalid    6 年前

    这起了作用:

    func addBannerViewToView() {
            bannerView = GADBannerView(adSize: kGADAdSizeBanner)
            bannerView.adUnitID = "ca-app-pub-HIDDEN/HIDDEN"
            bannerView.rootViewController = self
            bannerView.delegate = self
            bannerView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(bannerView)
            view.addConstraints(
                [NSLayoutConstraint(item: bannerView,
                                    attribute: .bottom,
                                    relatedBy: .equal,
                                    toItem: view,
                                    attribute: .bottomMargin,
                                    multiplier: 1,
                                    constant: 0),
                 NSLayoutConstraint(item: bannerView,
                                    attribute: .centerX,
                                    relatedBy: .equal,
                                    toItem: view,
                                    attribute: .centerX,
                                    multiplier: 1,
                                    constant: 0)
                ])
            bannerView.load(GADRequest())
        }