【问题标题】:iOS - Changing frame of a subview of a subclassed UIView (using storyboard with auto layout enabled)iOS - 更改子类 UIView 的子视图的框架(使用启用自动布局的情节提要)
【发布时间】:2013-05-07 02:34:09
【问题描述】:

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

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

[self updateConstraints];
[self layoutSubviews];

更新

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

【问题讨论】:

标签: ios uiview storyboard frame subview


【解决方案1】:

使用自动布局时,如果您想更改任何视图的框架,您应该首先编写...

[view setTranslatesAutoresizingMaskIntoConstraints:YES];

然后

[view setFrame:...];

【讨论】:

    【解决方案2】:

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

    在不了解更多细节的情况下,解决此问题的方法是创建从情节提要到相关视图的 NSLayoutConstraint 出口。例如,您可能对进度视图有一个宽度约束 - 为宽度约束创建一个 NSLayoutConstraint 出口将允许您更新 constant,这反过来又会调整框架。

    动画示例:

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

    2013 年 5 月 15 日更新

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

    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) 表示法在视图上放置了 200 磅的宽度progressView

    【讨论】:

    • 好吧,虽然我使用的是故事板,但我正在创建的视图在程序上是作为子类 UIView 的(用于整个应用程序)。那么如何以编程方式设置约束以仅设置显式宽度?使用我正在尝试的代码查看更新的原始帖子。
    • @JamesHicman,更新了答案以显示使用视觉格式进行约束的示例。
    • 哦,抱歉,我没有看到您将 progressView 作为属性。您需要创建一个新的弱指针以在 NSDictionaryOfVariableBindings 中使用。再次更新答案。
    【解决方案3】:

    使用自动布局时,您无需更改或设置框架,而是更改约束。 WWDC 2012 上展示了 3 个有关自动布局的视频。如果您想了解如何使用自动布局,请查看它们。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      相关资源
      最近更新 更多