2013-11-30 4 views
8

Я использую Auto Layout в моей прошивке 7 проекта со следующей иерархией видовiOS7 Auto Layout, Вид Resize и МААШ

Главной Посмотреть
-Container Посмотреть
--- Кнопка
--- Кнопка
--- ImageView
-Banner View (ОВР Banner View)

на главном экране и контейнерного ракурс полная ширина и высота экрана. У меня есть горизонтальные и вертикальные пространственные ограничения в представлении контейнера, прикрепляющиеся к главному виду (высота и ширина экрана). А также подвид Container View ограничен кнопкой просмотра с пространством 20px.

Моя проблема возникает, когда Banner View окончательно заполняется и помещается в нижней части экрана, после чего у меня есть вид контейнера, который вычитает высоту баннерного вида из его высоты кадра, чтобы предоставить пространство для просмотра баннера. (код, используемый ниже). Идеальный результат - просмотр контейнера, чтобы вычесть высоту и обновление ограничений на subviews на основе этой новой высоты, но в конечном итоге это iAN Banner View просто накладывает вид, как показано на рисунке.

Код для BannerViewDidLoadAd:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    CGRect contentFrame = self.containerView.bounds; 

    CGRect bannerFrame = self.bannerView.bounds; 
    if (self.bannerView.bannerLoaded) { 
     contentFrame.size.height = self.containerView.frame.size.height - self.bannerView.frame.size.height; 

     bannerFrame.origin.y = contentFrame.size.height;; 
    } else { 
     bannerFrame.origin.y = contentFrame.size.height; 
    } 



    [UIView animateWithDuration:animated ? 0.25 : 0.0 animations:^{ 
     [self.containerView setFrame:contentFrame]; 
     [self.containerView layoutIfNeeded]; 
     self.bannerView.frame = bannerFrame; 
     self.bannerView.hidden = NO; 
    }]; 

    [self.containerView updateConstraints]; 
} 

Изображения ОВРА накладывания контейнера View, и это подвиды

iad overlaying

+0

При использовании автоматической компоновки вы никогда не должны устанавливать рамки напрямую. Вам необходимо изменить все кадры, изменив или добавив/вычитая ограничения. – rdelmar

+0

@rdelmar, поэтому я должен существенно добавить новые ограничения для скрытого баннера. Просмотрите и отредактируйте нижнее ограничение контейнера в новом баннерном представлении? Спасибо, если бы вы могли дать мне пример того, как справиться с этим, было бы здорово! :) –

+0

Я не уверен, что вы делаете. Является ли представление баннера добавленным как подзаголовок, или вы перемещаете его с экрана? Имеет ли вид баннера фиксированную высоту или переменная? Что такое Preview View (это представление контейнера)? – rdelmar

ответ

8

После создания представления баннера в коде (и добавить его в качестве подвида из основных view), вы должны добавить ограничение длины пробела между нижней частью представления контейнера и верхней частью представления баннера (для просмотра баннера потребуются ограничения на две стороны основного вида и ограничение высоты). В представлении контейнера должно быть ограничение длины 0 для всех четырех краев основного вида. Вы должны сделать IBOutlet для этого нижнего ограничения и оживить постоянное значение этого ограничения на сумму, равную высоте представления баннера (поэтому он будет уменьшаться, а представление баннера будет двигаться вверх с ним из-за его ограничения длины на вертикальную длину 0). Таким образом, если выход к нижнему ограничению назывались bottomCon, а высота представления баннера был 100 очков, вы бы анимировать так:

[UIView animateWithDuration:animated ? 0.25 : 0.0 animations:^{ 
     self.bottomCon.constant = 100; 
     [self.mainView layoutIfNeeded]; 
    }]; 

Там нет необходимости, чтобы скрыть и отобразить мнение, так как вы будете сначала поместите его в нижнюю часть экрана. Также убедитесь, что вы вызываете [bannerView setTranslatesAutoresizingMaskIntoConstraints:NO] сразу после создания представления баннера, или вы получите ошибки автоматического макета при запуске приложения.

+0

Спасибо, я попробую то, что вы предложили здесь, и сообщите, как это происходит. –

+0

Итак, я получил эту работу с вашим входом, только я оставил без внимания ограничение длины 0 между представлением контейнера и верхней частью представления баннера, когда я добавил эту ошибку xcode в runtime, сказав, что было 2 ограничения, которые противоречили друг другу, казалось, это нижняя граница представления контейнера, вызывающая ошибку. –

+0

Спасибо, исключение ограничений, наконец, прошло! – HotJard

3

Ответа от rdelmar было достаточно для меня, чтобы эта работа работала, но я добавлю несколько вещей. При автоматической компоновке нет необходимости устанавливать размер баннера с помощью setAutoresizingMask: UIViewAutoresizingFlexibleWidth (и currentContentSizeIdentifier устарел в iOS 6). Просто создайте объект баннера, а затем закрепите его в нужном месте, используя процедуру, описанную rdelmar, и автоматическую компоновку позаботится о горизонтальном размере.

Вот ограничение, которые я использовал:

// pin sides to superview 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_bannerView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_bannerView)]]; 

// set height to a constant 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_bannerView(==66)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_bannerView)]]; 

// pin contentView to bannerView with 0 length constraint 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_contentView]-0-[_bannerView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_contentView,_bannerView)]]; 

Я был обеспокоен установкой ограничения высоты, так как высота баннера будет меняться в зависимости от платформы и/или ориентации. Но, похоже, не имеет значения, какое значение я устанавливаю для ограничения высоты - баннер всегда отображается с правильной высотой, поэтому я даже не хочу его устанавливать.Я предполагаю это, потому что на высоте рекламных баннеров есть внутренняя оценка.

+0

Спасибо за вклад, помогли мне визуализировать его с точки зрения кода. –