Если честно, Yimin Rong's answer, вероятно, будет работать, по крайней мере, с текущим SDK. Но это немного странно. На самом деле это не объясняет , почему это сработает.
Глядя на документацию для setCanDisplayBannerAds:
мы видим:
Важно отметить, что это будет изменить иерархию вида контроллера вида, вставив новый вид контейнера выше точки зрения контроллера представления. Воздействие на то, что свойство представления контроллера представления больше не будет возвращать первоначально предоставленное представление, оно вернет новый контейнер. Чтобы получить доступ к исходному виду, используйте свойство originalContentView.
Таким образом, это фактически заменяет ваше имущество .view
вашего UIViewController. Запомни.
Когда UIViewController отображается на экране, он изменяется на весь экран (или, по крайней мере, на контейнер, который он занимает). Из-за этого свойство .view
UIViewController получает autoresizing maskUIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth
, поэтому его высота и ширина являются гибкими и могут растягиваться, чтобы соответствовать контейнеру.
При вызове [self setCanDisplayBannerAds:YES];
в viewDidLoad
, .view
свойства вашего UIViewController ныряет заменяется новым UIView, и так как он находится в viewDidLoad
, его autoresizingMask
получает соответствующее значение. И наоборот, вызов [self setCanDisplayBannerAds:NO];
в viewDidLoad
фактически ничего не делает.
В вашем примере приложения, когда вы звоните [self setCanDisplayBannerAds:YES];
вне из viewDidLoad
, мы можем видеть, что autoresizingMask
делает не на самом деле получить набор растягиваться. Это то, что вызывает проблему:
- (IBAction)TouchUpInside:(id)sender {
NSLog(@"Touch Up Inside");
NSLog(@"Original View: %@", self.view);
[self setCanDisplayBannerAds:YES];
NSLog(@"New View: %@", self.view);
NSLog(@"Content View: %@", self.originalContentView);
}
Output:
2015-02-05 11:32:19.654 ID19658866[12404:3600041] Touch Up Inside
2015-02-05 11:32:19.655 ID19658866[12404:3600041] Original View: <UIView: 0x7f9c42717440; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x7f9c42717710>>
2015-02-05 11:32:19.666 ID19658866[12404:3600041] New View: <UIView: 0x7f9c42523fb0; frame = (0 0; 375 667); layer = <CALayer: 0x7f9c42524080>>
2015-02-05 11:32:19.666 ID19658866[12404:3600041] Content View: <UIView: 0x7f9c42717440; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x7f9c42717710>>
Ключевым моментом здесь является в 3-й строке вывода, где «Новый взгляд» делает не уже autoresize = W+H;
включены в вывод. Мы также подтвердили, что self.view
заменяется новым представлением между 2-й и 3-й строками вывода.
Чтобы исправить это, мы можем убедиться, что наш новый self.view
свойство получает необходимое autoresizingMask
, добавив следующую строку после того, как мы называем [self setCanDisplayBannerAds:YES];
:
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
И это будет работать, и мы будем знать, почему.
Или мы могли бы, вы знаете ... просто заменить нашу self.view
собственность по телефону [self setCanDisplayBannerAds:YES];
внутри viewDidLoad
, поэтому он автоматически получает autoresizingMask
установлен правильно.
Спасибо, попробовали как 'setNeedsUpdateConstraints',' setNeedsLayout', так и 'setNeedsDisplay' в отдельности и в комбинации - все еще есть ошибка компоновки. Потому что он включает iAds, надеясь получить ответ от Apple раньше, чем позже. – Buddy
Да, я был уверен, что это не будет решением, но, надеюсь, вы увидите что-то, что может пролить некоторый дополнительный свет на реальную проблему/решение. Что бы вы ни обнаружили, я надеюсь, что вы вернетесь и обновите свою публикацию тем, что вы в конечном итоге узнаете. Спасибо дружище. – BonanzaDriver
Возможно, это комментарий. Сохранить ответы для ответов, а не догадываться, чтобы схватить очки. – jww