Son 3 ya da 4 saattir bununla kafamı duvara çarpıyorum ve anlayamıyorum. İçinde tam ekran UITableView bulunan bir UIViewController'ım var (ekranda başka şeyler var, bu yüzden bir UITableViewController kullanamıyorum) ve tableHeaderView'umu otomatik düzen ile yeniden boyutlandırmak istiyorum. Söylemeye gerek yok, işbirliği yapmıyor.
Aşağıdaki ekran görüntüsüne bakın.
OverviewLabel (ör. "Genel bakış bilgilerini burada listeleyin." Metni) dinamik içeriğe sahip olduğundan, onu yeniden boyutlandırmak için otomatik düzen kullanıyorum ve gözetim altında. Hiearchy'de Paralax Tablo Görünümünün hemen altında bulunan tableHeaderView dışında her şey güzel bir şekilde yeniden boyutlandırılıyor.
Bu başlık görünümünü yeniden boyutlandırmanın bulduğum tek yolu, aşağıdaki kodla programlı olarak:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Bu durumda, headerFrameHeight, tableViewHeader yüksekliğinin aşağıdaki gibi manuel olarak hesaplanmasıdır (innerHeaderView, beyaz alandır veya ikinci "View", headerView ise tableHeaderView'dur) :
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
Manuel hesaplama işe yarıyor, ancak ileride işler değiştiğinde hantal ve hataya meyilli. Yapabilmek istediğim şey, başka herhangi bir yerde yapabileceğiniz gibi tableHeaderView'ın sağlanan kısıtlamalara göre otomatik olarak yeniden boyutlandırılmasıdır. Ama hayatım boyunca bunu çözemiyorum.
SO'da bununla ilgili birkaç gönderi var, ancak hiçbiri net değil ve beni daha fazla karıştırdı. İşte bunlardan birkaçı:
AutoLayout'u UITableView'ın tableHeaderView ile kullanmak mümkün müdür?
otomatik düzen, IB ve yazı tipi boyutlarını kullanırken tablo başlığı görünüm yüksekliği yanlış
TranslatesAutoresizingMaskIntoConstraints özelliğini NO olarak değiştirmek gerçekten mantıklı değil, çünkü bu sadece benim için hatalara neden oluyor ve kavramsal olarak bir anlam ifade etmiyor.
Herhangi bir yardım gerçekten takdir edilecektir!
DÜZENLEME 1: TomSwift'in önerisi sayesinde bunu çözebildim. Genel bakış yüksekliğini manuel olarak hesaplamak yerine, benim için aşağıdaki gibi hesaplattırabilir ve ardından tableHeaderView'ı daha önce olduğu gibi yeniden ayarlayabilirim.
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Düzenleme 2: Diğerlerinin de belirttiği gibi, Düzenleme 1'de yayınlanan çözüm, viewDidLoad'da çalışmıyor gibi görünüyor. Ancak, viewWillLayoutSubviews içinde çalışıyor gibi görünüyor. Aşağıdaki örnek kod:
// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[_headerWrapper setNeedsLayout];
[_headerWrapper layoutIfNeeded];
CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = _headerWrapper.frame;
headerFrame.size.height = height;
_headerWrapper.frame = headerFrame;
_tableView.tableHeaderView = _headerWrapper;
}
setTableHeaderView
Xcode6 üzerinde çalışmaz. Sorun, hücrelerin tableHeaderView tarafından çakışmasıdır. Ancak, Xcode5