【问题标题】:Change relation of NSLayoutConstraint programmatically in iOS在 iOS 中以编程方式更改 NSLayoutConstraint 的关系
【发布时间】:2016-07-15 20:46:52
【问题描述】:

我在屏幕底部有一个UITextView
它有leading, trailing bottom space constraints to the superview
它也有height constraint with value (constant) 40

当我继续在其中输入更多文本时,我想让这个文本视图具有灵活的高度。 我可以通过将高度约束值更改为greater than or equal 来制作灵活的高度:

它工作正常,文本视图高度不断增加。

但是当我制作它时,情节提要显示此错误:

我想以编程方式使约束值大于或等于,而不是来自情节提要。

我知道NSLayoutConstraint 的一个属性叫做

public var relation: NSLayoutRelation { get }

但我们可以看到它是只读的。

如何将此关系更改为以下之一:

public enum NSLayoutRelation : Int {   
    case LessThanOrEqual
    case Equal
    case GreaterThanOrEqual
}

或者是否有任何解决方法可以在基于自动布局的故事板中显示灵活高度?


我知道制作约束的 IBOutlet 并更改它的常量值,但在我的情况下我不能这样做,它应该动态更改。

【问题讨论】:

标签: ios autolayout nslayoutconstraint


【解决方案1】:

相关:auto layout modify multiplier of constriaint programmatically

使用 ARC:

- (void)changeConstraintRelationToEqual:(NSLayoutConstraint * __strong *)constraint{
    NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:(*constraint).firstItem attribute:(*constraint).firstAttribute relatedBy:NSLayoutRelationEqual toItem:(*constraint).secondItem attribute:(*constraint).secondAttribute multiplier:(*constraint).multiplier constant:(*constraint).constant];
    [self.view removeConstraint:(*constraint)];
    [self.view addConstraint:newConstraint];
    *constraint = newConstraint;
}

【讨论】:

  • 如何通过约束?
【解决方案2】:

我过去解决了这个问题,方法是在界面构建器中将我需要在运行时设置的约束标记为“占位符 - 在构建时删除”,然后通过添加约束以编程方式提供基于动态值的约束代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多