我有一個UITableView(我們稱之為table1),其中包含靜態行。第一行包含另一個UITableView( table2),從 Internet 上的 XML 檔案動態填充,在創建單元格后完成,因為是異步的。僅在請求完成后才table2創建并添加到單元格contentView(否則會提示錯誤文本作為單元格的標簽)。
table2由折疊部分相互作用時被擴大,因而它也改變的contentSize/height的table2。
我想要實作的是table1在 2 個關鍵點動態調整單元格大小:1在 Web 請求完成時,這意味著當表被創建并添加為子視圖時,以及2在table2互動的一部分時,這使得table1變化的高度;table1單元格應該遵循并執行完全相同的高度變化。
我到處搜索并嘗試了很多東西,但沒有任何效果,而且我已經被困了好幾天。
這是我嘗試過的:
- 覆寫 (
estimated)heightForRowAtIndexPath::無用,因為它只被呼叫一次,并且在table2添加之前 - 更改
UITableViewAutomaticDimension和estimatedRowHeight:默認完成 - 在創建
NSLayoutConstraint之內updateConstraints或之后使用stable2 - 玩
intrinsicContentSize和invalidateIntrinsicContentSize: - 使用
reloadRowsAtIndexPaths:withRowAnimation:
...但沒有任何效果,我覺得我已經嘗試了一切
關于約束,我嘗試了類似的東西:
table2.top= contentView.top= cell.top(前導和尾隨相同)
cell.bottom= contentView.bottom= table2.bottom(也有高度)
編輯 1:
我的代碼:
// Cell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
self.openSection = -1; // reports which section of table2 is open
SPDSpinnerView *spinner = [[SPDSpinnerView alloc] initWithFrame:self.frame]; // view with UIActivityIndicator & text
spinner.label.text = @"Loading...";
[self addSubview:spinner];
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
[self loadDataWithCompletion:^(BOOL success) {
// Remove spinner
for (UIView *view in [self subviews]) {
if ([view isKindOfClass:[SPDSpinnerView class]]) [view removeFromSuperview];
}
// Handle result
if (success) {
// Add table view when done
self.table2 = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain];
self.table2.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
[self.table2 registerClass:[SPDChangelogHeaderView class] forHeaderFooterViewReuseIdentifier:@"headerView"]; // custom tappable header for collapsible sections
self.table2.scrollEnabled = NO;
self.table2.delegate = self;
self.table2.dataSource = self;
self.table2.translatesAutoresizingMaskIntoConstraints = NO;
[UIView transitionWithView:self.contentView duration:.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
[self.contentView addSubview:self.table2];
// FIXME: fit table2 in cell
} completion:nil];
} else {
self.textLabel.text = @"Error loading data";
}
}];
}
return self;
}
// delegates, touch handler for table2, and data loader
(除了通常的代碼之外,沒有其他與我的問題相關的內容)
編輯 2:
“模型:”
目前的樣子
我希望它在第 1 步(資料加載后)
當內部部分折疊或展開時我希望它是什么
對于(2)和(3),紅線是我想要的高度table2和單元格。在這個 MRE 中,table2與 的其余部分重疊,table1但我當然希望在 的單元格之間保持相同的間距table1,table1必須與單元格一樣增長。
謝謝!
uj5u.com熱心網友回復:
所以,在DonMag 的幫助下,我重新考慮了我的問題。我的想法是在我的單元格中嵌入整個表格:相反,他們建議使用subsections。一個鏈接價值千言萬語:
github.com/DonMag/SubSectionsDemo
如果你想進一步解釋它是如何作業的,讓我解釋一下。基本上,這個想法是創建兩種您想要“模擬”嵌入表格的單元格:(子)標題和(子)單元格。它們都是屬于您的 部分的單元格table1,具有 2 種不同的外觀。
然后,要重新創建折疊效果,您必須處理單元格選擇,但僅適用于tableView:didSelectRowAtIndexPath:.
單元折疊是通過重新加載資料然后添加到table1部分來完成的,在重新加載期間,只有沒有虛擬折疊的子單元和所有子標題。
希望它足夠清晰,可以幫助您理解上面 GitHub 上的代碼。
不幸的是,我不會按原樣使用它,因為我確實使用了一個特殊的子類,UITableViewController其行為略有不同。我會盡量使 DonMag 的代碼適應我的使用,但這個想法本身會對我有很大幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326566.html
上一篇:帶有labels.isHidden的tableview/tableviewcell奇怪行為
下一篇:SwiftFirestoreUITableViewcellForRowAtdownloadURL關閉中的錯誤單元格
