HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
因为我发现AutoLayout我无处不在使用它,现在我试图使用它与tableHeaderView。

做了一个UIView的子类添加了一切(标签等…)我想与他们的约束,然后我添加这个CustomView到UITableView’tableHeaderView。

一切都工作正常,除了UITableView总是显示在CustomView之上,通过上面我的意思是CustomView是在UITableView所以它不能被看到!

看来,无论我做什么,UITableView’tableHeaderView的高度总是0(所以是宽度,x和y)。

我的问题:是否有可能完成这一点,而不手动设置框架?

编辑:
我使用的CustomView的视图有这些约束:

_title = [[UILabel alloc]init];
    _title.text = @"title";
    [self addSubview:_title];
    [_title keep:[KeePTOPInset rules:@[[KeepEqual must:5]]]]; // title has to stay at least 5 away from the supperview Top
    [_title keep:[KeepRighTinset rules:@[[KeepMin must:5]]]];
    [_title keep:[KeepLefTinset rules:@[[KeepMin must:5]]]];
    [_title keep:[KeepBottomInset rules:@[[KeepMin must:5]]]];

我使用一个便的库“KeepLayout”,因为手动写入约束永远和太多的行一个单一的约束,但@L_673_7@是自我解释。

而UITableView有这些约束:

_tableView = [[UITableView alloc]init];
_tableView.translatesAutoresizingMaskIntoConsTraints = NO;
_tableView.delegate = self;
_tableView.datasource = self;
_tableView.BACkgroundColor = [UIColor clearColor];
[self.view addSubview:_tableView];
[_tableView keep:[KeePTOPInset rules:@[[KeepEqual must:0]]]];// these 4 consTraints make the UITableView stays 0 away from the superview top left right and bottom.
[_tableView keep:[KeepLefTinset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepRighTinset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepBottomInset rules:@[[KeepEqual must:0]]]];

_detailsView = [[CustomView alloc]init];
_tableView.tableHeaderView = _detailsView;

我不知道如果我必须直接在CustomView上设置一些约束,我认为CustomView的高度是由UILabel“标题”中的约束确定的。

编辑2:经过另一个调查,似乎自定义视图的高度和宽度正确计算,但自定义视图的顶部仍然在同一水平比UITableView的顶部,他们一起移动时,我滚动。

解决方法

我问和回答一个类似的问题 here.总之,我添加头一次,并使用它来找到所需的高度。然后可以将该高度应用于标题,并且第二次设置标题以反映该改变。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.header = [[SCAmessageView alloc] init];
    self.header.titleLabel.text = @"Warning";
    self.header.subtitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long.";

    //set the tableHeaderView so that the required height can be determined
    self.tableView.tableHeaderView = self.header;
    [self.header setNeedsLayout];
    [self.header layoutIfNeeded];
    CGFloat height = [self.header systemLayoutSizeFitTingSize:UILayoutFitTingCompressedSize].height;

    //update the header's frame and set it again
    CGRect headerFrame = self.header.frame;
    headerFrame.size.height = height;
    self.header.frame = headerFrame;
    self.tableView.tableHeaderView = self.header;
}

如果您有多行标签,这也依赖于自定义视图设置每个标签的preferredMaxLayoutWidth:

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.framE);
    self.subtitleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.subtitleLabel.framE);
}

或者更一般地:

override func layoutSubviews() {
    super.layoutSubviews()  
    for view in subviews {
        guard let label = view as? UILabel where label.numberOfLines == 0 else { conTinue }
        label.preferredMaxLayoutWidth = CGRectGetWidth(label.framE)
    }
}

2015年1月更新

不幸的是,这似乎仍然是必要的。这里是一个swift版本的布局过程:

tableView.tableHeaderView = header
header.setNeedsLayout()
header.layoutIfNeeded()
let height = header.systemLayoutSizeFitTingSize(UILayoutFitTingCompressedSizE).height
var frame = header.frame
frame.size.height = height
header.frame = frame
tableView.tableHeaderView = header

我发现将它移植到UITableView上的扩展很有用:

extension UITableView {
    //set the tableHeaderView so that the required height can be determined,update the header's frame and set it again
    func setAndLayoutTableHeaderView(header: UIView) {
        self.tableHeaderView = header
        header.setNeedsLayout()
        header.layoutIfNeeded()
        let height = header.systemLayoutSizeFitTingSize(UILayoutFitTingCompressedSizE).height
        var frame = header.frame
        frame.size.height = height
        header.frame = frame
        self.tableHeaderView = header
    }
}

用法

let header = SCAmessageView()
header.titleLabel.text = "Warning"
header.subtitleLabel.text = "Warning message here."
tableView.setAndLayoutTableHeaderView(header)

大佬总结

以上是大佬教程为你收集整理的iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?全部内容,希望文章能够帮你解决iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。