uiview - ¿Cómo obtener el tamaño de fotograma real[UIScreen mainScreen]?
frame uiapplication (5)
Estoy un poco molesto Tengo una aplicación con la barra de estado visible en la ventana principal. Dado que me gustaría configurar dinámicamente mis vistas y sus tamaños de fotogramas (tal vez la barra de estado ocupe 40 píxeles durante una llamada telefónica, por ejemplo).
Puedo hacer uno de los dos:
[[UIScreen mainScreen] bounds];
[[UIScreen mainScreen] applicationFrame];
Lo realmente molesto es que estos dos emiten dos conjuntos diferentes de valores, cada uno igualmente inútil.
saldrá bounds
: {{0, 0}, {320, 480}}
mientras
applicationFrame
generará {{0, 20}, {320, 460}}
Como puede ver, los bounds
dan el origen y correcto (0 comienza justo debajo de la barra de estado) pero luego da una altura de 480, que es incorrecta. Debería ser 460, ya que la barra de estado está visible. Luego tenemos applicationFrame
que comienza 20 píxeles debajo de la barra de estado (por lo que hay un límite), pero luego da la altura correcta. Pero eso no es muy útil cuando de todos modos se empuja hacia abajo 20 píxeles.
¿Alguna ayuda?
Puede mirar UIWindow. Hereda de UIView por lo que tendrá límites y un marco, y las aplicaciones de iOS son todas de una sola ventana. - [UIApplication keyWindow] devolverá la ventana configurada por el delegado de la aplicación. Como todas las demás vistas están ancladas en la ventana principal, imagino que esto debería darte los límites correctos.
En realidad, 0 no comienza en la parte inferior de la barra de estado. Comienza en la parte superior. Agregue un UILabel a (0,0) y no lo verá a menos que tenga la barra de estado oculta. Entonces, los límites le brindan el área total de la pantalla, y applicationFrame le brinda el área con la que su aplicación debe trabajar. Apuesto a que si oculta la barra de estado, el marco de la aplicación coincidirá con los límites.
Tuve un problema similar. Lo que estaba haciendo era bastante tonto, pero espero que esto ayude a alguien.
En la subvista que tuve:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UIView * otherSubview = [[UIView alloc] initWithFrame:frame];
[self addSubview:otherSubview];
}
return self;
}
Como estaba creando mi subvista con un marco con un origen que no está en (0,0), pero luego uso ese mismo marco para generar subvistas para mi subvista, esas subvistas también se desplazaron hacia abajo. El resultado fue esa molesta pancarta negra que mencionaste.
Lo arreglé haciendo lo siguiente:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
CGRect rect = frame;
rect.origin.x = 0;
rect.origin.y = 0;
UIView * otherSubview = [[UIView alloc] initWithFrame:rect];
[self addSubview:otherSubview];
}
return self;
}
En realidad eso es muy útil.
Cuando le preguntas a un UIScreen
por sus Bounds
, obtienes los límites de la pantalla, que es la pantalla completa del dispositivo. (la barra de estado es parte de la pantalla)
Pero si le pide a una UIScreen
que le diga dónde y cuán grande puede ser la vista de la raíz de su aplicación que solicita la applicationFrame
marco es útil. No existe una relación directa entre las dos llamadas, excepto que el UIScreen bounds
applicationFrame
se devuelve en el sistema de coordenadas de UIScreen bounds
. (Pero la barra de estado no es parte de su aplicación, eso explica el resultado diferente)
applicationFrame
El rectángulo del marco que se usará para la ventana de tu aplicación. (solo lectura)
@property (nonatomic, readonly) CGRect applicationFrame
Discusión
Esta propiedad contiene los límites de la pantalla menos el área ocupada por la barra de estado, si es visible. El uso de esta propiedad es la forma recomendada para recuperar el tamaño de la ventana inicial de su aplicación. El rectángulo está especificado en puntos.
Actualización de Swift 2.0:
func presentAboveAll() {
//Get the view from the nib. Assuming the view is is in AboveAllView.xib
let nibContents = NSBundle.mainBundle().loadNibNamed("AboveAllView", owner: nil, options: nil)
//Get hold of your view
let views = nibContents.filter {
if let _ = $0 as? UIView{
return true
}
return false
}
guard views.count > 0 else {
return
}
//Set up frame and add to the app''s key window
let view = views.first as! UIView
view.frame = UIScreen.mainScreen().bounds
UIApplication.sharedApplication().keyWindow?.addSubview(view)
}