如何调整超级视图的大小以适合具有自动布局的所有子视图?

达克

我对自动布局的理解是,它采用了超级视图的大小,并基于约束和内在大小来计算子视图的位置。

有没有办法扭转这个过程?我想基于约束和内在大小调整Superview的大小。最简单的方法是什么?

我在Xcode中设计了视图,并将其用作的标题UITableView该视图包括标签和按钮。标签的大小取决于数据。根据约束,标签可以成功按下按钮,或者如果按钮和超级视图底部之间存在约束,则标签将被压缩。

我发现了一些类似的问题,但没有好的和简单的答案。

汤姆·斯威夫特

正确使用的APIUIView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize传递UILayoutFittingExpandedSize

对于正常UIView使用自动布局的方法,只要您的约束正确,它就应该起作用。如果要在上使用它UITableViewCell(例如确定行高),则应在单元格上调用它contentView并抓住它的高度。

如果您的视图中有一个或多个多行UILabel,则需要进一步考虑。对于这些,preferredMaxLayoutWidth必须正确设置属性,以使标签提供正确的intrinsicContentSize,这将在systemLayoutSizeFittingSize's计算中使用。

编辑:根据要求,为表格视图单元格添加高度计算的示例

使用自动布局进行表格单元格高度计算虽然效率不高,但它确实很方便,特别是如果您的单元格具有复杂的布局。

如上所述,如果您使用多行,UILabel则必须将同步preferredMaxLayoutWidth到标签宽度。我使用自定义UILabel子类执行此操作:

@implementation TSLabel

- (void) layoutSubviews
{
    [super layoutSubviews];

    if ( self.numberOfLines == 0 )
    {
        if ( self.preferredMaxLayoutWidth != self.frame.size.width )
        {
            self.preferredMaxLayoutWidth = self.frame.size.width;
            [self setNeedsUpdateConstraints];
        }
    }
}

- (CGSize) intrinsicContentSize
{
    CGSize s = [super intrinsicContentSize];

    if ( self.numberOfLines == 0 )
    {
        // found out that sometimes intrinsicContentSize is 1pt too short!
        s.height += 1;
    }

    return s;
}

@end

这是一个人为设计的UITableViewController子类,展示了heightForRowAtIndexPath:

#import "TSTableViewController.h"
#import "TSTableViewCell.h"

@implementation TSTableViewController

- (NSString*) cellText
{
    return @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}

#pragma mark - Table view data source

- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
    return 1;
}

- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger) section
{
    return 1;
}

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
    static TSTableViewCell *sizingCell;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        sizingCell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell"];
    });

    // configure the cell
    sizingCell.text = self.cellText;

    // force layout
    [sizingCell setNeedsLayout];
    [sizingCell layoutIfNeeded];

    // get the fitting size
    CGSize s = [sizingCell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
    NSLog( @"fittingSize: %@", NSStringFromCGSize( s ));

    return s.height;
}

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    TSTableViewCell *cell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell" ];

    cell.text = self.cellText;

    return cell;
}

@end

一个简单的自定义单元格:

#import "TSTableViewCell.h"
#import "TSLabel.h"

@implementation TSTableViewCell
{
    IBOutlet TSLabel* _label;
}

- (void) setText: (NSString *) text
{
    _label.text = text;
}

@end

而且,这是情节提要中定义的约束的图片。请注意,标签上没有高度/宽度限制-从标签的推断出这些限制intrinsicContentSize

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

使用自动布局动态更改子视图后调整视图的大小

来自分类Dev

UIView:自动调整除一个子视图以外的所有子视图的大小-iOS

来自分类Dev

子视图可以通过自动布局自动调整其父视图的大小吗?

来自分类Dev

具有自动布局的NSCollectionView自动调整大小子视图

来自分类Dev

使用自动布局调整超级视图和所有超级视图的同级大小

来自分类Dev

可可自动布局和子视图的大小

来自分类Dev

具有自动布局的NSSplitView,防止按比例调整大小

来自分类Dev

