2016-08-15 48 views
0

我使用下面的代碼到一個覆蓋視圖添加到視圖:添加子視圖的UITableView與自動佈局不設置它的框架

UIView *overlayView = [[UIView alloc] init]; 
overlayView.backgroundColor = [UIColor redColor]; 

[self.view addSubview:overlayView]; 

overlayView.translatesAutoresizingMaskIntoConstraints = NO; 
NSDictionary *views = NSDictionaryOfVariableBindings(overlayView); 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[overlayView]|" options:0 metrics:nil views:views]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[overlayView]|" options:0 metrics:nil views:views]]; 

如果我在UIViewControllerviewDidLoad方法將此代碼放在它工作正常。但是,如果我在UITableViewController中執行相同操作,則覆蓋視圖將獲得零幀。

我檢查了視圖,我可以將約束添加正確,並且它們是活動的。但出於某種原因,他們似乎被忽略了。

我沒有收到任何錯誤或警告。

我在這裏錯過了什麼?

PS:我知道我可以用self.view.bounds作爲框架實例化疊加視圖,並且它可以工作。不過,我需要使用自動佈局。

回答

0

懷疑這是因爲UITableView是一個UIScrollView,當處理建立自己的邊界系統的視圖(如滾動視圖或表視圖)時,自動佈局有一些注意事項。

在疊加視圖上設置的約束是這樣的,它限制爲滾動視圖的頂部,右側,底部和左側邊緣,從而限制爲滾動視圖的內容區域而不是滾動視圖的框架。

https://developer.apple.com/library/ios/technotes/tn2154/_index.htmlAuto Layout Guide: Working with Scroll Views:滾動視圖的邊緣或利潤,其 內容之間

約束附加到滾動視圖的內容區域。

而不是將覆蓋視圖限制在內容區域,而是將其限制爲滾動視圖的框架。根據上面的參考文獻,這可以通過將覆蓋視圖的寬度/高度限制爲滾動視圖來完成,或者通過將覆蓋視圖限制在滾動視圖之外的視圖來完成。

+0

是的,我想這是這樣的。我確實以其他方式解決了這個問題,但是我更希望能夠使用自動佈局。 – pajevic

+0

在iOS 11中,您可以使用表視圖的frameLayoutGuide屬性。 –

相關問題