在UIView子类中更改NSLayoutConstraint

时间:2015-05-13 12:32:56

标签: ios objective-c nslayoutconstraint

我试图影响NSLayoutConstraint子类中的UIView。但是我把代码放在哪里似乎没有改变自动布局约束。
我以前曾多次使用NSLayoutConstraint但由于某种原因似乎无法在子类中引用它。

我的约束是

self.ripHeight.constant

通过

连接
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *ripHeight;

我已尝试使用initawakeFromNib方法,如下所示

- (id)init {
    self = [super init];
    if (self) {

        //self.ripHeight.constant = 100;

    }
    return self;
}

-(void)awakeFromNib {

    [super awakeFromNib];

    // 2 . Change Height of Ripll Container to suit device - bitch
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;

    //Create Nib Frame
    CGRect frameRect = self.frame;
    frameRect.size.width = screenWidth;
    frameRect.size.height = screenWidth * 1.3333;
    self.frame = frameRect;

    self.ripHeight.constant = 100;

}

我正在通过

加载视图
[self.ripContainer addSubview:customView];

2 个答案:

答案 0 :(得分:0)

更改约束后,尝试手动更新布局:

-(void)awakeFromNib {

    [super awakeFromNib];
    //...
    //your code for constraint

    [self.superview setNeedsLayout];
}

- setNeedsLayout

  

使接收器的当前布局无效并触发布局   在下一个更新周期中更新。

     

讨论

     

当你使用应用程序的主线程时调用此方法   想要调整视图子视图的布局。这种方法制作了一个   请注意并立即返回。因为这种方法可以   不强制立即更新,而是等待下一次更新   循环,您可以使用它来使多个视图的布局无效   在更新任何视图之前。这种行为允许你   将所有布局更新合并到一个更新周期,即   通常表现更好。

答案 1 :(得分:0)

解决此类问题的可能方法是使用awakeAfterUsingCoder
它可用作占位符视图。在此处加载视图而不是在ViewController中。还要在XIB中设置布局约束。

有关详细信息,请参阅this链接。