如何确定 NSLayoutConstraint 方向?

Posted

技术标签:

【中文标题】如何确定 NSLayoutConstraint 方向?【英文标题】:How to determine NSLayoutConstraint orientation? 【发布时间】:2013-12-09 16:55:15 【问题描述】:

我想在 ios7 中在运行时修改一些自动布局约束,因为必须删除一个视图,并且其一侧的按钮必须放大自身以填充消失的视图的空白。

为此,我希望删除附加到按钮的所有水平约束,并添加新的约束...不幸的是,即使我找到了UILayoutConstraintAxis 类型,我仍然没有找到如何知道给定NSLayoutConstraint 的方向。

【问题讨论】:

【参考方案1】:

垂直约束附加到按钮的超级视图。视图树的上层也可能存在更多约束,但我们假设没有示例目的。

//Assuming your UIButton variable is named 'button'
UIView * superview = [button superview];
NSArray * verticalConstraints = [superview constraintsAffectingLayoutForAxis: UILayoutConstraintAxisVertical];

NSArray * constraintsAffectingButton = @[];
for (NSLayoutConstraint * constraint in verticalConstraints)

    if (constraint.firstItem == button || constraint.secondItem == button)
    
        constraintsAffectingButton = [constraintsAffectingButton arrayByAddingObject:constraint];
    

[superview removeConstraints:constraintsAffectingButton]

您还可以将类别方法添加到NSLayoutConstraint 以确定约束是否是垂直的。您无法在不在同一轴上的两个属性之间创建约束而不生成运行时异常,因此您只需检查 NSLayoutConstraint 的属性之一即可确定轴。

- (BOOL)isVerticalConstraint

    switch (self.firstAttribute)
    
        case NSLayoutAttributeBaseline:
        case NSLayoutAttributeCenterY:
        case NSLayoutAttributeTop:
        case NSLayoutAttributeBottom:
        case NSLayoutAttributeHeight:
            return YES;
            break;
        default:
            break;
    

    return NO;

【讨论】:

感谢您的回答。事实上它没有用,但它通过发现constraintsAffectingLayoutForAxis 帮助了我很多,所以我发现了我的水平约束:[self.myButton constraintsAffectingLayoutForAxis:UILayoutConstraintAxisHorizontal] 不幸的是,constraintsAffectingLayoutForAxis 只能用于调试......所以问题仍然存在...... 添加类别方法实现回答。 确实,一看就明白!

以上是关于如何确定 NSLayoutConstraint 方向?的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 并确定哪个子视图更宽

使用 NSLayoutConstraint 在主视图中定位两个 UIButton 元素

如何检查 NSLayoutConstraint 是不是动画

如何创建返回 NSLayoutConstraint 的函数

滚动 UITableView 时如何创建 NSLayoutConstraint

如何在 Swift 中为 NSLayoutConstraint 设置动画?