Mar*_*k L 8 constraints uiscrollview ios swift
快速解释.
我有一个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)
Run Code Online (Sandbox Code Playgroud)
这是限制因素:
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))
Run Code Online (Sandbox Code Playgroud)
下面的约束,是一切混乱.一旦我[howManyIconView(iconViewWidth)]从那一行代码中删除,一切都很好.
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:[howManyIconView(iconViewWidth)][howManyInputField(inputFieldWidth)]-32-|", options: nil, metrics: metricsDictionary, views: viewsDictionary))
Run Code Online (Sandbox Code Playgroud)
我已经三次检查了howManyContentView,howManyIconView和howManyIcon在这篇文章中未显示的任何代码中都没有提到.
这是我试图解决我的问题
首先,我试图使被称为另一种观点认为HowManyInputView,在这里我把iconView和UITextField.然后将作为唯一的约束.(结果相同)
之后我尝试删除与UILabeliconView内部有关的所有内容.看看它是否与标签有关.(同样的结果)
然后我尝试制作一个新视图.并给它类似(但不一样)的位置约束(同样的问题),这个视图也没有任何子视图,进一步表明它是视图而不是UILabel导致我的问题.
所以我尝试在2中分割我的水平约束.之前你可以在代码中看到.我在同一行代码中给它一个宽度和一个水平约束.所以我为它制作了两条不同的约束线,一条用于水平尺寸,一条用于定位.(同样的结果)
在这一点上,我没有想法.所以我删除了Derived Data文件夹,并清理了我的项目.(还是行不通)
接下来,我尝试打印有问题的视图的约束.constraintsAffectingLayoutForAxis像这样使用:
println("Horizontal: \(howManyIconView.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal))")
println("Vertical: \(howManyIconView.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Vertical))")
Run Code Online (Sandbox Code Playgroud)
这就是控制台打印出来的:
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 )>]
Run Code Online (Sandbox Code Playgroud)
除非我读错了.看起来iconView只获得(50)的大小限制,而不是实际的位置水平约束.尽管被正确地放在我旁边UITextField?
为什么会发生这种情况仍然是一个谜,据我所知,我的水平定位约束应该没问题.没有任何错误.但希望提供我的问题的原因,将有助于解决它.
任何帮助将不胜感激!(我没有尝试在控制台中造成任何错误.)
我发现有两个可能的错误:
我没有看到左和右的限制contentView。我相信它们都应该为零。否则滚动视图中的位置contentView将是随机的。这应该通过替换来H:[contentView(contentWidth)]解决H:|[contentView(contentWidth)]|
使用self.view.bounds.widthfor contentViewwidth 可能有点冒险 - 取决于您调用它的方法。你确定它和屏幕大小相等吗?
请注意,一般来说,在 Interface Builder 中设置约束更容易,因为它总是警告您缺少约束。
| 归档时间: |
|
| 查看次数: |
656 次 |
| 最近记录: |