Подтвердить что ты не робот

Автоматическая компоновка iOS: равные пробелы для соответствия ширине Superviews

Возможный дубликат:
Автоопределение равномерного пробега

Я пытаюсь создать прокручиваемую панель с кнопками (аналогично UISegmentedControl). Супервизор - UIScrollView. Как только кнопки не вписываются в прокрутку, прокрутка должна быть прокручиваемой. Пока все работает нормально:

С большим количеством кнопок (прокручивается вправо):

Scrolled View

Не так много кнопок:

View is not scrolling

Теперь моя цель состоит в том, что если есть место для всех кнопок, они должны быть равномерно распределены по всему представлению 320 пикселей. Как определить ограничения для пробелов между кнопками?

В настоящее время я использую следующие ограничения (self - UIScrollView):

UIView *firstButton = self.buttons[0];

[self.buttonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(5)-[firstButton]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(firstButton)]];

UIView *lastButton = [self.buttons lastObject];

[self.buttonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[lastButton]-(5)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lastButton)]];

UIView *previousView = nil;

for (UIView *view in self.buttons) {
    if (previousView) {
        [self.buttonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[previousView]-(5)-[view]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(previousView, view)]];
    }
    previousView = view;
}

Если я изменил тип супервизора с UIScrollView на UIView, я получаю следующий результат, все еще не тот, который я хочу, но по крайней мере он ищет ограничение последней кнопки, которое связывает его с (имеет смысл, что этого не происходит для scrollview, так как размер содержимого автоматически устанавливается):

UIView as the superview

Любые идеи?

4b9b3361

Ответ 1

- (void) viewWillLayoutSubviews {
    // UIButton *button1, *button2, *button3, *button 4 ;
    // NSMutableArray *constraintsForButtons ;

    float unusedHorizontalSpace = self.view.bounds.size.width - button1.intrinsicContentSize.width - button2.intrinsicContentSize.width - button3.intrinsicContentSize.width - button4.intrinsicContentSize.width ;
    NSNumber* spaceBetweenEachButton=  [NSNumber numberWithFloat: unusedHorizontalSpace / 5 ] ;

    [self.view removeConstraints:constraintsForButtons] ;
    [constraintsForButtons removeAllObjects] ;
    [constraintsForButtons addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-(space)-[button1]-(space)-[button2]-(space)-[button3]-(space)-[button4]-(space)-|"
                                                                                        options: NSLayoutFormatAlignAllCenterY
                                                                                        metrics: @{@"space":spaceBetweenEachButton}
                                                                                          views: NSDictionaryOfVariableBindings(button1,button2,button3,button4) ] ] ;
    [constraintsForButtons addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[button1]"
                                                                                        options: 0
                                                                                        metrics: nil
                                                                                          views: NSDictionaryOfVariableBindings(button1) ] ] ;
    [self.view addConstraints:constraintsForButtons] ;
}

Это не так красиво, как у вас, и предполагается, что есть 4 кнопки, но это равномерно их. То есть пустые пространства между кнопками имеют одинаковую ширину. Это не означает, что расстояние между NSLayoutAttributeLeading кнопки 1 и кнопки 2 совпадает с расстоянием между кнопками 2 и button3.

portraitlandscape