[英]How do I propagate subview resizing to superview resizing?
我試圖與自動調整掩碼自動執行相反的操作。 也就是說,我有一個視圖層次結構,我需要在最深的子視圖框架中向上傳播一個更改,以便所有子視圖調整大小以適應更新的(可能更大的)子視圖。
具體來說,我有一個滾動視圖,它有一個子視圖作為容器,其中包含一個表,另一個視圖又包含一個圖像和另一個表。 像這樣:
這是一系列事件:
一種)
1如果人的名字太長(表示單元格高度是可變的並且在運行時在heightForCellAtIndexPath上計算),則最內層的表(2行)可能必須向下拉伸。
2如果是這樣,則需要觸發此表和圖像的容器視圖的拉伸,以使表中的單元格不會溢出視圖。
3如果是這種情況,那么此容器視圖下方的另一個表需要向下轉換一點以確保它不重疊。 請注意,即使步驟1,2沒有發生,鏈也可以從這里開始。 如果任何此表的3行恰好拉伸以容納更長的文本,則會出現這種情況。
4如果上述任何一個導致長度增加,則最外面的容器視圖也需要拉伸長度。
5最后,如果此外部容器視圖確實拉伸,則根卷軸視圖需要更改其contentSize屬性,以便新的更大視圖適合並且如果大於設備的屏幕則可以完全滾動。
第一個問題是知道什么時候(在代碼中的什么位置)最內層的表完成布局其單元格並計算其最終幀。 如果我知道最終幀何時知道,我可以將view.frame更改的KVO通知發送到管理所有這些視圖的單個視圖控制器。 但是控制器必須手動調整所有子視圖幀的大小。 我嘗試過這種方法,但框架似乎不准確。 我想知道是否可能存在我不考慮的時間問題。
這適用於例如:
- (void)viewDidLoad
{
...
[self addObserver:self forKeyPath:@"attendeeContentView.frame" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"attendeeContentView.frame"])
{
CGRect newFrame = [[change objectForKey:NSKeyValueChangeOldKey] CGRectValue];
UIScrollView *scrollView = (UIScrollView*)self.view;
scrollView.contentSize = CGSizeMake([[UIScreen mainScreen] applicationFrame].size.width, newFrame.size.height + newFrame.origin.y);
NSLog(@"\n new contentSize: %f", newFrame.size.height + newFrame.origin.y);
}
}
但這只是鏈中的最后一環。 這一切都始於最里面的桌子擴展以適應所有細胞......
有任何想法嗎?
您可以檢查最后一次調用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.row == (NumberOfCells - 1)) {
// update your views (preferably call it after a slight delay)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.