2012-11-28 73 views
2

我想在視圖中均勻地放置四個按鈕。在故事板中,我將這些按鈕定位在縱向視圖中,因此間距是正確的。但是我沒有找到正確的約束設置來讓按鈕在任何視圖寬度上均勻分佈(對於縱向iPad或橫向)。所以,我說下面的代碼片段,使用第一和第四按鈕爲錨移動按鈕所需的位置:ios UIViewController以編程方式定位按鈕不起作用

// evenly space the buttons 
CGPoint leftPoint = self.button1.center; 
CGPoint rightPoint = self.button4.center; 
CGFloat width = rightPoint.x - leftPoint.x; 
leftPoint.x += width/3; 
rightPoint.x -= width/3; 
self.button2.center = leftPoint; 
self.button3.center = rightPoint; 

定位代碼工作正常,但我的困難是找到使最好的地方調整。 - (void)viewDidAppear:(BOOL)animated 似乎是最好的地方。但是,如果我將其分類爲不同的視圖,那麼當我返回到此視圖時,這些按鈕將恢復爲它們的初始(storybaord約束)指定位置。 viewDidAppear代碼將再次被調用,但它不能成功移動按鈕。就好像他們的位置在那個時間點被鎖定一樣。

我想我的主要問題是如果有一種方法可以使用約束來實現我之後的均勻間距。或者第二個問題是如何覆蓋這兩個按鈕的自動定位。

回答

1

我被引導的解決方案是以編程方式將約束添加到兩個中間按鈕(按鈕2 & button3),這些按鈕將它們相對於視圖中間水平放置。這兩個限制允許我完全刪除手動定位代碼。 Evenly space multiple views within a container view的回答幫助我走上了正軌。

- (void)viewDidLoad 
{ 
... 
    self.button2.translatesAutoresizingMaskIntoConstraints = NO; 
    self.button3.translatesAutoresizingMaskIntoConstraints = NO; 

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual 
     toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:0.667 constant:0]]; 

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.button3 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual 
     toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.333 constant:0]]; 
0

對於幾乎所有佈局問題的情況下使用layoutSubviews方法,這是做它的地方。

+0

我試着將定位代碼移動到ViewController的 - (void)viewDidLayoutSubviews方法中,結果相同。第一次出現視圖時,這些按鈕的位置正確,但從一個循環返回時,這些按鈕不會移動到指定的中心點。 – user1806529

2

這是使用佈局約束的相對困難的事情,它取決於你想要的。我在這裏有一個例子,它創建了4個按鈕(代碼中)以及5個用作按鈕之間的間隔符的標籤。按鈕的大小由其內在內容大小決定,並且按鈕之間以及按鈕與包含視圖兩側之間的間距都是相同的。

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary]; 
    NSArray *titles = @[@"Short",@"Longer",@"Short",@"The Longest"]; 
    for (int i=1; i<5; i++) { 
     UIButton *b = [UIButton buttonWithType:1]; 
     [b setTitle:titles[i-1] forState:UIControlStateNormal]; 
     [b setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]]; 
    } 

    for (int i=1; i<6; i++) { 
     UILabel *l = [[UILabel alloc ]init]; 
     [l setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [viewsDict setObject:l forKey:[NSString stringWithFormat:@"l%d",i]]; 
    } 

    for (id obj in viewsDict.allKeys) 
     [self.view addSubview:viewsDict[obj]]; 

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|" 
                    options:NSLayoutFormatAlignAllBaseline 
                    metrics:nil 
                    views:viewsDict]; 

    NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[b1]-|" 
                    options:0 
                    metrics:nil 
                    views:viewsDict]; 


    [self.view addConstraints:constraints]; 
    [self.view addConstraints:constraints2]; 
} 

當視圖大小改變時,按鈕的間距會自動調整,如旋轉。

+0

謝謝。你的回答讓我朝正確的方向想出瞭如何以編程方式添加約束。 – user1806529

+0

滿足我的要求,但你能告訴我自動佈局的故事板,那麼它對我或任何想法或建議更好? –