带自动布局的 tableHeaderView 无法正常工作
tableHeaderView with Autolayout not working correctly
大家好,我有一个 TableHeaderView,一切都由 Autolayout 管理:
顶部的 UIImageView
应该始终是 2:1,所以我设置了纵横比和其他所需的约束。
4 UIButtons
应该总是水平的,并且应该有相同的高度和宽度。所以我使用等宽和等高以及 1:1
的纵横比
我有两个 UILabels
,numberOfLines
设置为 0。我还创建了 UILabel
的子类,因为 preferredMaxLayoutWidth
,像这样:
- (void) layoutSubviews
{
[super layoutSubviews];
if ( self.numberOfLines == 0 )
{
if ( self.preferredMaxLayoutWidth != self.frame.size.width )
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[self setNeedsUpdateConstraints];
}
}
}
这是我的代码:
- (void)initializeHeaderViewLabels
{
//After the Response from my server arrived i set the tableHeaderView with the Textdata
self.tableView.tableHeaderView = nil;
if((self.contentDict[@"title"]) != [NSNull null])
{
self.headerTitleLabel.text = (self.contentDict[@"title"]);
}
if((self.contentDict[@"shortDescription"]) != [NSNull null])
{
self.headerDescriptionLabel.text = (self.contentDict[@"shortDescription"]);
}
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.tableView setTableHeaderView:self.headerView];
}
我从我的服务器获取我的图像和 UILabels
的文本,所以我必须等到响应到达,然后我调用 initializeHeaderViewLabels
。
**我的问题是 tableHeaderView 在运行时太大了,所以我的 UILabels 被拉长了,有很多空白。也许我错过了什么?
页眉视图高度在 table 视图委托中设置。默认情况下,它与界面生成器中的大小相同,但在应用程序中 运行 时太大,因为界面生成器的宽度为 600。
所以你需要的是在UITableViewDelegate
中实现这个方法
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 200.0 // Set the desired height based on your device or what ever you are using.
}
和Objective-C版本:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 200.0f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 200;
}
为了使其正常工作,您需要一些 魔法或从 table header 视图 迁移。我已经回答过类似的问题 here. The trick is to magically reset tableHeaderView
after evaluating it's height via autolayout. I've created sample project for that: TableHeaderView+Autolayout.
尝试以下解决方案
- (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;
}
来源:
table header view height is wrong when using auto layout, IB, and font sizes
也参考下面的问题...!
How do I set the height of tableHeaderView (UITableView) with autolayout?
我的问题是我在我的 header 视图上设置了约束,这些视图将一些帧值映射到超级视图帧值。当我删除约束并直接设置框架时,一切正常。
大家好,我有一个 TableHeaderView,一切都由 Autolayout 管理:
顶部的
UIImageView
应该始终是 2:1,所以我设置了纵横比和其他所需的约束。4
UIButtons
应该总是水平的,并且应该有相同的高度和宽度。所以我使用等宽和等高以及 1:1 的纵横比
我有两个
UILabels
,numberOfLines
设置为 0。我还创建了UILabel
的子类,因为preferredMaxLayoutWidth
,像这样:- (void) layoutSubviews { [super layoutSubviews]; if ( self.numberOfLines == 0 ) { if ( self.preferredMaxLayoutWidth != self.frame.size.width ) { self.preferredMaxLayoutWidth = self.frame.size.width; [self setNeedsUpdateConstraints]; } } }
这是我的代码:
- (void)initializeHeaderViewLabels
{
//After the Response from my server arrived i set the tableHeaderView with the Textdata
self.tableView.tableHeaderView = nil;
if((self.contentDict[@"title"]) != [NSNull null])
{
self.headerTitleLabel.text = (self.contentDict[@"title"]);
}
if((self.contentDict[@"shortDescription"]) != [NSNull null])
{
self.headerDescriptionLabel.text = (self.contentDict[@"shortDescription"]);
}
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.tableView setTableHeaderView:self.headerView];
}
我从我的服务器获取我的图像和 UILabels
的文本,所以我必须等到响应到达,然后我调用 initializeHeaderViewLabels
。
**我的问题是 tableHeaderView 在运行时太大了,所以我的 UILabels 被拉长了,有很多空白。也许我错过了什么?
页眉视图高度在 table 视图委托中设置。默认情况下,它与界面生成器中的大小相同,但在应用程序中 运行 时太大,因为界面生成器的宽度为 600。
所以你需要的是在UITableViewDelegate
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 200.0 // Set the desired height based on your device or what ever you are using.
}
和Objective-C版本:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 200.0f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 200;
}
为了使其正常工作,您需要一些 魔法或从 table header 视图 迁移。我已经回答过类似的问题 here. The trick is to magically reset tableHeaderView
after evaluating it's height via autolayout. I've created sample project for that: TableHeaderView+Autolayout.
尝试以下解决方案
- (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;
}
来源:
table header view height is wrong when using auto layout, IB, and font sizes
也参考下面的问题...!
How do I set the height of tableHeaderView (UITableView) with autolayout?
我的问题是我在我的 header 视图上设置了约束,这些视图将一些帧值映射到超级视图帧值。当我删除约束并直接设置框架时,一切正常。