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

时间:2013-05-13 05:53:30

标签: ios uiview storyboard frame subview

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

我尝试使用这些没有运气:

[self updateConstraints];
[self layoutSubviews];

更新

我知道我需要设置一个约束以用于autolayout。但是,它需要以编程方式完成,因为我正在以这种方式创建子类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];
}];

3 个答案:

答案 0 :(得分:7)

使用自动布局时,永远不会触摸框架。使用这样的布局系统的全部意义在于,帧是基于附加到它们的可满足约束来推断的。

在不知道更多细节的情况下,解决这个问题的方法是从故事板创建NSLayoutConstraint出口到相关视图。例如,您可能在进度视图上有宽度约束 - 为宽度约束创建NSLayoutConstraint出口将允许您更新constant,而self.widthConstraint.constant = 300; [UIView animateWithDuration:0.4 animations:^{ [self.view layoutIfNeeded]; }]; 将调整框架。

动画示例:

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

2013年5月15日更新

以下是使用约束的可视化格式(更易于使用)以编程方式创建约束的示例

[self addConstraints:wc];

(抱歉格式化,这是一个很长的方法......)

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

progressView(200)

符号{{1}}在视图 progressView 上放置200点宽度

答案 1 :(得分:1)

如果要更改任何视图的帧,请使用自动布局,首先应该写...

[view setTranslatesAutoresizingMaskIntoConstraints:YES];

然后

[view setFrame:...];

答案 2 :(得分:0)

使用自动布局时,不更改或设置框架,更改约束。在WWDC 2012上有3个关于自动布局的视频。如果你想学习如何使用自动布局,你应该检查一下。