76

Sé que la presencia del controlador de vista más (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 el [self.view].frame.origin.y = 0.Obtener la altura de la barra de navegación mediante programación

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 que mi UIView se muestre con la barra de navegación en la parte superior?


La bombilla de luz 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 AutenticarMáscaras. 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 un UIView, tengo, de arriba a abajo:

UIView - ambos muelles establecidos (caso por defecto) y no hay puntales

UIScrollView - Si fijo los dos muelles, y claro todo lo demás (como el UIView), entonces el UIButton se inmiscuye en el objeto inmediatamente 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 UIImage próxima verticalmente - conjunto de puntal superior, flexible en todas partes

Sólo para completar el cuadro de los pocos que tienen un UIWebView:

UIWebView - Puntales: arriba, izquierda, derecha Springs tanto

UIButton - nada establecido, es decir, en todas partes flexibles

Aunque mi bombilla de luz es tenue, no parece haber esperanza.


Tenga paciencia porque necesitaba más espacio que el proporcionado por 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 en la parte superior. Otro denominador común es un UIButton en la parte inferior. En algunos UIViewControllers tengo un UIWebView arriba del UIButton.

Así, UIImage, texto, etc UIWebView (en algunos) UIButton

Alrededor de todo lo anterior es un UIScrollView.

2) Para aquellos que tienen un UIWebView, su autoresizingMask parece:

— 
    | 
    — 

^
    | 
    | 

| - | ← ---- → | - | | | V máscara de la UIButton ha establecido, es decir, en todas partes flexibles

Dentro de mi -viewDidLoad nada, llamo a mi -repositionSubViews dentro del cual hago lo siguiente:

Si no hay UIWebView, no hago nada, excepto el centro el UIButton que coloqué con IB.

Si tengo un UIWebView, entonces determino su * content * Height y configuro su marco para encerrar todo el contenido.

UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject]; 
webViewContentHeight = scrollViewInsideWebView.contentSize.height; 
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY, 
          sameWholeViewScrollerWidth, webViewContentHeight)] 

Una vez hago eso, entonces yo empujo la programación UIButton abajo de modo que termina coloca por debajo de la UIWebView.

Todo funciona, hasta que lo gire de Vertical a Horizontal.

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 debe expandirse y la altura del contenido debe 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 verse. 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 al UIView hacia abajo.

Ahora, voy a agregar un comentario o dos aquí porque no tendrían sentido antes.

Sin UIWebView, dejo todo tal como está visto por 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, ya lo tienes.

Respuesta

1

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 AutenticarMáscaras. 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 - ambos muelles establecidos (caso por defecto) y no hay puntales

UIScrollView - Si establecer el dos resortes, y borrar todo lo demás (como el UIView), entonces el UIButton se inmiscuye en el objeto inmediatamente 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 UIImage próxima verticalmente - conjunto de puntal superior, flexible en todas partes

Sólo para completar el cuadro de los pocos que tienen un UIWebView:

UIWebView - puntales: arriba, de izquierda , derecha Springs: tanto

UIButton - conjunto nada, es decir, en todas partes flexibles

Aunque mi bombilla es débil, parece que hay esperanza.

+0

Configure el puntal superior y configure los dos resortes de UIWebView - problema resuelto y gracias racimos. Como cuestión de hecho, mi único problema restante es diseñar esos gráficos malditos @ 2X, etc. Utilizo GraphicConverter de una manera muy simple y funciona muy bien para el diseño de la página web. Pero todas estas cosas de 30px, 57px: voy a entrar en un territorio desconocido para mí, al menos. –

204

Haga algo como esto?

NSLog(@"Navframe Height=%f", 
     self.navigationController.navigationBar.frame.size.height); 

La versión rápida es located here

+0

Gracias, gracias. PERO, ahora que ha resuelto ese problema, ¿cómo puedo determinar si NavigationController, también conocido como MoreViewController, se muestra para mi aplicación de barra de pestañas? –

+0

No entiendo muy bien lo que intentas decir. ¿Estás tratando de averiguar si MoreViewController se está mostrando? (De ser así, ¿qué quieres hacer?) Y si no, ¿podrías aclarar qué es exactamente lo que quieres decir? – Sum

+0

Leí su pregunta nuevamente y todavía no entendía lo que quería hacer. Si desea hacer algo cuando aparece la vista, debe insertar el código en viewDidAppear. Si aclaras un poco, sería más fácil calcular lo que quieres hacer. – Sum

1

Aquí es el comienzo de mi respuesta a la 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áticoMask para todas las direcciones?

Otra sugerencia antes de volver para esto, podría utilizar 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 coloque el botón programáticamente para ajustar la barra de pestañas? (Esto es posible con el código)

+0

Después de aproximadamente 2 semanas para abordar esto, decidí que el "problema" se hizo más difícil al colocar un UIButton debajo de la subvista UIWebView. Entonces, coloqué el botón ARRIBA. Francamente, simplemente no se ve "bien" de esa manera ... pero ahora funciona SORT OF. A CONTINUACIÓN o ARRIBA, UIWebView ha establecido el puntal superior y solo el resorte horizontal. Por cierto, es el contenidoAltura de UIWebView que no cambia con la rotación. –

50

Swift versión:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height 
3
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); 
*/ 

Así que todo lo que realmente se necesita 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; 
4

¿Usted intentó esto?

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0 
4

Con iPhone-X, la altura de la barra superior (barra de navegación + barra de estado) se cambia (aumenta).

Pruebe esta opción si desea altura exacta de la barra superior (tanto la barra de navegación + barra de estado):

Objective-C

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, pruebe 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) 
Cuestiones relacionadas