2015-03-03 52 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