overview human guidelines español developer apple iphone user-interface

iphone - human - Centrar UIViews programáticamente



ios design rules (5)

He visto un montón de preguntas similares a esto, pero nada parece ser completamente lo que estoy buscando. Sin embargo, ¡perdóneme si me perdí la solución respondida en otra pregunta!

Derecha. Tengo una vista. 160 píxeles, alto y ancho. Sé que esta vista se usará como una subvista, y sé que siempre debe centrarse en ambos ejes en cualquier situación en que se use.

Si defino la vista programáticamente, ¿cómo puedo estar seguro de que siempre está perfectamente centrada, horizontal y verticalmente, en relación con su supervista?

Hasta ahora, todo lo que tengo es este código simple:

- (void)loadView { self.view = [[UIView alloc] initWithFrame:CGRectMake(80, 150, 160, 160)]; self.view.backgroundColor = [UIColor greenColor]; self.view.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin); [self.view release]; }

Esto hace la centralización, pero solo en el caso más simple. Cualquier idea es muy apreciada.

EDIT 1:

Con la adición de la siguiente línea de código:

self.view.center = self.view.superview.center;

El punto central de la subvista se convierte en la coordenada (0,0) de la supervista. Tal vez no he configurado la supervista correctamente?


Además de lo que han dicho @Jasarien y @Brad, no olvide que puede forzar el autocentrado utilizando resortes y puntales de Autosizing. Básicamente (en Interface Builder) haces clic hasta que no haya líneas de Autosizing visibles, como esta:

texto alternativo http://gallery.me.com/davedelong/100084/Screen-20shot-202010-03-26-20at-2010-49-18-20AM/web.jpg?ver=12696222220001

En el código, configura el -[UIView autoresizingMask] a:

(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

Si haces esto, la vista se mantendrá centrada automáticamente.

EDIT # 1

Respondiendo a su edición, no puede hacer:

self.view.center = self.view.superview.center;

A menos que su vista se haya agregado como una subvista de otra vista ( [anotherView addSubview:self.view]; ). Mi suposición es que self.view.superview está devolviendo nil , y entonces estás (afortunadamente) obteniendo {0,0} como el valor de retorno cuando intentas invocar el center en nil .

El lugar adecuado para centrar tu vista probablemente sea en el método viewWillAppear: del controlador de vista. Una vez que la vista está a punto de aparecer, usted sabe que debe tener una supervista (de lo contrario, ¿de qué otro modo se trataría?). Puedes establecer de forma segura el center tu vista allí.


Brad Smith me ganó al golpe, con una solución ligeramente más elegante: D

Avíseme si esto no es lo que está buscando, pero ha intentado:

// when adding to a subview, try this, where myView is the view you need centered, // and myMainView is the view you''ll be adding it to as a subview myView.center = myMainView.center; [myMainView addSubview:myView];


Diría que la forma más sencilla de hacerlo es establecer el centro de la vista en el centro de su supervista (que puede obtener de los atributos de altura y ancho de la supervista):

// Init as above and then... // Get superview''s CGSize CGSize size = self.superview.frame.size; [self.view setCenter:CGPointMake(size.width/2, size.height/2)];

No creo que puedas hacer lo más simple:

self.view.center = self.view.superview.center;

Como el centro de la supervista se define en la supervista de la supervista. Por lo tanto, la supervista podría centrarse en (0,0), pero no querría centrar su vista en este punto.

Cita de los documentos de Apple:

El centro se especifica dentro del sistema de coordenadas de su supervista


Suponiendo que está dentro de una subclase de UIView, podría hacer esto:

-(void) layoutSubviews { self.center = self.superview.center; }

O bien, si como se indicó anteriormente, está trabajando dentro de un ViewController, podría

- (void)loadView { //... self.view.center = self.view.superview.center; }


Tuve el mismo problema. Cada vez que intenté acceder a self.view.superview o self.view.window en viewDidLoad, devolvieron nil. En viewDidLoad (supongo que es lo mismo para loadView) esos punteros aún no se han inicializado. Para resolver este problema, puedo darte un truco:

- (void)viewDidLoad { [super viewDidLoad]; // both equal to nil id lwindow = self.view.window; id lparent = self.view.superview; [self performSelector:@selector(myViewDidLoad) withObject:nil afterDelay:0.01]; } - (void)myViewDidLoad { // both not equal to nil! id lwindow = self.view.window; id lparent = self.view.superview; }

Es como self.view.parent y self.view.window se inicializan después de viewDidLoad y loadView.