ios – 水平约束在UIScrollView中无法正常工作. (程序约束)

前端之家收集整理的这篇文章主要介绍了ios – 水平约束在UIScrollView中无法正常工作. (程序约束)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
快速解释.

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

我的所有其他对象都是contentView或它的子视图的子视图

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

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

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

为了让每个人都明白这是内容视图搞砸了,我给了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)]",views: viewsDictionary))
        howManyContentView.addConstraints(
            NSLayoutConstraint.constraintsWithVisualFormat(
                "V:[howManyInputField(inputFieldHeight)]",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,multiplier:1.0,constant:0))
        howManyContentView.addConstraint(NSLayoutConstraint(item:howManyInputField,constant:0))
        howManyContentView.addConstraint(NSLayoutConstraint(item:howManyIconView,constant:0))
        howManyIconView.addConstraint(NSLayoutConstraint(item:howManyIcon,toItem:howManyIconView,attribute:NSLayoutAttribute.CenterX,constant:0))


        howManyContentView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
        "H:|-32-[howManyLabel]",views: viewsDictionary))

下面的约束,是一个混乱一切.一旦我从这一行代码删除[howManyIconView(iconViewWidth)],一切都很好.

howManyContentView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
        "H:[howManyIconView(iconViewWidth)][howManyInputField(inputFieldWidth)]-32-|",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旁边?

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

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

解决方法

我看到有两个可能的错误

>我没有看到对于contentView左右的约束.我相信它们都应该为零.否则,contentView的位置将在scrollView中随机.这应该通过用H代替H:[contentView(contentWidth)]来修复:| [contentView(contentWidth)] |
>对contentView宽度使用self.view.bounds.width可能有点冒险 – 取决于您调用它的方法.你确定它与屏幕的大小相等吗?

请注意,通常在Interface Builder中设置约束更容易,因为它始终会警告您缺少约束.

原文链接:https://www.f2er.com/iOS/333292.html

猜你在找的iOS相关文章