español - iOS 7 Auto Layout, View Resize e iAds
constraints xcode (2)
Estoy usando Diseño automático en mi proyecto iOS 7 con la siguiente jerarquía de vista
Vista principal
-Container View
---Botón
---Botón
--- ImageView
-Banner View (iAd Banner View)
La vista principal y la vista de contenedor son de ancho completo y alto de pantalla. Tengo restricciones de espacio horizontal y vertical en la vista de contenedor que se adhiere a la vista principal (altura y ancho de la pantalla). Y también las subvistas de Container View están restringidas al botón de la vista con un espacio de 20 píxeles.
Mi problema ocurre cuando la Vista de la pancarta finalmente se llena y se coloca en la parte inferior de la pantalla, que luego tengo la Vista de contenedor resta la Altura de la Pancarta desde su altura de marco para dejar espacio para que se muestre la Vista de pancarta. (código utilizado a continuación) El resultado ideal es la Vista de contenedor para restar la altura y su actualización de restricción de subvistas en función de esta nueva altura, pero lo que sucede es que la vista de banner de iAD simplemente superpone la vista como se muestra en la imagen.
Código para 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];
}
Imagen de iAd que superpone la Vista de contenedor y sus Subvisos
Después de crear la vista de pancarta en el código (y agregarla como subvista de la vista principal), debe agregar una restricción de espaciado de 0 longitud entre la parte inferior de la vista de contenedor y la parte superior de la vista de pancarta (la vista de pancarta necesitaría restricciones a los dos lados de la vista principal y una restricción de altura también). La vista de contenedor debe tener 0 restricciones de longitud para los cuatro bordes de la vista principal. Debe hacer una IBOutlet a esa restricción inferior y animar el valor constante de esa restricción en una cantidad igual a la altura de la vista de pancarta (por lo que se reducirá y la vista de pancarta se moverá hacia arriba debido a su restricción de espaciado vertical de longitud 0 ) Por lo tanto, si la salida a la restricción inferior se llamaba bottomCon, y la altura de la vista de la pancarta era 100 puntos, se animaría así:
[UIView animateWithDuration:animated ? 0.25 : 0.0 animations:^{
self.bottomCon.constant = 100;
[self.mainView layoutIfNeeded];
}];
No es necesario ocultar y mostrar la vista, ya que inicialmente la colocará en la parte inferior de la pantalla. También asegúrese de llamar a [bannerView setTranslatesAutoresizingMaskIntoConstraints:NO]
justo después de crear la vista de banner, o obtendrá errores de diseño automático cuando ejecute la aplicación.
La respuesta de rdelmar fue suficiente para que funcione, pero agregaré algunas cosas. Con el diseño automático activado, no es necesario establecer el tamaño del banner con setAutoresizingMask: UIViewAutoresizingFlexibleWidth (y currentContentSizeIdentifier está en desuso en iOS 6). Simplemente cree el objeto de banner y luego colóquelo en su posición utilizando el procedimiento descrito por rdelmar y el diseño automático se ocupa del tamaño horizontal.
Estas son las restricciones que utilicé:
// 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)]];
Me preocupaba establecer una restricción de altura porque la altura del banner cambiará según la plataforma y / o la orientación. Pero no parece haber ninguna diferencia en el valor que establezco para la restricción de altura: el banner siempre se muestra con la altura correcta, por lo que ni siquiera me molesto en configurarlo. Estoy asumiendo esto porque hay un tamaño intrínseco a la altura de los banners publicitarios.