使用自动布局弹出键盘时如何调整视图大小

来自分类Dev

如何在XIB中基于子视图的大小调整超级视图的高度?

来自分类Dev

调整超级视图的大小,同时使用自动布局动态添加子视图

来自分类Dev

如何从我的超级视图中的所有子视图中删除约束?

来自分类Dev

自动布局-如何添加子视图以匹配UIView的大小?

来自分类Dev

自动布局如何在具有3个等宽视图的视图中隐藏1个视图

来自分类Dev

如何自动调整网格中内容的大小,使其适合所有分辨率

来自分类Dev

调整scrollViewDidZoom中所有子视图的大小

来自分类Dev

子视图可以通过自动布局自动调整其父视图的大小吗?

来自分类Dev

具有自动布局的NSSplitView,防止按比例调整大小

来自分类Dev

如何确定哪个UIView超级视图导致子视图具有userInteractionEnabled = NO?

来自分类Dev

UIView使用自动布局拥抱所有子视图

来自分类Dev

Android会动态调整其所有视图的整体布局大小

来自分类Dev

调整超级视图的大小,同时使用自动布局动态添加子视图

来自分类Dev

使用自动布局调整子视图以保持其大小

来自分类Dev

子视图具有自动布局的XIB

来自分类Dev

Mac OS X使用带有视图控制器的自动布局,并允许调整窗口大小

来自分类Dev

具有动态子视图的自动布局

来自分类Dev

使具有动态高度子视图的 UIScrollView 与自动布局一起自动工作

来自分类Dev

Swift:以编程方式为子视图设置自动布局约束不调整视图大小

来自分类Dev

如何在所有视图控制器中禁用自动调整大小

来自分类Dev

超级视图加载完成后调整子视图的大小

Related 相关文章

  1. 1

    使用自动布局动态更改子视图后调整视图的大小

  2. 2

    UIView:自动调整除一个子视图以外的所有子视图的大小-iOS

  3. 3

    子视图可以通过自动布局自动调整其父视图的大小吗?

  4. 4

    具有自动布局的NSCollectionView自动调整大小子视图

  5. 5

    使用自动布局调整超级视图和所有超级视图的同级大小

  6. 6

    可可自动布局和子视图的大小

  7. 7

    具有自动布局的NSSplitView,防止按比例调整大小

  8. 8

    使用自动布局弹出键盘时如何调整视图大小

  9. 9

    如何在XIB中基于子视图的大小调整超级视图的高度?

  10. 10

    调整超级视图的大小,同时使用自动布局动态添加子视图

  11. 11

    如何从我的超级视图中的所有子视图中删除约束?

  12. 12

    自动布局-如何添加子视图以匹配UIView的大小?

  13. 13

    自动布局如何在具有3个等宽视图的视图中隐藏1个视图

  14. 14

    如何自动调整网格中内容的大小,使其适合所有分辨率

  15. 15

    调整scrollViewDidZoom中所有子视图的大小

  16. 16

    子视图可以通过自动布局自动调整其父视图的大小吗?

  17. 17

    具有自动布局的NSSplitView,防止按比例调整大小

  18. 18

    如何确定哪个UIView超级视图导致子视图具有userInteractionEnabled = NO?

  19. 19

    UIView使用自动布局拥抱所有子视图

  20. 20

    Android会动态调整其所有视图的整体布局大小

  21. 21

    调整超级视图的大小,同时使用自动布局动态添加子视图

  22. 22

    使用自动布局调整子视图以保持其大小

  23. 23

    子视图具有自动布局的XIB

  24. 24

    Mac OS X使用带有视图控制器的自动布局,并允许调整窗口大小

  25. 25

    具有动态子视图的自动布局

  26. 26

    使具有动态高度子视图的 UIScrollView 与自动布局一起自动工作

  27. 27

    Swift:以编程方式为子视图设置自动布局约束不调整视图大小

  28. 28

    如何在所有视图控制器中禁用自动调整大小

  29. 29

    超级视图加载完成后调整子视图的大小

热门标签

归档