2015-03-03 60 views
1

我在故事板中設置了視圖控制器。視圖控制器的視圖包含一個子視圖(UITableView),其父視圖的四邊都有固定的邊緣,基本上可以使視圖充滿它的父視圖。iOS:Autolayout與iOS 7和iOS 8上的子視圖約束的區別

我加入視圖控制器的主視圖作爲另一視圖控制器的視圖的這樣一個子視圖:

UIView *overlayView = firstViewController.view; 

[overlayView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

UIView *sourceView = secondViewController.view; 

[sourceView addSubview:overlayView]; 


NSLayoutConstraint *constraint; 

constraint = [NSLayoutConstraint constraintWithItem:overlayView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:sourceView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0]; 

[sourceView addConstraint:constraint]; 

constraint = [NSLayoutConstraint constraintWithItem:sourceView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:overlayView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:100]; 

[sourceView addConstraint:constraint]; 

constraint = [NSLayoutConstraint constraintWithItem:overlayView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:sourceView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; 

[sourceView addConstraint:constraint]; 

constraint = [NSLayoutConstraint constraintWithItem:overlayView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:sourceView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0]; 

[sourceView addConstraint:constraint]; 

[sourceView layoutIfNeeded]; 

我想有從視圖到其父等於100個像素的右邊緣的間隙。

現在很奇怪,它在iOS 8上按預期工作,但在iOS 7上無法這樣做,並且全屏顯示視圖忽略尾隨約束上設置的常量100。另外,如果正在添加的視圖控制器的視圖沒有子視圖 - 那麼它按預期工作。是否將setTranslatesAutoresizingMaskIntoConstraints:應用於iOS 7視圖的所有子視圖?這可能是什麼原因?

編輯:

的問題應該與子視圖正在由操作系統管理的方式。

enter image description here

當容器視圖設置爲出口視圖控制器的view財產,事情不工作。但是,如果我將表格視圖設置爲view屬性的出口,它就可以工作。如果有一個帶有固定邊緣的子視圖到它的超級視圖,然後我將其他約束添加到超級視圖,會發生奇怪的事情。我不明白爲什麼它適用於iOS 8雖然很好...

EDIT 2

這個問題似乎只與trailing約束的情況發生。如果我想修改任何其他約束的常量,那麼沒有問題?!

回答

1

你可以嘗試在約束條件下與overlayView交換sourceView嗎?

`constraint = [NSLayoutConstraint constraintWithItem:sourceView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:overlayView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:100];` 

這實際上意味着sourceView.trailing - 100 = overlayView.trailing;這不是你想要的。

編輯1:setTranslatesAutoresizingMaskIntoConstraints:被施加到在IOS 7的視圖的所有子視圖?

NO。 translatesAutoresizingMaskIntoConstraints僅針對您明確稱爲setTranslatesAutoresizingMaskIntoConstraints的視圖設置。

+0

是的,檢查我的編輯。交換他們似乎正在解決這個問題。我不明白爲什麼。你有好主意嗎 ? – Petar 2015-03-03 11:05:45

+0

正如你可以閱讀我的新答案,它將解決混亂。基本上你在做什麼是 sourceView.trailing - 100 = overlayView.trailing。 這意味着您的拖尾overlayView正試圖走出sourceView。 – jarora 2015-03-03 11:07:45

+0

@ pe60t0如果回答您的問題,請按預期標記此答案。 – jarora 2015-03-03 11:15:25