【问题标题】:Checking whether a NSLayoutConstraint has been applied or not检查是否应用了 NSLayoutConstraint
【发布时间】:2014-05-28 08:02:15
【问题描述】:

我有一个 UITextView 子类,它的高度约束优先级为 500。它插入的视图中的所有其他约束都具有 1000 优先级,因此当不能满足约束时,这个约束就会被丢弃。

我希望能够验证它是否被删除,以便在这种情况下启用滚动。

我尝试过这样验证:

- (void)updateConstraints
{
CGSize size = [self sizeThatFits:CGSizeMake(self.bounds.size.width, FLT_MAX)];

if (!heightConstraint) {
    heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:size.height];
    heightConstraint.priority=500;
    [self addConstraint:heightConstraint];
}
else heightConstraint.constant=size.height;
[super updateConstraints];

if (self.bounds.size.height!=heightConstraint.constant) {
    self.scrollEnabled=YES;
}





}

谢谢。

【问题讨论】:

    标签: ios uitextview autolayout


    【解决方案1】:

    这是我考虑布局调用/回调顺序的方式:

    • [self.view layoutIfNeeded]
    • [self.view setNeedsUpdateConstraints] updateConstraints
    • [self.view setNeedsLayout]
    • [self.view setNeedsDisplay]

    听起来你想在你的视图上实现- (void)updateConstraints,并在那里添加你的日志和调试。请务必致电[super updateConstraints],否则您将度过难关。到该方法退出时,您的约束已计算完毕。

    【讨论】:

    • 已经尝试过该选项...相同的行为。在调用 [super updateConstraints] 视图边界后尚未重新计算...
    • 肯定是计算约束。确保您正在检查应用了约束的正确 UIView(例如,您认为它是 v. 实际得到它们的父级)。
    • 我用我的 updateConstraints 实现更新了这个问题......每次函数执行时最后一个 if 都是真的。我很确定界限是事后计算出来的……这是我的第一种方法……
    • 考虑 NSLog'ng 或 break-point'ng self.bounds.size[self constraints] 的值。您应该在那里看到约束。如果在对 [super updateConstraints] 的调用返回后未添加或更改,则不会(在此传递中)。
    • 哦,最后:如果您需要创建计算的、相对的约束(例如 1/2 帧大小或其他东西)或者您需要基于计算的分支行为,调用 [fooView layoutIfNeeded] 是一个好习惯尺寸。诚然,在大多数情况下,在 super 调用后进行检查 应该 具有相同的结果。我会考虑在修改heightConstraint 之后调用[self layoutIfNeeded],检查大小以获得滚动行为,最后调用super 的方法。过于频繁地调用layoutIfNeeded 是不可取的,但在这种特定情况下通常是必要的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2011-10-14
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多