使用swift的Autolayout约束仅在点击后应用

时间:2015-03-12 10:37:04

标签: ios swift autolayout iad nslayoutconstraint

我正在展示这样的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()
}

我的问题:

  • 第一个横幅完全加载并紧贴屏幕底部
  • 每当横幅更新时,它会跳起并停留在那里直到我点按视图上的任意位置,然后它会移回到底部

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

3 个答案:

答案 0 :(得分:1)

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

关于您的代码,第一次看到横幅时,您在bannerViewDidLoadAd中添加的自动布局限制尚未添加。然后每次加载新横幅时都会反复添加它们。您最好一次性在viewDidLoad中添加约束(如果这是您打算呈现横幅的方式)。由于ADBannerView已定义内在内容大小,因此您无需在代码中强制横幅大小。只需添加自动布局规则。

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

希望它可以提供帮助。

答案 1 :(得分:0)

在这里你可能会尝试创建超过50的Adbanner大小,这就是为什么你会让Adbanner稍微超过

iAd支持纵向和横向应用的不同横幅尺寸。广告的确切大小取决于展示横幅的设备。在iPhone上,一幅肖像广告是320 x 50点和480 x 32点的景观广告。

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

答案 2 :(得分:0)

你尝试过这样的事吗?

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()
}