使用自动布局,IB和字体大小时,表头视图高度是错误的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用自动布局,IB和字体大小时,表头视图高度是错误的相关的知识,希望对你有一定的参考价值。

我正在尝试为我的uiTableView创建一个标题视图(不是节标题,我已经有了。)我在界面构建器中设置了一个XIB。所有的连接都连接起来,它运行得很漂亮......除了桌子没有足够的空间!我的问题是表的顶部稍微重叠了表的标题。

我的XIB设置为所有按钮的自动布局,IB很高兴约束不会发生冲突/模糊。视图设置为自由形式大小,在我的情况下最终为320 x 471.然后在视图的约束中,我为视图设置了内在大小。

现在这与我的桌子完美搭配。一切看起来都很棒。但是如果我用代码手动更改标题视图中的任何字体,布局会使视图变大,最终会在我的表格下面。

任何想法如何让tableviewcontroller在设置字体和大小后留下足够的空间用于标题视图?我希望我有理由解释这一点。

答案

注意:可以在这里找到Swift 3+版本:https://gist.github.com/marcoarment/1105553afba6b4900c10#gistcomment-1933639


想法是在qazxsw poi的帮助下计算标题高度。

返回满足其所包含约束的视图的大小。考虑到它所拥有的所有约束及其子视图的约束,确定视图的最佳大小。

更改标题高度后,需要重新分配systemLayoutSizeFittingSize:targetSize属性以调整表格单元格。

基于这个答案:tableHeaderView

Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
另一答案

下面的代码对我有用: - 在你的UIView类中添加它 -

// Anchor the headerview, and set width equal to superview
NSDictionary *viewsDictionary = @{@"headerView":self.tableView.tableHeaderView,
                                  @"tableView":self.tableView};

[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[headerView]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[headerView]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[headerView(==tableView)]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
[self.tableView.tableHeaderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[headerView(121)]"
                                                                                       options:0
                                                                                       metrics:nil
                                                                                         views:viewsDictionary]];

}

另一答案

@rmigneco的答案对我有用,所以这里是它的快速版本:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];

if (self) {
    self.frame = CGRectMake(0, 0, self.frame.size.width, [[self class] height]);
}

return self;
另一答案

当我尝试将表视图标题设置为使用界面构建器使用自动布局定义的自定义视图时,我遇到了类似的问题。

当我这样做时,我会发现它会被一个节标题遮盖。

我的工作涉及使用“虚拟视图”作为表标题视图,然后将我的自定义视图作为子视图添加到该虚拟视图。我认为这允许自动布局根据约束和包含视图的框架配置外观。这可能不如vokilam的解决方案那么优雅,但它对我有用。


- (void)sizeHeaderToFit
{
    UIView *header = self.tableView.tableHeaderView;

    [header setNeedsLayout];
    [header layoutIfNeeded];

    CGFloat height = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    CGRect frame = header.frame;

    frame.size.height = height;
    header.frame = frame;

    self.tableView.tableHeaderView = header;
}
另一答案

因为你的CGRect headerFrame = CGRectMake(0, 0, yourWidth, yourHeight); UIView *tempView = [[UIView alloc] initWithFrame:headerFrame]; [tempView setBackgroundColor:[UIColor clearColor]]; YourCustomView *customView = [[YourCustomView alloc] initWithFrame: headerFrame]; [tempView addSubview:movieHeader]; self.tableView.tableHeaderView = tempView; 是自动布局的tableHeaderView,所以你的自定义xibheaderView的限制是未知的。你应该添加自定义superViewconstraints

1.in headerView将自定义headerView分配给tableView的tableHeaderView

viewDidLLoad

2.in - (void)updateViewConstraints,添加自定义headerView的基本约束

 - (void)viewDidLoad
{
    [super viewDidLoad];
    UIView *yourHeaderView = [[[NSBundle mainBundle] loadNibNamed:@"yourHeaderView" owner:nil options:nil] objectAtIndex:0];
    //important:turn off the translatesAutoresizingMaskIntoConstraints;apple documents for details
     yourHeaderView.translatesAutoresizingMaskIntoConstraints = NO;
    self.tableView.tableHeaderView = yourHeaderView;
}

好! PS:这是相关文件:- (void)updateViewConstraints { NSDictionary *viewsDictionary = @{@"headerView":yourHeaderView}; NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[headerView(121)]" options:0 metrics:nil views:viewsDictionary]; NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[headerView(320)]" options:0 metrics:nil views:viewsDictionary]; [self.headerView addConstraints:constraint_H]; [self.headerView addConstraints:constraint_V]; NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[headerView]" options:0 metrics:nil views:viewsDictionary]; NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[headerView]" options:0 metrics:nil views:viewsDictionary]; [self.tableView addConstraints:constraint_POS_V]; [self.tableView addConstraints:constraint_POS_H]; [super updateViewConstraints]; }

另一答案

是什么解决了我的问题:

Resizing the View Controller’s Views

我在某个地方找到了这个解决方案,并且像魅力一样工作,我记不清哪里了。

另一答案

我发现vokilam的工作答案很棒。这是他在Swift中的解决方案。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() { 
    if let headerView = tableView.tableHeaderView {

        headerView.setNeedsLayout()
        headerView.layoutIfNeeded()

        let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
        var newFrame = headerView.frame

        // Needed or we will stay in viewDidLayoutSubviews() forever
        if height != newFrame.size.height {
            newFrame.size.height = height
            headerView.frame = newFrame

            tableView.tableHeaderView = headerView
        }
    }
}
另一答案

在我的情况下,func sizeHeaderToFit() { guard let header = tableView.tableHeaderView else { return } header.setNeedsLayout() header.layoutIfNeeded() let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height header.frame.size.height = he

以上是关于使用自动布局,IB和字体大小时,表头视图高度是错误的的主要内容,如果未能解决你的问题,请参考以下文章

iOS 自动布局:这可以用 IB 完成吗?

如何使用自动布局根据子视图调整父视图的高度

调整子视图大小的自动布局问题

自动布局 - 中心有 5 个按钮

如何使用自动布局设置滚动视图内容大小?

使用自动布局的 IB_DESIGNABLE 自定义视图的错位视图警告和奇怪行为