我的主要场景UIViewController通过在其视图中放置一个子容器,并在该子容器中嵌入子UIViewController来显示一个孩子.我这样做,从子容器CTRL拖动到孩子UIViewController的storyboard,并选择"嵌入" SEGUE.
这让我可以在UIViewController其他地方封装和重用孩子.我认为这是相当标准的.但我无法正确地进行自动布局.
我做了一个简单的测试用例来证明这一点:https: //github.com/murraycu/ios-example-autolayout-of-child-container-views
它有两个UIViewControllers嵌入在选项卡控制器中,因此您可以在它们之间切换.
"简单"选项卡显示SimpleViewController,其中显示了故事板中显示的图像和标签:

UIImage或UILabel都没有指定高度约束,尽管它们具有等宽(等于父视图)约束以保持宽度简单.
UILabel显然不是很高,但是UIImage和UILabel的内容拥抱优先级略有不同,根据Auto Layout的说法,它们的高度并不含糊.因此,由于自动布局,当我在运行时将其文本设置为需要更多空间的文本时,它会占用更多空间,从而远离其上方的UIImage.这很好 - 这是我想要的行为,如在模拟器中看到的那样:

现在问题:"With Child Container"选项卡显示WithChildContainerViewController,它显示相同的图像,但显示我的ChildViewController(嵌入在子容器中)而不是UILabel.嵌入式ChildViewController显示UILabel.这是在故事板中:

但是,自动布局系统现在似乎不知道子容器需要多少空间来显示我的ChildViewController中标签中的所有文本.与"简单"选项卡中一样,UIImage或子容器都没有指定高度约束.现在XCode抱怨"高度对于容器视图是不明确的".它在模拟器中看起来像这样:

如果我向子容器添加一个约束,将其底部约束到父视图的底部,这会得到改善,如@iphonic所建议的那样:https://github.com/murraycu/ios-example-autolayout-of-child-container -views/commit/1d295fe0a6c4502764f8725d3b99adf8dab6b9ae但高度仍然是错误的:

