2013-09-09 2 views
16

Я просмотрел множество ответов, и все они кажутся очень сложными! Совсем недавно я смотрел на this answer, хотя я бы предпочел не прикладывать свои кнопки внутри просмотров.Простейший способ равномерного распределения UIButtons по горизонтали по ширине контроллера вида?

У меня есть 6 UIButton, которые имеют одинаковые размеры. Я хочу разместить их равномерно горизонтально по всей ширине и внизу моего контроллера корневого представления.

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

Каков самый простой способ достичь этого программно?

+0

Ваше решение не является самым простым способом, а если добавить или удалить кнопки, вы должны рассчитать множители снова. См. Мой ответ для правильного способа сделать это. Также мое решение удовлетворяет вашему другому требованию, что вы не хотите вставлять свои кнопки в виде. – bandejapaisa

ответ

19

Я думаю, что это проще, чем ссылка на принятый ответ. Хорошо, во-первых, позволяет создать несколько кнопок:

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

... сделать это в 6 раз за 6 кнопок, однако вы, как затем добавить их к виду:

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

Фикс одна кнопка в нижней части ваше мнение:

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

Тогда скажите все кнопки, чтобы быть одинаковой ширины и выкладывается равномерно по ширине:

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]]; 

Результат:

enter image description here

+0

Спасибо bandejapaisa - это намного элегантнее! – fxfuture

+1

Это не помогло мне, поэтому я создал этот вспомогательный класс в Swift: [DistributeViewsEvenly-Swift] (https://github.com/chrisben/DistributeViewsEvenly-Swift), который использует невидимые проставки, как рекомендовано Apple в [этой документации] (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html#//apple_ref/doc/uid/TP40010853-CH5-SW8) – chrisben

+0

@ chrisben Я думаю, что ваше решение требует отдельного ответа, а не просто комментария. –

1

я обычно делаю что-то вроде:

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)]; 
} 

Вы можете установить numButtons к однако много кнопок, которые вы хотите в строке, и если у вас есть массив кнопок, вы можете установить его в length этого массива ,

Y - это то, что вы хотите, и то же самое относится к высоте и промежутку, который является пространством между кнопками. Ширина - это просто расчет того, насколько широка каждая кнопка будет основываться на ширине экрана и пространстве пробелов, которое вы хотите между каждой кнопкой.

0

Есть целый ряд достойных решений автоматической компоновки, обсуждаемых в этом вопросе:

Evenly space multiple views within a container view

В основном это может быть много ручного код ограничения четкости, который может быть удобно завернутым в расширении категории для инкапсуляции/повторного использования.

2

Я знаю, что этот вопрос немного старый, но я программировал в прошивке в течение нескольких лет и не люблю, используя autolayout. Поэтому я написал вспомогательный метод для равномерного пространства UIButtons по горизонтали и центрирования по вертикали внутри UIView. Это отлично работает для меню.

- (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; 
    } 
} 

Просто скопируйте и вставьте этот метод в любой контроллер вида.Затем к нему доступ, я сначала создал все кнопки, которые я хотел, потом вызвал метод со всеми кнопками в массиве, вместе с UIView Я хотел его.

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

Преимущество этого метода состоит в том, что вам не нужно автозапуск, и это очень просто реализовать. Недостаток заключается в том, что если ваше приложение работает в условиях ландшафта и портрета, вам нужно будет снова вызвать этот метод после поворота представления.

0

Я только что приготовил это в Swift, используя Cartography.

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 
    } 
} 

Результат с 5 видами и небольшой распорки:

enter image description here

0

Это мой первый пост на Stackoverflow. Этот сайт очень помог мне ускорить процесс Xcode и быстро. Во всяком случае, ниже мое быстрое и грязное решение вышеупомянутого вопроса.

Нажать левую самую кнопку и правую большую кнопку, соответственно. Создайте «фиктивные» метки между каждой из кнопок. Установите все метки «фиктивные» как равные ширины. Для каждой метки «фиктивный» добавьте ограничения (от 0 до ближайшего соседа слева и 0 до ближайшего соседа справа). Затем кнопки будут равномерно распределены по всему диапазону, даже если вы перейдете от портретной ориентации к альбомной ориентации.

1

Вы можете отправить этикеток/кнопку/вид в виде массива таким методам и упорядочить рамки кнопок.

-(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); 
    } 
} 
} 

Вызов этого метода, как это:

[self arrangeViewsXposition:@[btnSave,btnCancel] y:5 width:80 height:30 mainViewWdith:footerView]; 
Смежные вопросы