快速解释。
我有UIScrollView
,这是“self.view”的子视图。
我的UIScrollview
有一个名为contentView
我的所有其他对象都是contentView
或sub-views
除了2个视图外,我看起来一切正常。
在我的约束中添加这些视图后。整个contentView
向左移动,并打破一切。
这是一个带有麻烦视图的屏幕图像(howManyIconView),它是蓝色UIView
,中间有一个白色松弛图标。 (左下)
为了让每个人都明白contentView
被搞砸了,我给了contentView
一个红色背景。
这是相同的视图,没有将howManyIconView
添加到我的约束中。
到与问题相关的实际代码,从顶部开始。
contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
scrollView.addSubview(contentView)
howManyContentView.setTranslatesAutoresizingMaskIntoConstraints(false)
contentView.addSubview(howManyContentView)
howManyIconView.setTranslatesAutoresizingMaskIntoConstraints(false)
howManyIconView.backgroundColor = UIColor.formulaBlueColor()
howManyContentView.addSubview(howManyIconView)
howManyIcon.setTranslatesAutoresizingMaskIntoConstraints(false)
howManyIcon.textColor = UIColor.formulaWhiteColor()
howManyIcon.font = UIFont(name: "fontAwesome", size: 20)
howManyIcon.text = ""
howManyIconView.addSubview(howManyIcon)
这是限制因素:
var viewsDictionary = ["contentView":contentView,"howManyContentView":howManyContentView,
"howManyLabel":howManyLabel,
"howManyInputField":howManyInputField,
"howManyIconView":howManyIconView,
"howManyIcon":howManyIcon]
let metricsDictionary = ["topBarHeight":6,"numbersViewRowHeight":49,"numbersViewSeperatorHeight":1,"inputFieldHeight":75,"contentWidth":self.view.bounds.width,"grapViewHeight":175,"inputFieldWidth":100,"iconViewWidth":50]
scrollView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:[contentView(contentWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary))
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"V:[howManyIconView(inputFieldHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary))
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"V:[howManyInputField(inputFieldHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary))
contentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:|[howManyContentView]|", options: nil, metrics: nil, views: viewsDictionary))
howManyContentView.addConstraint(NSLayoutConstraint(item:howManyLabel, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyContentView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyContentView.addConstraint(NSLayoutConstraint(item:howManyInputField, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyContentView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyContentView.addConstraint(NSLayoutConstraint(item:howManyIconView, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyContentView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyIconView.addConstraint(NSLayoutConstraint(item:howManyIcon, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyIconView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyIconView.addConstraint(NSLayoutConstraint(item:howManyIcon, attribute:NSLayoutAttribute.CenterX, relatedBy:NSLayoutRelation.Equal, toItem:howManyIconView, attribute:NSLayoutAttribute.CenterX, multiplier:1.0, constant:0))
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-32-[howManyLabel]", options: nil, metrics: metricsDictionary, views: viewsDictionary))
以下约束,是将一切搞砸的事情。一旦我从那一行代码中删除[howManyIconView(iconViewWidth)]
,一切都很好。
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:[howManyIconView(iconViewWidth)][howManyInputField(inputFieldWidth)]-32-|", options: nil, metrics: metricsDictionary, views: viewsDictionary))
我已经三次检查了本帖子中未显示的任何代码中未提及howManyContentView,howManyIconView和howManyIcon。
这是我试图解决我的问题
首先,我尝试制作另一个名为HowManyInputView
的视图,其中我将iconView
和UITextField
放入其中。然后将其作为唯一约束。 (结果相同)
之后我尝试删除与iconView中的UILabel
有关的所有内容。看看它是否与标签有关。 (结果相同)
然后我尝试制作一个新视图。并且给了它相似(但不一样)的位置约束(同样的问题),这个视图也没有任何子视图,进一步显示它是视图而不是导致我的问题的UILabel
。
所以我尝试在2中分割我的水平约束。之前你可以在代码中看到。我在同一行代码中给它一个宽度和一个水平约束。所以我为它制作了两条不同的约束线,一条用于水平尺寸,一条用于定位。 (同样的结果)
此时我已经没想完了。所以我删除了Derived Data文件夹,并清理了我的项目。 (仍然没有工作)
接下来,我尝试打印有问题视图的约束。像这样使用constraintsAffectingLayoutForAxis
:
println("Horizontal: \(howManyIconView.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal))")
println("Vertical: \(howManyIconView.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Vertical))")
这就是控制台打印出的内容:
Horizontal: [<NSLayoutConstraint:0x174299050 H:[UIView:0x17019df60(50)]>]
Vertical: [<NSLayoutConstraint:0x17429aae0 V:|-(0)-[UIView:0x17019df60] (Names: '|':UIView:0x17019ddc0 )>, <NSLayoutConstraint:0x17429ab30 V:[UIView:0x17019df60]-(0)-| (Names: '|':UIView:0x17019ddc0 )>]
除非我读错了。看起来iconView只获得(50)的大小限制,而不是实际的位置水平约束。尽管被正确放在UITextField
旁边?
为什么这种情况仍然是个谜,据我所知,我的水平定位约束应该没问题。没有任何错误。但希望提供我的问题的原因,将有助于解决它。
任何帮助将不胜感激! (我没有尝试在控制台中造成任何错误。)
答案 0 :(得分:2)
我看到有两种可能的错误:
我没有看到左右contentView
的约束。我相信它们都应该为零。否则contentView
的位置在scrollView中将是随机的。这应该通过将H:[contentView(contentWidth)]
替换为H:|[contentView(contentWidth)]|
将self.view.bounds.width
用于contentView
宽度可能会有点冒险 - 具体取决于您调用它的方法。你确定它等于屏幕的大小吗?
请注意,通常在Interface Builder中设置约束更容易,因为它总是警告您缺少约束。