在运行时更改AutoLayout约束

时间:2015-08-16 03:09:07

标签: ios objective-c autolayout nslayoutconstraint

如何在运行时更改AutoLayout约束。

我需要在运行时更改视图的坐标,所以我做了以下操作:

 if ([OfferText length] != 0) {
            cell.topContentView.translatesAutoresizingMaskIntoConstraints = YES;
            CGRect newFrame = CGRectMake( 71, 4, [Util window_width]-71,50);
            cell.topContentView.frame = newFrame;
        }

在这样做时,我得到以下警告。是否可以在运行时更改自动布局约束。

(1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fca729606a0 UIView:0x7fca7296c6e0.top == UITableViewCellContentView:0x7fca729712b0.topMargin + 2>",
    "<NSAutoresizingMaskLayoutConstraint:0x7fca7286f620 h=--& v=--& UIView:0x7fca7296c6e0.midY == + 29>",
    "<NSAutoresizingMaskLayoutConstraint:0x7fca7286f670 h=--& v=--& V:[UIView:0x7fca7296c6e0(50)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x7fca705c9770 h=--& v=--& 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UITableViewCellContentView:0x7fca729712b0]   (Names: '|':CollectionBrandCell:0x7fca72968820 )>"
)

我使用以下代码找到我的解决方案:

tableviewcell的

in .h 在我的情况下

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *constraintsTopContentView;

在.m

if ([OfferText length] != 0) {
            cell.constraintsTopContentView.constant=-4;
        }

2 个答案:

答案 0 :(得分:3)

如果要从Storyboard设置约束,请设置更改视图坐标所需约束的出口。 例如: 如果要更改某些视图XYZ的顶部空间,请执行以下操作:

  1. 选择该视图的顶部约束并在.h文件中输出。这将 看起来像这样。

    @property(强,非原子)NSLayoutConstraint * XYZ'stopConstraint;

  2. 现在,当您需要以下时,请将此约束更改为常量 代码。

    self.XYZ'stopConstraints.constant = youValue;

  3. 另外,请根据我的观点从代码中删除此行。

     cell.topContentView.translatesAutoresizingMaskIntoConstraints = YES;
    

答案 1 :(得分:0)

为要更改的约束创建出口(类似于UI控件);然后更改它们的constant属性。 您的警告是因为您使用cell.topContentView.translatesAutoresizingMaskIntoConstraints = YES;而引起的。这将创建一些新的约束(NSAutoresizingMaskLayoutConstraint)并导致与旧的冲突。