Разместите баннер AdMob в верхней части безопасной области (iPhoneX) - PullRequest
0 голосов
/ 15 декабря 2018

в AdMob говорит: «Методы могут быть легко использованы для ограничения верхней части безопасной области путем изменения используемых атрибутов и привязок».Я точно не знаю, какие именно значения нужно изменить, я знаю, что это должны быть атрибуты и привязки, но я не уверен, что я могу изменить их, чтобы я не был знаком с ограничениями

- (void)addBannerViewToView:(UIView *)bannerView {
  bannerView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:bannerView];
  if (@available(ios 11.0, *)) {
    // In iOS 11, we need to constrain the view to the safe area.
    [self positionBannerViewFullWidthAtBottomOfSafeArea:bannerView];
  } else {
    // In lower iOS versions, safe area is not available so we use
    // bottom layout guide and view edges.
    [self positionBannerViewFullWidthAtBottomOfView:bannerView];
  }
}

#pragma mark - view positioning

- (void)positionBannerViewFullWidthAtBottomOfSafeArea:(UIView *_Nonnull)bannerView NS_AVAILABLE_IOS(11.0) {
  // Position the banner. Stick it to the bottom of the Safe Area.
  // Make it constrained to the edges of the safe area.
  UILayoutGuide *guide = self.view.safeAreaLayoutGuide;

  [NSLayoutConstraint activateConstraints:@[
    [guide.leftAnchor constraintEqualToAnchor:bannerView.leftAnchor],
    [guide.rightAnchor constraintEqualToAnchor:bannerView.rightAnchor],
    [guide.bottomAnchor constraintEqualToAnchor:bannerView.bottomAnchor]
  ]];
}

- (void)positionBannerViewFullWidthAtBottomOfView:(UIView *_Nonnull)bannerView {
  [self.view addConstraint:[NSLayoutConstraint constraintWithItem:bannerView
                                                        attribute:NSLayoutAttributeLeading
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:self.view
                                                        attribute:NSLayoutAttributeLeading
                                                       multiplier:1
                                                         constant:0]];
  [self.view addConstraint:[NSLayoutConstraint constraintWithItem:bannerView
                                                        attribute:NSLayoutAttributeTrailing
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:self.view
                                                        attribute:NSLayoutAttributeTrailing
                                                       multiplier:1
                                                         constant:0]];
  [self.view addConstraint:[NSLayoutConstraint constraintWithItem:bannerView
                                                        attribute:NSLayoutAttributeBottom
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:self.bottomLayoutGuide
                                                        attribute:NSLayoutAttributeTop
                                                       multiplier:1
                                                         constant:0]];
}

1 Ответ

0 голосов
/ 15 марта 2019

Поскольку iPhoneX поставляется с iOS 11.0 и выше, вам просто нужно изменить функцию positionBannerViewFullWidthAtBottomOfSafeArea .Нет необходимости корректировать ограничения в функции positionBannerViewFullWidthAtBottomOfView , предназначенной для версий до 11.

Изменить

[guide.bottomAnchor constraintEqualToAnchor:bannerView.bottomAnchor]

на

[guide.topAnchor constraintEqualToAnchor:bannerView.topAnchor]

Thisприкрепит верхнюю часть вашего баннера AdMob к верхней части руководства.

Элегантное решение

Чтобы сократить стандартное решение admob, добавьте баннер в представление и установитеВ дополнение к необходимым ограничениям следующий фрагмент кода очень полезен.

Разница между iOS 11 и предыдущими версиями заключается в том, что в 11 введена безопасная зона.До 11 iOS были LayoutMargins.Мы добавили небольшую функцию, которая возвращает нам либо руководство по безопасной области, либо отступы макета, и избавляемся от всех positionBannerViewFullWidthAtBottomOfView функций с помощью этого:

- (void)addBannerViewToView:(UIView *)bannerView {
  bannerView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:bannerView];

  [self positionBannerViewFullWidthAtBottomOfSafeAreaOrLayoutMargins:bannerView];
}

#pragma mark - view positioning

- (void)positionBannerViewFullWidthAtBottomOfSafeAreaOrLayoutMargins:(UIView *_Nonnull)bannerView {
  // Position the banner. Stick it to the bottom of the Safe Area or layout margins.
  // Make it constrained to the edges of the safe area or layout margins (iOS < 11).

//Call the method to set the layout guide.

let guide = correctLayoutGuide //Swift
UILayoutGuide * guide = [self correctLayoutGuide]; //Objective-C   


  [NSLayoutConstraint activateConstraints:@[
    [guide.leftAnchor constraintEqualToAnchor:bannerView.leftAnchor],
    [guide.rightAnchor constraintEqualToAnchor:bannerView.rightAnchor],
    //[guide.topAnchor constraintEqualToAnchor:bannerView.topAnchor] // Banner at TOP
    [guide.bottomAnchor constraintEqualToAnchor:bannerView.bottomAnchor] // Banner at BOTTOM
  ]];
}


//This function returns safeAreaLayoutGuide for iOS 11 and above
//and layoutMarginsGuide for iOS < 11.

//Swift

var correctLayoutGuide: UILayoutGuide {
        if #available(iOS 11.0, *) {
            return view.safeAreaLayoutGuide
        } else {
            return view.layoutMarginsGuide
        }
}

//Objective-C

-(UILayoutGuide *) correctLayoutGuide {
    if (@available(ios 11.0, *)) {
        return [self.view safeAreaLayoutGuide];
    } else {
        return [self.view layoutMarginsGuide];
    }
}
...