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