【问题标题】:How to change Anchor-Style Constraint programmatically?如何以编程方式更改锚样式约束?
【发布时间】:2016-06-15 23:37:36
【问题描述】:

我进行了搜索,甚至想出了潜在的解决方案。可悲的是,他们都没有说话。我试图通过增加它的leadingAnchor-Constraint 来为视图的x-Position 设置动画。

我这样创建我的约束:

let margins = self.layoutMarginsGuide
    horizontalConstraint = underline.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)

并像这样编辑约束常量:

func updateUnderlinePosition(offset:CGFloat, pageCount:Int) {

    //Underline just over width of one Screen:
    var underlineOffset = offset / CGFloat(pageCount)

    //Add left margin:
    let margins = self.layoutMarginsGuide
    underlineOffset += 15

    //reposition underlineview
    horizontalConstraint.constant += underlineOffset
    self.layoutIfNeeded()
}

为什么我会收到错误消息,告诉我存在冲突的约束?

"<NSLayoutConstraint:0x7fca2b8c72c0 UIView:0x7fca29d1c830.leading == UILayoutGuide:0x7fca2b8c4970'UIViewLayoutMarginsGuide'.leading>",
"<NSLayoutConstraint:0x7fca29c2ccd0 UIView:0x7fca29d1c830.leading == UILayoutGuide:0x7fca2b8c4970'UIViewLayoutMarginsGuide'.leading + 16.25>"

编辑:

约束是这样创建的:

override func layoutSubviews() {
    super.layoutSubviews()

    //underline.frame = CGRectMake(15, self.frame.height-10, 40, 2)
    underline.translatesAutoresizingMaskIntoConstraints = false
    underline.backgroundColor = UIColor.whiteColor()
    underline.layer.cornerRadius = 1.0
    self.addSubview(underline)
    print(self.backItem)
    let margins = self.layoutMarginsGuide
    horizontalConstraint = underline.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)
    let verticalConstraint = underline.centerYAnchor.constraintEqualToAnchor(margins.bottomAnchor)
    let widthConstraint = underline.widthAnchor.constraintEqualToAnchor(nil, constant: 40)
    let heightConstraint = underline.heightAnchor.constraintEqualToAnchor(nil, constant: 2)
    NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}

【问题讨论】:

  • 看起来你正确地修改了约束,但是有第二个约束与之冲突。在调用updateUnderlinePosition 之前,您应该检查为此视图定义了哪些约束,我怀疑您会看到多个主要约束。就您如何最终获得两个主要约束而言,如果不了解它们是如何创建/激活的,就很难说。在创建 horizontalConstraint 并激活它之前,您可能已经有了前导约束。
  • 添加了创建约束的方法。 Horizo​​ntalConstraint 是一个全局变量,以后可以访问它。

标签: ios xcode swift constraints


【解决方案1】:

检查 layoutSubviews 是否被调用了两次

【讨论】:

  • 就是这样!谢谢!
【解决方案2】:

问题是您在layoutSubviews 中添加了可以多次调用的约束。您正在实例化 underline 一次,但可以多次调用 layoutSubviews,引用 underline 的同一实例,在此过程中失去对原始 horizontalConstraint 的引用。

坦率地说,添加子视图和约束并不真正属于layoutSubviews。您应该在实例化underline 视图的位置设置约束,您可以在适当的视图init 方法或awakeFromNIB 中执行此操作。这取决于视图是如何实例化的。

【讨论】:

  • 我在 UINavigationBar 的子类中创建我的视图。您建议在哪里设置视图?
  • 可能在您实例化underline 的任何地方,可能是init 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多