ios - color - Obtenga programáticamente la altura de la barra de navegación
ion-title color (7)
¿Has intentado esto?
let barHeight = self.navigationController?.navigationBar.frame.height ?? 0
Sé que la presencia del controlador más view (barra de navegación) empuja hacia abajo la UIView por su altura. También sé que esta altura = 44px. También descubrí que este empuje hacia abajo mantiene [self.view].frame.origin.y = 0
.
Entonces, ¿cómo puedo determinar la altura de esta barra de navegación, que no sea simplemente establecerlo en una constante?
O, versión más corta, ¿cómo puedo determinar si mi UIView se muestra con la barra de navegación en la parte superior?
La bombilla comenzó a encenderse. Lamentablemente, no he descubierto una forma uniforme de corregir el problema, como se describe a continuación.
Creo que todo mi problema se centra en mis Masas de Autentificación. Y la razón por la que he llegado a la conclusión de que son los mismos síntomas existe, con o sin UIWebView. Y ese síntoma es que todo es color de rosa para Portrait. Para Landscape, el botón UIButton inferior aparece debajo de TabBar.
Por ejemplo, en una UIView, tengo, de arriba a abajo:
UIView: conjunto de muelles (caso predeterminado) y sin puntales
UIScrollView: si configuro los dos resortes y borro todo lo demás (como UIView), el UIButton se inmiscuye en el objeto que está justo encima de él. Si borro todo, entonces UIButton está bien, pero las cosas en la parte superior se esconden detrás de StatusBar. Configurando solo el puntal superior, UIButton aparece debajo de la barra de pestañas.
UILabel y UIImagen siguiente verticalmente - juego de puntal superior, flexible en cualquier otro lado
Solo para completar la imagen para los pocos que tienen una UIWebView:
UIWebView - Struts: arriba, izquierda, derecha Springs: ambos
UIButton: nada establecido, es decir, flexible en todas partes
Aunque mi foco de luz es tenue, parece que hay esperanza.
Por favor, tengan paciencia porque necesitaba más espacio que el previsto para un breve comentario de respuesta.
Gracias por tratar de entender lo que realmente estoy pescando ... así que aquí va.
1) Cada UIViewController (una aplicación TabBar) tiene un UIImage, algo de texto y lo que sea encima. Otro denominador común es un UIButton en la parte inferior. En algunos UIViewControllers tengo un UIWebView arriba del UIButton.
Entonces, UIImage, texto, etc. UIWebView (en ALGUNOS) UIButton
Alrededor de todo lo anterior es un UIScrollView.
2) Para aquellos que tienen un UIWebView, su autoresizingMask se ve así:
—
|
—
^
|
|
| - | ← ---- → | - | | | V La máscara de UIButton no tiene nada definido, es decir, flexible en todas partes
Dentro de mi -viewDidLoad, llamo mi -repositionSubViews dentro del cual hago lo siguiente:
Si no hay UIWebView, no hago nada excepto centrar el UIButton que coloqué con IB.
Si tengo un UIWebView, entonces determino su * content * Height y configuro su frame para encerrar todo el contenido.
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
Una vez que hago eso, aplico programáticamente el UIButton hacia abajo para que termine debajo de UIWebView.
Todo funciona, hasta que lo gire de Vertical a Paisaje.
Llamo a mi -repositionSubViews dentro de mi -didRotateFromInterfaceOrientation.
¿Por qué la altura del contenido de mi UIWebView no cambia con la rotación ?.
De vertical a horizontal, el ancho del contenido debería expandirse y la altura del contenido debería reducirse. Hace visualmente como debería, pero no de acuerdo con mi NSLog.
De todos modos, con o sin UIWebView, el botón del que he hablado se mueve debajo de TabBar cuando está en modo Paisaje, pero no se desplazará hacia arriba para ser visto. Lo veo detrás de la TabBar cuando me desplazo "enérgicamente", pero luego "retrocede" detrás de la TabBar.
En pocas palabras, esta es la razón por la que he preguntado sobre la altura del TabBar y la Barra de navegación porque el TabBar se planta en la parte inferior de la UIView y la Barra de navegación empuja hacia abajo la UIView.
Ahora, voy a agregar un comentario o dos aquí porque no tendrían sentido antes.
Sin UIWebView, dejo todo tal como lo ve IB.
Con UIWebView, aumento el frame.height de UIWebView a su contentHeight y también ajusto hacia arriba la altura del UIScrollView circundante que rodea todas las sub-vistas.
Bueno, ahí lo tienes.
Aquí está el comienzo de mi respuesta a su actualización:
¿Por qué la altura del contenido de mi UIWebView no cambia con la rotación ?.
¿Podría ser que debido a que su cambio de tamaño automático no tiene el encoder automático de Mask para todas las direcciones?
Otra sugerencia antes de volver para esto, ¿podría usar una barra de herramientas para sus necesidades? Es un poco más simple, siempre estará en la parte inferior, auto rota / posiciones. Puede ocultarlo / mostrarlo a voluntad, etc. Algo así como: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
Es posible que haya mirado esa opción, pero solo la arrojó allí.
Otra idea, ¿podría detectar la orientación desde la que gira, y simplemente colocar el botón programáticamente para ajustar la barra de pestañas? (Esto es posible con el código)
Con iPhone-X, la altura de la barra superior (barra de navegación + barra de estado) se cambia (aumenta).
Intente esto si desea la altura exacta de la barra superior (barra de navegación + barra de estado):
C objetivo
CGFloat topbarHeight = ([UIApplication sharedApplication].statusBarFrame.size.height +
(self.navigationController.navigationBar.frame.size.height ?: 0.0));
Swift 4
let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
Para mayor facilidad, prueba esta extensión UIViewController
extension UIViewController {
/**
* Height of status bar + navigation bar (if navigation bar exist)
*/
var topbarHeight: CGFloat {
return UIApplication.shared.statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
}
}
Swift 3
let topBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
Haz algo como esto?
NSLog(@"Navframe Height=%f",
self.navigationController.navigationBar.frame.size.height);
La versión rápida se encuentra aquí
La bombilla comenzó a encenderse. Lamentablemente, no he descubierto una forma uniforme de corregir el problema, como se describe a continuación.
Creo que todo mi problema se centra en mis Masas de Autentificación. Y la razón por la que he llegado a la conclusión de que son los mismos síntomas existe, con o sin UIWebView. Y ese síntoma es que todo es color de rosa para Portrait. Para Landscape, el botón UIButton inferior aparece debajo de TabBar.
Por ejemplo, en una UIView, tengo, de arriba a abajo:
UIView : conjunto de muelles (caso predeterminado) y sin puntales
UIScrollView : si configuro los dos resortes y borro todo lo demás (como UIView), el UIButton se inmiscuye en el objeto que está justo encima de él. Si borro todo, entonces UIButton está bien, pero las cosas en la parte superior se esconden detrás de StatusBar. Configurando solo el puntal superior, UIButton aparece debajo de la barra de pestañas.
UILabel y UIImagen siguiente verticalmente - juego de puntal superior, flexible en cualquier otro lado
Solo para completar la imagen para los pocos que tienen una UIWebView:
UIWebView - Struts: arriba, izquierda, derecha Springs: ambos
UIButton : nada establecido, es decir, flexible en todas partes
Aunque mi foco de luz es tenue, parece que hay esperanza.
Versión Swift :
let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height
UIImage*image = [UIImage imageNamed:@"logo"];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
float logoRatio = image.size.width / image.size.height;
float targetWidth = targetHeight * logoRatio;
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
// X or Y position can not be manipulated because autolayout handles positions.
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth) / 2 , (self.navigationController.navigationBar.frame.size.height - targetHeight) / 2 , targetWidth, targetHeight)];
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)];
self.navigationItem.titleView = logoView;
// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/
[logoView setContentMode:UIViewContentModeScaleAspectFit];
/* Autolayout constraints also can not be manipulated since navigation bar has immutable constraints
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false;
NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]};
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView};
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]];
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]];
NSLog(@"%f", self.navigationItem.titleView.width );
*/
Entonces todo lo que realmente necesitamos es
UIImage*image = [UIImage imageNamed:@"logo"];
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)];
[logoView setContentMode:UIViewContentModeScaleAspectFit];
self.navigationItem.titleView = logoView;