在运行时更改元素左,顶,宽度和高度约束

时间:2013-08-14 22:29:39

标签: iphone ios objective-c constraints autolayout

出于我正在创建的框架的目的,我需要设置UIView对象的框架属性,但是当AutoLayout打开时我不能这样做。 我的想法是,我可以从UIView对象中删除所有布局约束,然后根据我希望它拥有的帧创建新的约束。

所以这就是我所拥有的,但它不会给我一个错误(下面)。

//Remove current constraints
[self.view removeConstraints:self.view.constraints];


//create x constraint based on new x value
NSLayoutConstraint *xConstraint =[NSLayoutConstraint
                                   constraintWithItem:self.view
                                   attribute:NSLayoutAttributeLeft
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:self.view.superview
                                   attribute:NSLayoutAttributeLeft
                                   multiplier:1.0
                                   constant:self.x];
// add new x constrain
[self.view.superview addConstraint:xConstraint];

//create y constraint based on new y value
NSLayoutConstraint *yConstraint =[NSLayoutConstraint
                                  constraintWithItem:self.view
                                  attribute:NSLayoutAttributeTop
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.view.superview
                                  attribute:NSLayoutAttributeTop
                                  multiplier:1.0
                                  constant:self.y];

[self.view.superview addConstraint:yConstraint];

//create width constraint based on new width value
NSLayoutConstraint *widthConstraint =[NSLayoutConstraint
                                  constraintWithItem:self.view
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:nil
                                  attribute:NSLayoutAttributeWidth
                                  multiplier:1.0
                                  constant:self.width];

[self.view.superview addConstraint:widthConstraint];

//create height constraint based on new height value
NSLayoutConstraint *heightConstraint =[NSLayoutConstraint
                                  constraintWithItem:self.view
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:nil
                                  attribute:NSLayoutAttributeHeight
                                  multiplier:1.0
                                  constant:self.height];

[self.view.superview addConstraint:heightConstraint];

这是在运行时发生的事情:

修改

[self.view addConstraint:heightConstraint];更改为[self.view.superview addConstraint:heightConstraint];个元素后,我会在控制台中收到以下消息

错误

以下列表中的至少一个约束可能是您不想要的约束。试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果你看到你不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)

(
    "<NSLayoutConstraint:0x91475c0 H:|-(1)-[UIButton:0x728ab00](LTR)   (Names: '|':UIScrollView:0x72845b0 )>",
    "<NSLayoutConstraint:0x729dad0 H:|-(25)-[UIImageView:0x7284920](LTR)   (Names: '|':UIScrollView:0x72845b0 )>",
    "<NSLayoutConstraint:0x72924d0 UIButton:0x728ab00.leading == UIImageView:0x7284920.leading>"
)

1 个答案:

答案 0 :(得分:0)

您的问题是您正在为self.view.superview添加一个对self.view的约束。这不起作用,这是你看到的原因&#34;约束是否引用了视图子树之外的东西?这是非法的。&#34;

你到底想要做什么?必须有另一种方法来解决这个问题。您可以将限制添加到超级视图中,但我并不完全确定您的情况。