2013-06-21 93 views
9

我是新來的iOS自動佈局。原則上我非常喜歡這個概念,但是這讓我堅持要完成最簡單的事情。我懷疑我仍然錯過了一些簡單的基本原則。我正在嘗試通過實際操作學習,並在實際使用應用程序之前獲得基礎知識,因此我正在創建非常簡單的測試項目。這是一個非常簡單的方法,不會像預期的那樣工作。首先是工作的部分。在IB,我添加了一個視圖以填充整個視圖 - 控制和XCode的自動設置約束頂部/底部/上升/下降和空間爲0。當IB完成的,它按預期工作:以編程方式設置約束與在IB中設置它們不同?

enter image description here

旋轉到

enter image description here

太好了!

現在我試圖做同樣的事情在代碼:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
UIView *redView = [[UIView alloc] initWithFrame:self.view.bounds]; 
redView.backgroundColor = [UIColor redColor]; 
[self.view addSubview:redView]; 

redView.translatesAutoresizingMaskIntoConstraints = NO; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 
} 

這是所有的代碼中有比單視圖應用程序的默認代碼等。

當我運行上面的代碼,試圖反映同樣的事情,因爲我與IB得到編程,我得到這個旋轉後:

enter image description here

怎麼說,同樣的限制導致不同的結果?這可能是我錯過的非常簡單和令人尷尬的愚蠢行爲。幫幫我!!!

回答

6

這是我會怎麼做:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]|" 
                    options:0 
                    metrics:nil 
                    views:NSDictionaryOfVariableBindings(redView)]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[redView]|" 
                    options:0 
                    metrics:nil 
                    views:NSDictionaryOfVariableBindings(redView)]]; 

自動版式在IB可以是一個痛苦,我發現,熟悉自己與Visual格式語言比constraintWithItem工作量少:屬性:relatedBy:toItem:屬性:乘數:常數:

+0

謝謝!這工作(在添加失蹤|在V:| [redView] ...但爲什麼這個heck不會我的其他代碼工作?它是等效的到什麼IB顯示,不是嗎??? – user1459524

+0

是的,我錯過了一個管道。修正。而且,說實話,我不知道。我發現VFL,並沒有進一步尋找我的AutoLayout需要。 – geraldWilliam

+0

嗨! 6個月後,我遇到了同樣的問題,但我想做t直接使用mycontroller.view的帽子,而不是mycontroller.view中的視圖。它只是......沒有! – shinyuX

1

而不是引導和尾隨,使用頂部和底部。請注意,您正在原始帖子中混合這些內容。領導和追蹤似乎混淆了人們!

7

我知道這是舊的,但我認爲你的限制的問題是你混淆了尾隨等代表什麼。我已經修改你的代碼下面,它現在充滿預期的屏幕:

 UIView *redView = [[UIView alloc] initWithFrame:self.view.bounds]; 
redView.backgroundColor = [UIColor redColor]; 
[self.view addSubview:redView]; 

redView.translatesAutoresizingMaskIntoConstraints = NO; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]]; 

你被設置尾隨約束等於底部(尾隨實際上是右手邊不是底部和你有關頂部約束到左側(領先)

相關問題