實現(xiàn)一個控制器中視圖可滑動,上半部分可上下滑動襟士,下半部分可上下及左右切換場景
嘗試了多種方案:
方案1. 使用一個tableView承接所有自視圖盗飒,這種情況reloadData才能更換UI,但這樣也會閃屏陋桂,無法左右切換下半部分頁面逆趣,以及按鈕切換無法實現(xiàn)原子頁面不變,但視圖滾動流暢嗜历。
方案2. 使用一個scrollViewA承接上部分和一個承接下半部分的scrollViewB宣渗,這樣左右可實現(xiàn)滾動切換及保持原子頁面,但要實現(xiàn)上半部分和下半部分的視圖同步滾動梨州,需檢測下半部分子視圖中的tableViewC的偏移量并調(diào)節(jié)scrollViewA保持相同的偏移量并設置C的偏移量為原始偏移量痕囱,這樣保證了手勢在tableViewC的操作實現(xiàn)全頁面的滾動,但隨時設置偏移量這種做法使得頁面滾動不流暢暴匠。
方案3. viewControllerd的view承接一個scrollView和上半部分視圖鞍恢,scrollView上可以有多個tableview,tableview設置一個滿足上半部分遮蓋tableView是也無法遮擋內(nèi)容的headView(并不會顯示出來)headView的尺寸根據(jù)上半部分的尺寸及滾動的區(qū)間決定每窖。只需監(jiān)測tableView的偏移量來設置上半部分的位置帮掉,不需設置tableView的偏移量。
方案1岛请、3頁面滾動都很流暢旭寿,方案2、3都可以隨意切換下半部分子視圖崇败,相較方案3實用
方案3盅称、
///標記當前可控制的tableView肩祥,用于區(qū)別對待于滾動中設置另兩個tableView的偏移量
@property (nonatomic, strong) UITableView *currentTableView;
//觀察者模式 觀察tableView的偏移量
[self.firstViewController.tableView addObserver:self forKeyPath:@"contentOffset" options:(NSKeyValueObservingOptionNew) context:nil];
[self.secondViewController.tableView addObserver:self forKeyPath:@"contentOffset" options:(NSKeyValueObservingOptionNew) context:nil];
[self.thirdViewController.tableView addObserver:self forKeyPath:@"contentOffset" options:(NSKeyValueObservingOptionNew) context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (object == self.currentTableView) {
CGPoint offset = [[change valueForKey:NSKeyValueChangeNewKey] CGPointValue];
///只有imageView需要移動的時候才需要關心另外兩個tableView
if (0 <= offset.y && offset.y <= 160) {
CGRect rect = self.imageView.frame;
rect.origin.y = self.label.frame.size.height + 160 - offset.y - self.imageView.bounds.size.height;
self.imageView.frame = rect;
[self resetTableViewOffset:offset];
}else if (offset.y < 0){
CGRect rect = self.imageView.frame;
if (rect.origin.y != 0) {
rect.origin.y = 0;
self.imageView.frame = rect;
[self resetTableViewOffset:CGPointMake(0, 0)];
}
}else if (offset.y > 160){
CGRect rect = self.imageView.frame;
if (rect.origin.y != 40 - self.imageView.bounds.size.height) {
rect.origin.y = 40 - self.imageView.bounds.size.height;
self.imageView.frame = rect;
[self resetTableViewOffset:CGPointMake(0, 160)];
}
}
}
}
- (void)resetTableViewOffset:(CGPoint)offset
{
if (self.currentTableView == self.firstViewController.tableView) {
self.secondViewController.tableView.contentOffset = offset;
self.thirdViewController.tableView.contentOffset = offset;
}else if (self.currentTableView == self.secondViewController.tableView) {
self.firstViewController.tableView.contentOffset = offset;
self.thirdViewController.tableView.contentOffset = offset;
}else if (self.currentTableView == self.thirdViewController.tableView) {
self.firstViewController.tableView.contentOffset = offset;
self.secondViewController.tableView.contentOffset = offset;
}
}
......