Sé que la presencia de los más vista controlador (barra de navegación) empuja hacia abajo el UIView por su altura. También sé que a esta altura = 44px. También he descubierto que este empuje hacia abajo mantiene la [self.view].frame.origin.y = 0.

¿Cómo puedo determinar la altura de esta barra de navegación, que no sólo la configuración de un constante?

O, en versión más corta, ¿cómo puedo saber que mi UIView está mostrando con la barra de navegación en la parte superior?


La bombilla de luz comenzó a entrar en el. Por desgracia, no he descubierto una manera uniforme para corregir el problema, como se describe a continuación.

Creo que mi problema se centra en mi autoresizingMasks. Y la razón he llegado a la conclusión de que es el mismo de los síntomas, con o sin un UIWebView. Y ese síntoma es que todo es color de Retrato. Para el Paisaje, la parte más inferior UIButton cop abajo detrás de la TabBar.

Por ejemplo, en una UIView, que tengo, de arriba a abajo:

UIView – los dos resortes de ajuste (caso por defecto) y no struts

UIScrollView – Si me puse los dos muelles, y claro que todo lo demás (como el UIView), entonces el UIButton se entromete en el objeto inmediatamente anterior. Si puedo borrar todo, luego UIButton está bien, pero las cosas en la parte superior se esconde detrás de la barra de Estado únicamente la Configuración de la parte superior del puntal, la UIButton cop abajo detrás de la Barra de pestañas.

UILabel y UIImage siguiente verticalmente – la parte superior del puntal conjunto, flexible en todas partes

Sólo para completar la imagen de los pocos que tienen un UIWebView:

UIWebView – Struts: arriba, izquierda, derecha Springs: tanto

UIButton – nada de lo establecido, es decir, flexible en todas partes

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


Por favor tengan paciencia conmigo porque necesitaba más espacio que el proporcionado por un corto responder a un comentario.

Gracias por tratar de entender lo que estoy muy de pesca para … así que aquí va.

1) Cada UIViewController (un TabBar app) tiene un UIImage, algunas de texto y lo que sea en la parte superior. Otro denominador común es un UIButton en la parte inferior. En algunos de los UIViewControllers tengo un UIWebView por encima de la UIButton.

Así, UIImage, texto, etc. UIWebView (en ALGUNOS) UIButton

Que rodea todo lo anterior es un UIScrollView.

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

   
   |
   

   ^
   |
   |

|—| ←—-→ |—|
|
|
V
El UIButton la máscara no tiene nada de conjunto, es decir, flexible en todas partes

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

Si no hay UIWebView, yo no hago nada excepto el centro de la UIButton que he puesto con el IB.

Si tengo un UIWebView, a continuación, determinar su contenido **Altura y establecer el marco para incluir todo el contenido.

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

Una vez que hago eso, entonces yo programación presione el UIButton de manera que se termina coloca por debajo de la UIWebView.

Todo funciona, hasta que me gire de Vertical a horizontal.

Puedo llamar a mi -repositionSubViews dentro de mi -didRotateFromInterfaceOrientation.

¿Por qué el contenido de la altura de mi UIWebView no cambia con la rotación?.

De Vertical a horizontal, el contenido de la anchura debe ampliar y el contenido de la altura debe reducir. Lo hace visualmente como debería, pero no de acuerdo a mi NSLog.

De todos modos, con o sin un UIWebView, el botón de las que he hablado se mueve por debajo de la TabBar cuando en el modo de Paisaje pero no desplazarse hasta ser visto. Yo lo veo detrás de la TabBar cuando me desplazo a «vigorosamente», pero luego se «cae de nuevo» detrás de la TabBar.

Línea de fondo, esta última es la razón por la que he preguntado acerca de la altura de la TabBar y el NavigationBar porque el TabBar plantas de sí mismo en la parte inferior de la UIView y el NavigationBar empuja el UIView abajo.

Ahora, voy a añadir un comentario o dos, porque aquí no tenía sentido antes.

Sin UIWebView, me deja todo como está, como se ve por el IB.

Con un UIWebView, puedo aumentar el UIWebView del marco.altura a su contentHeight y también ajustar hacia arriba, la altura de los alrededores UIScrollView que rodea a todo el sub-vistas.

Bueno ahí lo tienen.

InformationsquelleAutor John Love | 2011-09-05

