swift 的自动布局约束仅在点击后应用

Autolayout constraint with swift only applied after tap

我正在展示这样的 iAD 横幅:

override func viewDidLoad() {
  ...
  initializeBannerAd()
}

func initializeBannerAd() {
  let banner = ADBannerView(adType: ADAdType.Banner)
  banner.frame = CGRectMake(0,-100, self.view.frame.width, 100)
  banner.delegate = self
  banner.hidden = true
  self.view.addSubview(banner)
}

func bannerViewDidLoadAd(banner: ADBannerView!) {
  banner.hidden = false
  banner.frame = CGRectMake(0, self.view.frame.size.height-100, self.view.frame.width, 100)

  banner.setTranslatesAutoresizingMaskIntoConstraints(false)
  let viewsDictionary = ["banner":banner]
  self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[banner]|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary))
  self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[banner]-0-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary))
  self.view.layoutIfNeeded()
}

我的问题:

我该如何解决这个问题?为什么只有在我点击后才应用约束?

在这里您可能试图创建大于 50 的广告横幅,这就是为什么您的广告横幅略高于

iAd 支持纵向和横向应用程序的不同横幅尺寸。广告的确切大小取决于显示横幅的设备。在 iPhone 上,纵向广告为 320 x 50 点,横向广告为 480 x 32 点。

参考。 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/iAd_Guide/BannerAdvertisements/BannerAdvertisements.html

在单个 UIViewController 底部添加广告横幅的最简单方法是将其 属性 var canDisplayBannerAds: Bool 设置为 true。这将触发自动横幅展示,而无需您自己实例化和添加横幅。

关于您的代码,您第一次看到横幅时,您在 bannerViewDidLoadAd 中添加的自动布局约束尚未添加。然后每次加载新横幅时都会一次又一次地添加它们。您最好一劳永逸地在 viewDidLoad 中添加约束条件(以防您打算以这种方式展示横幅)。由于 ADBannerView 已定义固有内容大小,因此您无需在代码中 强制 横幅大小。只需添加自动布局规则。

如果您需要示例,here 您可以找到我之前针对类似问题所做的示例。在示例中,我使用 ADBannerView 单例并将其显示在 viewController 视图的底部或顶部。

希望对你有帮助。

你试过这样的东西吗?

func initializeBannerAd() {
    let banner = ADBannerView(adType: ADAdType.Banner)
    banner.setTranslatesAutoresizingMaskIntoConstraints(false)
    banner.delegate = self
    banner.hidden = true
    self.view.addSubview(banner)
    var constraints = [AnyObject]()
    constraints.append(NSLayoutConstraint(item: banner, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1.0, constant: 0.0))
    constraints.append(NSLayoutConstraint(item: banner, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1.0, constant: 0.0))
    constraints.append(NSLayoutConstraint(item: banner, attribute: .Right, relatedBy: .Equal, toItem: self.view, attribute: .Right, multiplier: 1.0, constant: 0.0))
    constraints.append(NSLayoutConstraint(item: banner, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 100.0))
    NSLayoutConstraint.activateConstraints(constraints)
}
func bannerViewDidLoadAd(banner: ADBannerView!) {
    banner.hidden = false
    self.view.layoutIfNeeded()
}