如何让汽车布局系统知道该怎么做?我已经考虑过实现UIView的intrinsicContentSize,但是UIViewController不是UIView.
这是一个动态细胞
注 - 在示例中,文本不是数据驱动的.它只是单元格的一些文本(例如,考虑帮助文本).在运行时,使用单元格内的实际按钮,将UILabel的.text从一个单词更改为多行.iOS正确调整单元格和表格的大小....
...但仅当单元格在屏幕外滚动,然后再次打开时.
如何提醒表视图重新计算"现在"的所有内容?
(请注意,此问题仅适用于iOS8 +,Xcode7 +,动态单元格高度的自动布局.)
目标:能够为容器视图的框架设置动画,同时它的子视图保持其原始布局和比例与容器视图成比例.
场景:
UIView.animateWithDuration(0, animations: {
self.bounds = myBounds
}) {(One) in
UIView.animateWithDuration(1, animations: {
self.frame = myFrame
}) {(Two) in
UIView.animateWithDuration(0.5, animations: {
self.frame = origFrame
// self.center = myCenter
}) {(Three) in
UIView.animateWithDuration(0.2, animations: {
self.frame = distantFrame
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是原始布局:
我希望成员元素按比例与其容器视图成比例,如下所示:
但是成员元素(一个标签'Hello World!')没有相应调整,因为它们的绿色容器视图动画到左上角的方块:
如何保持UIView成员的布局与其盛行的容器视图框架成比例?
注意:这适用于任何类型的成员(UIView,UITextView,...等); 用于简单的位置/布局和转换(数据透视)动画.
我想以编程方式添加约束,我使用下面的代码来添加TOP和LEFT约束.
NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:label1
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTop
multiplier:1
constant:110];
NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:label1
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeading
multiplier:1
constant:10];
Run Code Online (Sandbox Code Playgroud)
lable1添加到我的视图控制器中.当我在视图中添加这两个约束时
[self.view addConstraint:top];
[self.view addConstraint:left];
Run Code Online (Sandbox Code Playgroud)
它给出了consol中的错误,约束不会影响标签.
2016-02-09 19:36:59.824 testinMRC[99160:313382] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or …Run Code Online (Sandbox Code Playgroud) 我在视图中有一个按钮.我在界面构建器中为我的按钮设置了图像.我在界面构建器中添加到按钮的约束是:
正确的超视空间= 10
顶级空间到superview = 10
底部空间到superview> = 10
将空格留给标签> = 10
一切正常,我的布局没问题.但是当我使用以下代码记录按钮约束时:
NSLog(@"constraints for btnBack is: %@", self.btnBack.constraints);
Run Code Online (Sandbox Code Playgroud)
控制台日志:
constraints for btnBack is:(
"<NSContentSizeLayoutConstraint:0x7c35c400 H:[UIButton:0x7c3588a0(102)] Hug:250 CompressionResistance:750>"
"<NSContentSizeLayoutConstraint:0x7c35c450 V:[UIButton:0x7c3588a0(92)] Hug:250 CompressionResistance:750>")
Run Code Online (Sandbox Code Playgroud)
我知道顶部和左右和底部约束不应该在这里记录,因为它们是超视图约束而不是按钮约束.但在这里我没有添加任何宽度和高度约束到我的按钮(即使在代码中).
为什么在控制台中记录约束高度和宽度?
一瞥这里...... /sf/answers/2431561611/
在iOS中,您在故事板中的Inspector中放置兄弟视图的顺序当然会成为他们的z顺序.
我很惊讶地发现这似乎不适用于容器视图的任何此类视图.
要测试,只需制作一个具有几个兄弟视图的场景; 其中几个是容器视图.跑.在容器视图控制器的类中更改无辜的东西(例如,添加ViewDidLoad,约束或print语句),然后重试.容器视图视图随机移动到顶部.
我发现唯一的解决方法是:在viewWillAppear中手动将它们按顺序放置,这是坚果.
1)可能是我刚搞砸了什么 - 也许有一个设置("尊重故事板顺序 - 即使是容器视图!")
2)我一直在试图弄清楚如何"自动化"变通方法修复.您需要在故事板中加载时阅读所有视图的顺序吗?然后在viewWillAppear时间"修复"它.棘手.
3)可能有一些技巧..在prepareForSegue说?..强迫他们处于正确的Z顺序,就像任何观点一样!??
我刚刚想到了一个荒谬的解决办法.
假设您有一段包含10个兄弟视图的故事板,并说其中4个是容器视图.(所以,它实际上不起作用 - 如此处所述.)
事实上,即使是那四个视图也只是(毫无意义的)普通UIView,它们是容器视图的持有者.吸!
我正在尝试布局一些自定义视图,当我尝试激活约束时,Xcode说我不能使用乘数.以下是代码示例:
class MenuView: UIView {
var addButton: AddButton!
var settingsButton: SettingsButton!
// ........
func setConstraints (withBarReference reference: NSLayoutYAxisAnchor) {
NSLayoutConstraints.activateConstraints([
// ........
addButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 0.5),
// ........
settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 1.5)
])
}
}
Run Code Online (Sandbox Code Playgroud)
这里的事情是Xcode在contraintEqualToAnchor:functions上给出语法错误,并说我应该将"multiplier"替换为"constant".
为什么我不能将乘数选项与X中心锚点一起使用?
我有一个父视图,其高度必须由其子内容决定.
如何在没有以编程方式改变它的情况下在故事板中实现这一点.
ios uistoryboard autolayout nslayoutconstraint ios-autolayout
我试图以不同的方式为纵向和横向方向布局用户界面.区别在于以下方面:
我有几个UIStackViews.它们的一些轴在横向上变为水平,在纵向模式下变为垂直,
UIStackView中的按钮顺序在两种模式下都可能不同,
需要删除添加到横向中的subview1的按钮并将其添加到横向的subview2中.在纵向模式下,subview1可能根本不存在,
两种模式中的Autolayout约束都不同.
我开始在XCode中使用各种特性,但它似乎有局限性.我在代码中手动切换约束观察特征集合变化(viewWillTransition:...)但它看起来很笨拙.有没有更好的方法或最好的方法是为这两种模式设置重复的控件组并隐藏横向/纵向模式中不需要的控件?
我正在使用modalPresentationStyle = .formSheet显示模式UIViewController,但是在iPhone XR和XS Max上存在一些问题。显示在缺口的后面。左侧iPhone XR,XS,X的图像波纹管
UIViewController使用自动布局,并且显示如下:
let contentViewController = UINib(nibName: "EditViewController", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! EditViewController
let navController = UINavigationController(rootViewController: contentViewController)
navController.modalPresentationStyle = UIModalPresentationStyle.formSheet
let popover = navController.presentationController!
popover.delegate = self
self.present(navController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
代表:
extension MyController: UIAdaptivePresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
}
Run Code Online (Sandbox Code Playgroud)
modalPresentationStyle = .pageSheet也存在相同的问题。它可以与其他modalPresentationStyles(即全屏)一起使用
在iOS 12.1和Swift 3上
任何想法如何解决这个问题?谢谢
ios-autolayout ×10
ios ×9
autolayout ×2
swift ×2
uistoryboard ×2
constraints ×1
uilabel ×1
uistackview ×1
uitableview ×1
xcode ×1