7

是否可以使用可視格式字符串在@"|-[a(5)]-[b(8)]-[c(5)]-|"中平均分配b的左右空間?使用自動佈局視覺格式字符串等分分配間距

+0

很好所以這篇文章涉及到這個問題[這裏](http://stackoverflow.com/questions/13075415/evenly-space-multiple-views-within-a-container-view/25898949#25898949) –

回答

13

編號

但是,您可以使用視覺格式和手動約束創建。您VFL字符串更改爲:

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

這是說你不是太在意A和B,B和C之間的空間的實際大小。

現在,使用constraintWithItem:...(我在手機上輸入此信息,因此不原諒我的整個方法)創建一個約束將b的中心固定到超視圖的中心。

這與您的靈活間距相結合,會在b的左側和右側留出空間。

+0

這聽起來很不錯大。我會給它一個鏡頭。謝謝! – flohei

+0

工作很棒。很簡單。謝謝! :-) – flohei

+0

你到底是怎麼「把b的中心定位到superview的中心」@flohei?並且不可能爲此使用視覺格式,或者必須使用'constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:'? –

15

Apple的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的寬度設置爲大於0的後續間隔的觀點被設定爲具有相等的寬度與spacer1

+0

是否有任何理由你沒有簡單地寫'NSDictionary * views = NSDictionaryOfVariableBindings(viewA,viewB,viewC);'? –

+0

我編輯了我的答案,在NSDictionaryOfVariableBindings中使用多個參數。我使用了一個可變字典,以便我可以動態添加我的spacer視圖。 –

+0

哦,對。^___ ^'NSMutableDictionary * views = NSDictionaryOfVariableBindings(viewA,viewB,viewC).mutableCopy;'然後。 –