【问题标题】:UIView and intrinsicContentSizeUIView 和内在内容大小
【发布时间】:2013-01-25 18:33:32
【问题描述】:

UIView 是否创建intrinsicContentSize

我创建了一个 UIView 内容视图。我不给它限制大小:

UIView *contentView = [UIView new];
[contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
contentView.backgroundColor = [UIColor orangeColor];

我创建另一个 UIView subview01。我给它约束大小并将其添加到我的 contentView:

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[imageView setTranslatesAutoresizingMaskIntoConstraints:NO];
imageView.userInteractionEnabled = TRUE;
imageView.backgroundColor = [UIColor clearColor];

[imageView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[imageView(WIDTH)]"
                                                                  options:0
                                                                  metrics:@{@"WIDTH" : [NSNumber numberWithFloat:imageSize.width]}
                                                                    views:NSDictionaryOfVariableBindings(imageView)]];

[imageView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[imageView(HEIGHT)]"
                                                                  options:0
                                                                  metrics:@{@"HEIGHT" : [NSNumber numberWithFloat:imageSize.height]}
                                                                    views:NSDictionaryOfVariableBindings(imageView)]];


[contentView addSubview:imageView];

contentView 不会增加任何大小。我认为intrinsicContentSize 应该计算显示所有子视图所需的大小并调整自身大小?就像 UILabel 将如何调整大小以显示其所有文本?

【问题讨论】:

    标签: ios objective-c autolayout nslayoutconstraint


    【解决方案1】:

    不,UIView 没有intrinsicContentSize。按钮和标签可以,因为系统很容易根据其中的字符串和/或图像计算该大小。对于一个 UIView,你通常需要 4 个约束来完整描述它的位置和大小。

    【讨论】:

    • 或者你可以继承UIView并覆盖intrinsicContentSize方法。
    • 但 intrinsicContentSize 是一个 UIView 方法,您可以重写
    • 这是不正确的。在某些情况下,您可能需要覆盖 UIView 的 intrinsicContentSize。例如,如果一个视图包含一个文本视图,您必须通过覆盖该方法来告诉视图的大小。
    • 这不再准确。 iOS 14 + Swift 5 上的可视化调试器清楚地显示了一个 UIImageView,它试图根据它所显示的图像的内容大小来设置它的高度和宽度。
    【解决方案2】:

    虽然不是一个完美的解决方案,但我确实找到了一种模仿 intrinsicContentSize 的方法。

    我将容器视图的NSLayoutAttributeRight 设置为最右边的子视图的NSLayoutAttributeRight,并将NSLayoutAttributeBottom 设置为最下面的子视图的NSLayoutAttributeBottom

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                              attribute:NSLayoutAttributeRight
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:rightSubView
                                                              attribute:NSLayoutAttributeRight
                                                             multiplier:1 constant:0]];
    
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                              attribute:NSLayoutAttributeBottom
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:bottumSubView
                                                              attribute:NSLayoutAttributeBottom
                                                             multiplier:1 constant:0]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多