¿Forma más simple de distribuir uniformemente los botones UIB horizontalmente a lo ancho del controller de vista?

¡He visto muchas respuestas y todas parecen muy complejas! Más recientemente, estaba buscando esta respuesta, aunque preferiría no tener que poner mis botones dentro de las vistas.

Tengo 6 botones UIB que tienen todas las mismas dimensiones. Quiero espaciarlos uniformemente horizontalmente en todo el ancho y en la parte inferior de mi controller de vista raíz.

| | | | | [b1] [b2] [b3] [b4] [b5] [b6] | ________________________________________ 

¿Cuál es la forma más simple de lograr esto mediante progtwigción?

Creo que esto es más simple que el enlace en la respuesta aceptada. Ok, en primer lugar vamos a crear algunos botones:

 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeSystem]; button1.translatesAutoresizingMaskIntoConstraints = NO; [button1 setTitle:@"Btn1" forState:UIControlStateNormal]; 

… haz eso 6 veces para 6 botones, como quieras, luego agrégalos a la vista:

 [self.view addSubview:button1]; [self.view addSubview:button2]; [self.view addSubview:button3]; [self.view addSubview:button4]; [self.view addSubview:button5]; [self.view addSubview:button6]; 

Fije un button al final de su vista:

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]]; 

Luego, dígale a todos los botones que tengan el mismo ancho y se extiendan por igual a lo ancho:

 NSDictionary *views = NSDictionaryOfVariableBindings(button1, button2, button3, button4, button5, button6); [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button1][button2(==button1)][button3(==button1)][button4(==button1)][button5(==button1)][button6(==button1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:views]]; 

Resultado:

introduzca la descripción de la imagen aquí

Sé que esta pregunta es un poco vieja, pero he estado progtwigndo en iOS por algunos años y no me gusta usar la reproducción automática. Así que escribí un método auxiliar para espaciar uniformemente los botones UIB horizontalmente y centrarlos verticalmente dentro de una UIView. Esto funciona muy bien para las barras de menu.

 - (void) evenlySpaceTheseButtonsInThisView : (NSArray *) buttonArray : (UIView *) thisView { int widthOfAllButtons = 0; for (int i = 0; i < buttonArray.count; i++) { UIButton *thisButton = [buttonArray objectAtIndex:i]; [thisButton setCenter:CGPointMake(0, thisView.frame.size.height / 2.0)]; widthOfAllButtons = widthOfAllButtons + thisButton.frame.size.width; } int spaceBetweenButtons = (thisView.frame.size.width - widthOfAllButtons) / (buttonArray.count + 1); UIButton *lastButton = nil; for (int i = 0; i < buttonArray.count; i++) { UIButton *thisButton = [buttonArray objectAtIndex:i]; if (lastButton == nil) { [thisButton setFrame:CGRectMake(spaceBetweenButtons, thisButton.frame.origin.y, thisButton.frame.size.width, thisButton.frame.size.height)]; } else { [thisButton setFrame:CGRectMake(spaceBetweenButtons + lastButton.frame.origin.x + lastButton.frame.size.width, thisButton.frame.origin.y, thisButton.frame.size.width, thisButton.frame.size.height)]; } lastButton = thisButton; } } 

Solo copie y pegue este método en cualquier controller de vista. Luego, para acceder a él, primero creé todos los botones que quería, luego llamé al método con todos los botones en una matriz, junto con la UIView que quería.

 [self evenlySpaceTheseButtonsInThisView:@[menuButton, hierarchyMenuButton, downButton, upButton] :menuView]; 

La ventaja de este método es que no necesita autolayout y es muy fácil de implementar. La desventaja es que si su aplicación funciona en horizontal y vertical, deberá asegurarse de volver a llamar a este método después de rotar la vista.

Usualmente hago algo como:

 int numButtons = 6; float gap = 10.0f; float y = 50.0f; float width = (self.view.frame.size.width - gap * (numButtons + 1)) / numButtons; float height = 60.0f; for (int n=0;n<numButtons;n++) { float x = gap * (n+1) + width * n; UIButton *button = [self.buttons objectAtIndex:n]; //Or get button some other way/make button. [button setFrame:CGRectMake(x,y,width,height)]; } 

Puede establecer botones numéricos para el número de botones que desee en la fila, y si tiene una matriz de botones, puede establecerlo en la length de esa matriz.

La y es la coorderada que quieras y lo mismo vale para la altura y el espacio, que es el espacio entre los botones. El ancho es solo un cálculo de cuán ancho se basará cada button en el ancho de la pantalla y el espacio de espacio que desee entre cada button.

Puede enviar Label / button / view as array a estos methods y organizar los frameworks de los botones.

 -(void)arrangeViewsXposition:(NSArray*)anyView y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height mainViewWdith:(UIView*)mainview { int count = (int)anyView.count; CGFloat widthTemp = mainview.bounds.size.width, temp1 = widthTemp-(width*count),space = temp1/(count+1); for (int i = 0; i<count; i++) { UIView *btnTemp = (UIView*)[anyView objectAtIndex:i]; if (btnTemp) { btnTemp.frame = CGRectMake(space+((space+width)*i), y, width, height); } } } 

Llame a este método así:

 [self arrangeViewsXposition:@[btnSave,btnCancel] y:5 width:80 height:30 mainViewWdith:footerView]; 

Hay una serie de soluciones decentes de layout automático que se discuten en esta pregunta:

Distribuya de manera uniforme varias vistas dentro de una vista de contenedor.

Básicamente puede ser una gran cantidad de código de definición de restricción manual, que puede envolverse cómodamente en una extensión de categoría para encapsulación / reutilización.

Acabo cociné esto en Swift usando cartografía .

 func disributeEvenlyAcrossWithCartography(views: [UIView], enclosingBox: UIView, spacer: CGFloat = 10.0) { var priorView = UIView() // never null for (index, view) in views.enumerate() { constrain(view, priorView, enclosingBox) { view, prior, enclosingBox in view.height == enclosingBox.height view.centerY == enclosingBox.centerY if index == 0 { view.width == enclosingBox.width / CGFloat(views.count) - spacer view.left == enclosingBox.left } else { view.left == prior.right + (spacer + spacer / CGFloat(views.count - 1)) view.width == prior.width } } priorView = view } } 

Resultado con 5 vistas y un pequeño espaciador:

introduzca la descripción de la imagen aquí

Esta es mi primera publicación en Stackoverflow. Este sitio ha sido muy útil para ayudarme a acelerar en Xcode y rápido. De todos modos, a continuación se muestra mi solución rápida y sucia a la pregunta anterior.

Pin el button más a la izquierda y el button más a la derecha, respectivamente. Cree tags "ficticias" entre cada uno de los botones. Establezca todas las tags "ficticias" como anchos iguales. Para cada label "ficticia", agregue restricciones (0 al vecino más cercano a la izquierda y 0 al vecino más cercano a la derecha). Los botones estarán igualmente espaciados en todas partes, incluso cuando cambie de orientación de retrato a paisaje.