水平约束在UIScrollView中无法正常工作。 (程序设计约束)

时间:2015-03-18 11:09:27

标签: ios swift uiscrollview constraints

快速解释。

我有UIScrollView,这是“self.view”的子视图。 我的UIScrollview有一个名为contentView

的子视图

我的所有其他对象都是contentViewsub-views

的子视图

除了2个视图外,我看起来一切正常。

在我的约束中添加这些视图后。整个contentView向左移动,并打破一切。

这是一个带有麻烦视图的屏幕图像(howManyIconView),它是蓝色UIView,中间有一个白色松弛图标。 (左下)

为了让每个人都明白contentView被搞砸了,我给了contentView一个红色背景。

enter image description here

这是相同的视图,没有将howManyIconView添加到我的约束中。

enter image description here

到与问题相关的实际代码,从顶部开始。

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的视图,其中我将iconViewUITextField放入其中。然后将其作为唯一约束。 (结果相同)

之后我尝试删除与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旁边?

为什么这种情况仍然是个谜,据我所知,我的水平定位约束应该没问题。没有任何错误。但希望提供我的问题的原因,将有助于解决它。

任何帮助将不胜感激! (我没有尝试在控制台中造成任何错误。)

1 个答案:

答案 0 :(得分:2)

我看到有两种可能的错误:

  1. 我没有看到左右contentView的约束。我相信它们都应该为零。否则contentView的位置在scrollView中将是随机的。这应该通过将H:[contentView(contentWidth)]替换为H:|[contentView(contentWidth)]|

  2. 来解决
  3. self.view.bounds.width用于contentView宽度可能会有点冒险 - 具体取决于您调用它的方法。你确定它等于屏幕的大小吗?

  4. 请注意,通常在Interface Builder中设置约束更容易,因为它总是警告您缺少约束。