Sé que la presencia del controlador más vista (barra de navegación) empuja hacia abajo la UIView por su altura. También sé que esta altura = 44px. También he descubierto que este empuje hacia abajo mantiene el [self.view].frame.origin.y = 0
.
Entonces, ¿cómo determino la altura de esta barra de navegación, además de establecerla en una constante?
O, en una versión más corta, ¿cómo determino que mi UIView se muestra con la barra de navegación en la parte superior?
La bombilla comenzó a encenderse. Desafortunadamente, 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 autoresizingMasks. Y la razón por la que he concluido es que existen los mismos síntomas, con o sin UIWebView. Y ese síntoma es que todo es color de rosa para Portrait. Para Landscape, el UIButton más inferior aparece detrás 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 el UIView), el UIButton se entromete en el objeto que se encuentra inmediatamente encima de él. Si borro todo, UIButton está bien, pero las cosas en la parte superior se esconden detrás de la barra de estado. Configurando solo el puntal superior, el UIButton aparece detrás de la barra de pestañas.
UILabel y UIImage son los siguientes verticalmente: conjunto de puntal superior, flexible en cualquier otro lugar
Solo para completar la imagen para los pocos que tienen un UIWebView:
UIWebView - Struts: arriba, izquierda, derecha Resortes: ambos
UIButton: nada configurado, es decir, flexible en todas partes
Aunque mi bombilla es tenue, parece haber esperanza.
Por favor, tengan paciencia conmigo 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 en la parte superior. Otro denominador común es un UIButton en la parte inferior. En algunos de los UIViewControllers tengo un UIWebView sobre el UIButton.
Entonces, UIImage, texto, etc. UIWebView (en ALGUNOS) UIButton
Alrededor de todo lo anterior hay un UIScrollView.
2) Para aquellos que tienen un UIWebView, su autoresizingMask se ve así:
—
|
—
^
|
|
| - | ← ---- → | - | El | El | V La máscara de UIButton no tiene nada establecido, es decir, es flexible en todas partes
Dentro de mi -viewDidLoad, llamo a mi -repositionSubViews dentro de la 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 * contenido * Altura y establezco 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 que hago eso, presiono programáticamente el botón UIB hacia abajo para que termine colocado debajo de 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. Lo hace visualmente como debería, pero no según mi NSLog.
De todos modos, con o sin UIWebView, el botón del que hablé se mueve debajo de la barra de pestañas cuando está en modo horizontal, pero no se desplazará hacia arriba para ser visto. Lo veo detrás de la TabBar cuando me desplazo "vigorosamente", pero luego "retrocede" detrás de la TabBar.
En pocas palabras, esta última es la razón por la que he preguntado sobre la altura de TabBar y NavigationBar porque TabBar se planta en la parte inferior de UIView y NavigationBar empuja a UIView hacia abajo.
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 un UIWebView, aumento el marco de UIWebView.height a su contentHeight y también ajusto hacia arriba la altura del UIScrollView circundante que rodea todas las sub-vistas.
Bueno, ahí lo tienes.
Con iPhone-X, la altura de la barra superior (barra de navegación + barra de estado) cambia (aumenta).
Pruebe esto si desea la altura exacta de la barra superior (tanto la barra de navegación como la barra de estado):
ACTUALIZAR
iOS 13
Como
statusBarFrame
fue desaprobado eniOS13
puede usar esto:C objetivo
Swift 4
Para mayor facilidad, pruebe esta extensión UIViewController
Swift 3
fuente
Versión rápida :
fuente
¿Intentaste esto?
fuente
Admite iOS 13 y a continuación:
fuente
Entonces todo lo que realmente necesitamos es
fuente
Mi aplicación tiene un par de vistas que requieren una barra de navegación personalizada en la interfaz de usuario para la apariencia, sin embargo, sin controlador de navegación. Y se requiere que la aplicación sea compatible con la versión de iOS anterior a iOS 11, por lo que no se pudo utilizar la práctica guía de diseño de área segura, y tengo que ajustar la posición y la altura de la barra de navegación mediante programación.
Adjunté la barra de navegación a su supervista directamente, omitiendo la guía de diseño del área segura como se mencionó anteriormente. Y la altura de la barra de estado podría recuperarse fácilmente de la aplicación UIA, pero la altura predeterminada de la barra de navegación es realmente una molestia ...
Me llamó la atención durante casi media noche, con una serie de búsquedas y pruebas, hasta que finalmente recibí la pista de otra publicación (aunque no me funcionó), de que realmente podías obtener la altura de UIView.sizeThatFits (), así :
Finalmente, una barra de navegación perfecta que se ve exactamente igual a la integrada.
fuente
Si solo quieres obtener la
navigationBar
altura, es simple:Sin embargo, si necesita la altura de la muesca superior del iPhone, no necesita obtener la
navigationBar
altura y agregarle lastatusBar
altura, simplemente puede llamarsafeAreaInsets
por eso existe.fuente
La bombilla comenzó a encenderse. Desafortunadamente, 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 autoresizingMasks. Y la razón por la que he concluido es que existen los mismos síntomas, con o sin UIWebView. Y ese síntoma es que todo es color de rosa para Portrait. Para Landscape, el UIButton más inferior aparece detrás de TabBar.
Por ejemplo, en una UIView, tengo, de arriba a abajo:
UIView : ambos resortes establecidos (caso predeterminado) y sin puntales
UIScrollView : si configuro los dos resortes y borro todo lo demás (como el UIView), el UIButton se entromete en el objeto que se encuentra inmediatamente encima de él. Si borro todo, UIButton está bien, pero las cosas en la parte superior se esconden detrás de la barra de estado. Configurando solo el puntal superior, el UIButton aparece detrás de la barra de pestañas.
UILabel y UIImage son los siguientes verticalmente: conjunto de puntal superior, flexible en cualquier otro lugar
Solo para completar la imagen para los pocos que tienen un UIWebView:
UIWebView - Struts: arriba, izquierda, derecha Resortes: ambos
UIButton : nada configurado, es decir, flexible en todas partes
Aunque mi bombilla es tenue, parece haber esperanza.
fuente
Aquí está el comienzo de mi respuesta a su actualización:
¿Podría ser eso porque su cambio de tamaño automático no tiene la máscara de autoresizing 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, rota / coloca automáticamente. Puede ocultarlo / mostrarlo a voluntad, etc. Algo así: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
Es posible que hayas visto esa opción, pero solo la arrojaste.
Otra idea, ¿podría detectar de qué orientación está rotando y simplemente colocar el botón mediante programación para ajustar la barra de pestañas? (Esto es posible con código)
fuente
He usado:
Funciona muy bien si desea obtener la altura de la barra de navegación Y su origen Y.
fuente
Swift 5
Si quieres o considera también el safeArea:
fuente
Extensión Handy Swift 4, en caso de que sea útil para otra persona. Funciona incluso si el controlador de vista actual no muestra una barra de navegación.
Uso:
fuente