2013-01-19 77 views
0

在視圖控制器中,最接近self.navigationController.navigationBar的祖先和self.view的子視圖是什麼,所以我可以將約束添加到該祖先?用於設置自動佈局約束的iOS視圖層次

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
[self.searchBar setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self.view addSubview:self.searchBar]; 

NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:self.searchBar 
attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual 
toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeBottom 
multiplier:1.0 constant:0]; 

我試圖做

[self.view addConstraint:cn]; 
[self.navigationController.view addConstraint:cn]; 

但是兩次我得到的錯誤,「是否從該視圖的子樹外的約束參考的東西嗎?那是違法的。」

有人能解釋一個視圖控制器的視圖層次結構相對於navigationController?

謝謝!

+2

有沒有你不能讓你的視圖的頂部和搜索欄的頂部之間約束的原因是什麼?您的視圖的頂部應在導航欄的底部,所以,應該給你想要的東西。 – rdelmar

回答

1

視圖樹是這個樣子:

enter image description here

所以,navigationController.view是導航欄和視圖的最近的祖先。我不知道爲什麼這不起作用。你把這些代碼放在哪裏?

+0

我想在您的評論的建議可能是去這裏的路。搜索欄應該固定在其超級視圖的頂部。 – jrturton

+0

謝謝!我最終在上面的註釋中使用了你的建議,效果很好 –

+0

@rdelmar嗨,但是如果NavigationBar是半透明的,我怎麼能使它工作?在這種情況下,將此約束添加到self.view將隱藏導航欄右側的搜索欄? –

相關問題