gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:53:27 26 4
gpt4 key购买 nike

快速解释。

我有一个 UIScrollView,它是“self.view”的 subview 。我的 UIScrollview 有一个名为 contentView

的 subview

我所有的其他对象都是 contentView 的 subview 或者它是 sub-views

除了 2 个 View 外,我的所有内容看起来都正确。

一旦我将这些 View 添加到我的约束中。整个 contentView 向左移动,破坏了一切。

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

为了让大家明白是 contentView 搞砸了,我给 contentView 设置了红色背景。

enter image description here

这是相同的 View ,但没有将 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))

下面的约束,是一个把一切都搞砸的约束。从那 1 行代码中删除 [howManyIconView(iconViewWidth)] 后,一切都很好。

howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:[howManyIconView(iconViewWidth)][howManyInputField(inputFieldWidth)]-32-|", options: nil, metrics: metricsDictionary, views: viewsDictionary))

我已经三重检查了 howManyContentView、howManyIconView 和 howManyIcon 没有在本文中未显示的任何代码中提及。

这是我尝试解决的问题

首先,我尝试制作另一个名为 HowManyInputView 的 View ,我将 iconViewUITextField 放入其中。然后将其作为唯一约束。 (同样的结果)

之后,我尝试删除所有与 iconView 中的 UILabel 有关的内容。看看它是否与标签有关。 (同样的结果)

然后我尝试制作一个新 View 。并给它类似(但不相同)的位置约束(同样的问题),这个 View 也没有任何 subview ,进一步表明它是 View 而不是 UILabel 导致我的问题。

所以我尝试将水平约束拆分为 2。如您在代码中所见,之前。我在同一行代码中给了它一个宽度和一个水平约束。所以我为它制作了 2 条不同的约束线,一条用于水平调整大小,一条用于定位。 (同样的结果)

此时我已经没有想法了。所以我删除了我的派生数据文件夹,并清理了我的项目。 (还是不行)

接下来,我尝试打印出有问题的 View 的约束。像这样使用 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 旁边?

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

任何帮助将不胜感激! (我的所有尝试都没有导致控制台出现任何错误。)

最佳答案

我看到了 2 个可能的错误:

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

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

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

关于ios - 水平约束在 UIScrollView 中无法正常工作。 (程序约束),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29120457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com