自动布局在iOS 7和iOS 8中有所不同

3

我在使用IB创建iAd BannerView时遇到了与其约束相关的问题。我为iAd BannerView的底部约束和其父视图创建了IBOutlet。在ViewController的viewDidLoad()方法中,我将该outlet设置为0减去横幅高度,以将iAd BannerView放置在屏幕底部外边缘。

@IBOutlet var adBannerView: ADBannerView!
@IBOutlet var adBannerBottomConstraints: NSLayoutConstraint!

 override func viewDidLoad() {
    super.viewDidLoad()

    // Configure answers index
    self.arrayAnswIndex = ["A", "B", "C", "D", "E"]

    // TableView Cell
    var nib = UINib(nibName: "QuestionTableViewCell", bundle: nil)
    self.simulazioneTableView.registerNib(nib, forCellReuseIdentifier: self.QuestionCellIdentifier)
    var nibAnswer = UINib(nibName: "AnswerTableViewCell", bundle: nil)
    self.simulazioneTableView.registerNib(nibAnswer, forCellReuseIdentifier: self.AnswerCellIdentifier)

    // NavigationBar
    self.navigationBarSettings()

    // TabBar
    self.tabBarController?.tabBar.hidden = true

    // iAd Banner
    adBannerView.hidden = true
    adBannerBottomConstraints.constant = 0 - self.adBannerView.bounds.size.height        
}

当广告加载完成后,我会通过动画效果来改变限制条件,从而展示横幅广告:
func bannerViewDidLoadAd(banner: ADBannerView!) {
    if (adBannerView.hidden == true) {
        //now show banner
        adBannerView.hidden = false
        self.adBannerBottomConstraints.constant = self.adBannerBottomConstraints.constant + self.adBannerView.frame.size.height
        UIView.animateWithDuration(0.4, animations: {
            self.view.layoutIfNeeded()
        })
    }
}

问题在于iOS 8中一切正常,在iOS 7中在viewDidLoad()后iAd BannerView的底部边距下面是两倍大小,因此当广告加载时,横幅仍然位于屏幕外。 我已经暂时解决了这个问题,通过检查设备版本并在viewDidLoad()中相应地修改约束条件。
// iAd Banner
adBannerView.hidden = true
if ((UIDevice.currentDevice().systemVersion as NSString).floatValue >= 8.0) {
     adBannerBottomConstraints.constant = 0 - self.adBannerView.bounds.size.height
} else {
     adBannerBottomConstraints.constant = 0
}

有更好的方法来实现我的目的吗?谢谢大家!

安德烈亚

图像:

1个回答

2
adBannerBottomConstraints.constant = 
    0 - self.adBannerView.bounds.size.height        

但这恰好是您的问题所在。这正是基于对事物实际值的假设而进行硬编码算术计算的类型,约束条件意味着您不应该这样做。自动布局的整个重点在于您不需要计算任何东西:您设置描述视图位置的约束条件。如果您希望将此内容放置在父视图底部以下,请将其顶部固定到父视图底部!
然后,当您想要显示它时,删除该约束并将其底部固定到需要到达的位置,以使其出现在底部。

谢谢你,马特,你说得很对。所以我已经修改了IB中的约束:我将iAd BannerView的顶部固定在superview的底部,并删除了先前的横幅底部约束。我已经在viewDidLoad()中删除了iAd的先前配置,只留下self.adBannerView.hidden = true,然后我修改了bannerViewDidLoadAd(底部注释)。 在iOS 8上运行得很好,在iOS 7上,当广告加载后,横幅会将tableView向上推,直到它消失在顶部边缘之上。我的错误在哪里?非常感谢! - Andrea Venanzi
iOS 7错误图像 | func bannerViewDidLoadAd(banner: ADBannerView!) { if (adBannerView.hidden == true) { adBannerView.hidden = false self.view.removeConstraint(adBannerTopConstraints) var bannerSuperViewConst = NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.adBannerView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0.0) self.view.addConstraint(bannerSuperViewConst) UIView.animateWithDuration(0.4, animations: { self.view.layoutIfNeeded() })}} - Andrea Venanzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接