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

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

我的问题:

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

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

最佳答案

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

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

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

希望对您有所帮助。

关于ios - 仅在点击后才应用 swift 的自动布局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29007457/

相关文章:

ios - 当预期类型可能不同时,如何安全地处理 JSON 数据?

swift - Apple Pencil 笔颜色比 PKInkingTool 指定的颜色深

ios - 使用自动布局读取 UI 正确框架

ios - 放松不起作用

ios - Apple 推送通知服务在提交后不起作用,但在沙箱中一切正常

ios - 检查依赖性...没有要编译的体系结构(ARCHS=i386,VALID_ARCHS=arm64 armv7s armv7)

ios - 自动布局和设备方向

ios - 什么时候调用layoutSubviews?

ios - 显示用户名 - 解析

xcode - 使用 NSObject 继承子类化 Swift 泛型类