Автолайп отличается от iOS 7 и iOS 8

У меня проблема между iAd BannerView, созданным в IB, и его ограничениями. У меня есть IBOutlet для нижнего ограничения iAd BannerView с супервизором. В viewDidLoad () ViewController я установил для выхода значение 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 вместо этого iAd BannerView в два раза больше размера под нижним полем после viewDidLoad (), поэтому при загрузке рекламы баннер остается за пределами экрана. Я временно решил проблему с проверкой версии устройства и соответствующим изменением ограничения в 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
}

Есть ли лучший способ достичь моей цели? Спасибо вам, ребята!

Андреа

Изображений:


person Andrea Venanzi    schedule 28.01.2015    source источник


Ответы (1)


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

Но в этом вся твоя проблема. Это именно тот тип жестко запрограммированных арифметических вычислений, основанный на предположениях о фактических значениях вещей, которые ограничивают вас, не делать. Вся суть автоматического размещения в том, что вы не ничего вычисляете: вы устанавливаете ограничения, которые описывают место, где должно быть представление. Если вы хотите, чтобы эта вещь находилась ниже нижней части супервизора, прикрепите его верх к нижней части супервизора!

Затем, когда вы хотите его показать, удалите это ограничение и закрепите его снизу в любом месте, чтобы оно отображалось внизу.

person matt    schedule 28.01.2015
comment
Спасибо, Мэтт, вы совершенно правы. Итак, я изменил ограничения в IB: я закрепил верхнюю часть iAd BannerView с нижней частью супервизора и удалил предыдущее ограничение нижней части баннера. Я удалил предыдущую конфигурацию iAd в viewDidLoad (), оставив только self.adBannerView.hidden = true, а затем изменил bannerViewDidLoadAd (нижний комментарий). В iOS 8 отлично работает, в iOS 7 вместо этого после viewDidLoad () баннер размещается правильно, но когда реклама загружается, баннер подталкивает tableView вверх до тех пор, пока не исчезнет над верхним полем. В чем моя ошибка? Большое спасибо! - person Andrea Venanzi; 28.01.2015
comment
Изображение ошибки 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() })}} - person Andrea Venanzi; 28.01.2015