[英]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
圖像和文本,因此必須等到Response到達后,再調用initializeHeaderViewLabels
。
**我的問題是,在運行時tableHeaderView太大了,因此我的UILabels被拉伸了,並且有很多空白。 也許我想念什么?
為了使它起作用,您需要一些魔術或從表頭視圖遷移出去 。 我已經在這里回答了類似的問題。 訣竅是通過自動布局評估其高度后,神奇地重置tableHeaderView
。 我已經為此創建了示例項目: 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;
}
資源:
另請參閱以下問題...!
我的問題是我在標頭視圖上設置了約束,這些約束將一些框架值映射到超級視圖框架值。 當我刪除約束並直接設置框架時,一切正常。
標題視圖高度是在表視圖委托中設置的。 默認情況下,它與界面構建器中的大小相同,在應用程序中運行時太大,因為界面構建器的寬度為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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.