9 Comentarios

  1. 235

    Hacer algo como esto ?

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

    El swift versión es encuentra aquí

    • Gracias, gracias, gracias. PERO, ahora que hemos resuelto ese problema, ¿cómo puedo determinar si el NavigationController, aka, el MoreViewController, está mostrando para mi pestaña de la barra de la aplicación.
    • No acabo de conseguir lo que usted está tratando de decir. Estás tratando de averiguar si MoreViewController está mostrando? (Si es así, ¿qué quieres hacer?) y si no, podrías aclarar qué es exactamente lo que significa?
    • He leído tu pregunta de nuevo, y yo todavía no entiendo lo que quieres hacer? Si quieres hacer algo cuando la vista aparece, usted debe insertar el código en viewDidAppear. Si usted aclarar un poco, sería más fácil entender lo que quieres hacer.
    • Sé que esto no tiene dirección de la pregunta, pero parece que él estaba mirando a ver si el navigationBar estaba oculto o no. Si es así, él podría haber usado el auto.navigationController.navigationBarHidden Esperamos plenamente que esto ayude a alguien 🙂
    • En iOS 7+ usted puede necesitar considerar también la 20px barra de estado dependiendo de su aplicación
  2. 65

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

    Pruebe esta opción si desea que la altura exacta de la barra superior (tanto de 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 aliviar, tratar este UIViewController extensión

    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)
    • El Swift 4 respuesta devuelve un 0 alto para mí.
  3. 57

    Swift versión:

    let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height
  4. 6

    Intenta esto?

    let barHeight = self.navigationController?.navigationBar.frame.height ?? 0
  5. 4
    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 );
    */

    Todo lo que realmente 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;
  6. 1

    La bombilla de luz comenzó a entrar en el. Por desgracia, no he descubierto una manera uniforme para corregir el problema, como se describe a continuación.

    Creo que mi problema se centra en mi autoresizingMasks. Y la razón he llegado a la conclusión de que es el mismo de los síntomas, con o sin un UIWebView. Y ese síntoma es que todo es color de Retrato. Para el Paisaje, la parte más inferior UIButton cop abajo detrás de la TabBar.

    Por ejemplo, en una UIView, que tengo, de arriba a abajo:

    UIView – los dos resortes de ajuste (caso por defecto) y no struts

    UIScrollView
    Si he de poner los dos muelles, y claro que todo lo demás (como el UIView), entonces el UIButton se entromete en el objeto inmediatamente anterior.
    Si puedo borrar todo, luego UIButton está bien, pero las cosas en la parte superior se esconde detrás de la barra de Estado
    Únicamente la configuración de la parte superior del puntal, la UIButton cop abajo detrás de la Barra de pestañas.

    UILabel y UIImage siguiente verticalmente – la parte superior del puntal conjunto, flexible en todas partes

    Sólo para completar la imagen de los pocos que tienen un UIWebView:

    UIWebView
    Puntales: arriba, izquierda, derecha
    Resortes: tanto

    UIButton – nada de lo establecido, es decir, flexible en todas partes

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

    • Conjunto de la parte superior del puntal y el conjunto de los dos resortes de la UIWebView – problema resuelto y gracias racimos. Como cuestión de hecho, mi único problema es el diseño de esos malditos @2X, etc. gráficos. Yo uso GraphicConverter de una manera muy simple y se hace bien para el diseño de la Página Web, muy bien. Pero todos estos 30px, 57px cosas – me voy a inexplorados territorio para mí, al menos.
  7. 1

    Aquí es el comienzo de mi respuesta a su actualización:

    ¿Por qué el contenido de la altura de mi UIWebView no cambia con la rotación?.

    Podría ser que debido a su cambio de tamaño automático no tiene la autoresizingMask para todas las direcciones?

    Otra sugerencia antes de que yo vuelva para esto, se puede utilizar una barra de herramientas para sus necesidades. Es un poco más simple, siempre estará en la parte inferior, auto-gira/posiciones. Puede mostrar u ocultar a voluntad, etc. Algo así como esto: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

    Puede haber mirado esa opción, pero sólo tirando por ahí.

    Otra idea, se podría detectar cuál es la orientación que están rotando, y sólo tiene que colocar el botón de programación para ajustar la barra de pestañas. (Esto es posible con el código)

    • Después de 2 semanas en la lucha contra esto, he decidido que el «problema» se hizo más difícil por la colocación de un UIButton DEBAJO de la UIWebView sub-view. Así que, puse el botón de ARRIBA. Francamente, sólo que no se ve «bien» de esa manera … pero ahora funciona ESPECIE DE. Por DEBAJO o por ENCIMA de la UIWebView ha establecido la parte superior del puntal y sólo la horizontal de la primavera. Por CIERTO, la contentHeight de la UIWebView que no cambia con la rotación.
  8. 1

    Mi aplicación tiene un par de puntos de vista que se requiere una personalización de la barra de navegación en la interfaz de usuario para el look & feel, sin embargo sin la navegación controlador. Y la aplicación es necesaria para apoyar la versión de iOS antes de iOS 11, de modo que la mano del área de seguridad guía de diseño no podría ser utilizado, y tengo que ajustar la posición y la altura de la barra de navegación mediante programación.

    Os adjunto la Barra de Navegación para su superview directamente, saltándose el área de seguridad guía de diseño como se mencionó anteriormente. Y la barra de estado de la altura puede ser recuperada a partir de UIApplication fácilmente, pero el valor por defecto de la barra de navegación de altura, es realmente un dolor en el culo…

    Me llamó la atención para que casi la mitad de la noche, con un número de buscar y probar, hasta que finalmente llegué a la sugerencia de otro post (no trabajo para mí, sin embargo), que realmente podía llegar a la altura de UIView.sizeThatFits(), así:

    - (void)viewWillLayoutSubviews {
        self.topBarHeightConstraint.constant = [UIApplication sharedApplication].statusBarFrame.size.height;
        self.navBarHeightConstraint.constant = [self.navigationBar sizeThatFits:CGSizeZero].height;
    
        [super viewWillLayoutSubviews];    
    }

    Finalmente, un perfecto barra de navegación buscando exactamente el mismo que el construido-en-uno!

  9. 0

    Que he utilizado:

    let originY: CGFloat = self.navigationController!.navigationBar.frame.maxY

    Gran trabajo si usted desea conseguir la barra de navegación de altura Y su origen Y.

Dejar respuesta

Please enter your comment!
Please enter your name here