iOS – 更改子类UIView子视图的框架(使用启用了自动布局的故事板)

我正在构build一个自定义的进度条(UIView的子类)。 我将UIImageView添加到使用重复图像显示进度的UIView。 该视图被添加到故事板,我可以得到它显示得很好,但是,如果我试图改变框架,那么它只显示任何故事板文件中显示(即如果故事板视图有一个黄色的背景,但代码的uiview子类将其更改为绿色,如果我尝试更改代码中的UIImageView的框架以反映当前进度,则默认返回到黄色背景)

我试图用这些没有运气:

[self updateConstraints]; [self layoutSubviews]; 

UPDATE

我知道我需要设置一个约束用于自动布局。 但是,它需要以编程方式完成,因为我以这种方式创build了子类UIView。 这里是我正在尝试的代码,我知道我很接近,但不能完全得到它的工作:

 [self addConstraint: [NSLayoutConstraint constraintWithItem:self.progressView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1 constant:progressWidth]]; [UIView animateWithDuration:3 animations:^{ [self.progressView layoutIfNeeded]; }]; 

使用自动布局时,不应该触摸框架。 使用这样的布局系统的关键在于,框架是根据附加的可满足的约束来推断的。

在不了解更多细节的情况下,解决这个问题的方法就是从故事板创buildNSLayoutConstraintsockets。 例如,你可能在进度视图上有一个宽度约束 – 创build一个宽度约束的NSLayoutConstraint出口将允许你更新constant ,这反过来将调整框架。

animation示例:

 self.widthConstraint.constant = 300; [UIView animateWithDuration:0.4 animations:^{ [self.view layoutIfNeeded]; }]; 

2013年5月15日更新

下面是一个使用约束的可视化格式以编程方式创build约束的例子(更易于使用)

 UIView *w_progressView = self.progressView NSArray *wc = [NSLayoutConstraint constraintsWithVisualFormat:@"[w_progressView(200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(w_progressView)]; 

(抱歉的格式,它是一个很长的方法…)

然后添加返回到父视图的约束的NSArray

 [self addConstraints:wc]; 

符号progressView(200)在视图progressView上放置一个200点的宽度

使用自动布局时,不要更改或设置框架,而是更改约束。 在WWDC 2012上展示了3个自动布局video。如果您想了解如何使用自动布局,请检查一下。

如果你想改变任何视图的框架使用自动布局,你应该先写…

 [view setTranslatesAutoresizingMaskIntoConstraints:YES]; 

接着

 [view setFrame:...];