7

Можно ли равномерно распределять левое и правое пространство для b в @"|-[a(5)]-[b(8)]-[c(5)]-|" с использованием строк визуального формата?Равномерно распределить интервал с помощью строки форматирования Auto Layout

+0

ОЧЕНЬ ХОРОШЕЕ СОСТОЯЛОСЬ article, связанная с этим вопросом [здесь] (http://stackoverflow.com/questions/13075415/evenly-space-multiple-views-within-a-container-view/25898949#25898949) –

ответ

13

No.

Однако, вы можете сделать это с визуальным форматом и создание ручного ограничения. Измените строку VFL на:

@"|-[a(5)]->=0-[b(8)]->=0-[c(5)]-|" 

Это говорит о том, что вы не слишком обеспокоены фактическом размере пространства между а и Ь, Ь и с.

Теперь создайте ограничение, фиксирующее центр b в центре надзора, используя constraintWithItem:... (я набираю это на телефоне, поэтому простите меня за то, что не изложил весь метод).

Это, в сочетании с вашим гибким интервалом, даст равные пробелы слева и справа от b.

+0

Это звучит Великий. Я сделаю это. Благодаря! – flohei

+0

Работает просто отлично. Так просто. Благодаря! :-) – flohei

+0

Как именно вы «привязывали центр b к центру надзора», @flohei? И разве не возможно использовать визуальный формат для этого, или же нужно использовать 'constraintWithItem: attribute: relatedBy: toItem: attribute: multiplier: constant:'? –

15

Apple's Auto Layout Guide предлагает использовать «spacer views». Вот решение для укладки ваши три вида с равными промежутками по горизонтали:

// create views dictionary 
NSMutableDictionary *viewsDictionary = [NSMutableDictionary dictionary]; 
[viewsDictionary addEntriesFromDictionary:NSDictionaryOfVariableBindings(viewA, viewB, viewC)]; 

// create 4 spacer views 
for (int i = 0; i < 4; i++) { 
    UIView *spacerView = [[UIView alloc] init]; 
    spacerView.hidden = YES; 
    [self addSubview:spacerView]; 
    [viewsDictionary setObject:spacerView 
         forKey:[NSString stringWithFormat:@"spacer%d", i + 1]]; 
} 

// disable translatesAutoresizingMaskIntoConstraints in views for auto layout 
[viewsDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
{ 
    [obj setTranslatesAutoresizingMaskIntoConstraints:NO]; 
}]; 

// add constraints 
[superview addConstraints: 
[NSLayoutConstraint constraintsWithVisualFormat: 
    @"|[spacer1(>=0)][viewA][spacer2(==spacer1)][viewB][spacer3(==spacer1)][viewC][spacer4(==spacer1)]|" 
             options:kNilOptions 
             metrics:nil 
              views:viewsDictionary]]; 

Обратите внимание, что ширина spacer1 «s устанавливается, чтобы быть больше, чем 0. Последующие виды распорки установлены, чтобы иметь одинаковую ширину с spacer1.

+0

Есть ли причина, по которой вы просто не писали 'NSDictionary * views = NSDictionaryOfVariableBindings (viewA, viewB, viewC);'? –

+0

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

+0

О, право.^___^'NSMutableDictionary * views = NSDictionaryOfVariableBindings (viewA, viewB, viewC) .mutableCopy;' then. –

Смежные вопросы