問(wèn)題場(chǎng)景
1,實(shí)現(xiàn)標(biāo)簽頁(yè)
2扮授,子控制器使用UIViewController迷守,添加UITableView實(shí)現(xiàn)
3暖呕,UIViewController的view在顯示的時(shí)候添加到scrollerView中,調(diào)用viewDidLoad顯示處理
4场躯,tableView根據(jù)view設(shè)置布局(View的frame)谈为,View的frame是在容器中設(shè)置的(view添加到scrollerView布局)
問(wèn)題:
tableView的frame計(jì)算錯(cuò)誤
在項(xiàng)目中實(shí)現(xiàn)下面界面功能是遇到的問(wèn)題:
[圖片上傳中。踢关。伞鲫。(1)]
這個(gè)頁(yè)面的思路是使用一個(gè)viewController作為容器,在viewController中添加scrollerView签舞,作為子視圖的容器秕脓;
對(duì)于內(nèi)部顯示的每個(gè)小模塊,都是使用一個(gè)對(duì)應(yīng)的控制器進(jìn)行實(shí)現(xiàn)儒搭,然后將控制器的視圖(view)添加到容器的scrollerView中顯示
[圖片上傳中吠架。。搂鲫。(2)]
1傍药,首先,添加子控制器到父容器中
- (void)setupChildVc{
[self addChildController:CKAGMessageBoxMessageTypeTrends title:@"動(dòng)態(tài)"];
[self addChildController:CKAGMessageBoxMessageTypeCourse title:@"課程"];
[self addChildController:CKAGMessageBoxMessageTypeDemand title:@"需求"];
[self addChildController:CKAGMessageBoxMessageTypeMoney title:@"錢包"];
[self addChildController:CKAGMessageBoxMessageTypeSys title:@"系統(tǒng)"];}- (void)addChildController:(CKAGMessageBoxMessageType)type title:(NSString *)title { CKAGMessageBoxController *trendsBoxVc = [[CKAGMessageBoxController alloc] initWithMessageType:type]; trendsBoxVc.title = title; trendsBoxVc.delegate = self; [self addChildViewController:trendsBoxVc];
}
2魂仍,在需要顯示界面的時(shí)候拐辽,將相應(yīng)子控制器的view添加到scrollerView中
a,這么做的好處是擦酌,界面不需要顯示的情況下薛训,不會(huì)調(diào)用viewDidLoad方法,不會(huì)提前加載頁(yè)面的內(nèi)容仑氛,提高性能
pragma mark - UIScrollViewDelegate- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ // 當(dāng)前索引 NSInteger index = scrollView.contentOffset.x / scrollView.width; // 取出子控制器 CKAGMessageBoxController *vc = self.childViewControllers[index]; vc.view.x = scrollView.contentOffset.x; vc.view.y = 0; // 設(shè)置控制器view 的y值為0(默認(rèn)為20) vc.view.width = scrollView.width;
vc.view.height = scrollView.height; // 設(shè)置控制器view 的height值為整個(gè)屏幕的高度(默認(rèn)比屏幕少20)
[scrollView addSubview:vc.view]; [vc requsetNewData];
}
這里的實(shí)現(xiàn)是滾動(dòng)到那個(gè)頁(yè)面乙埃,就將哪個(gè)頁(yè)面的view添加到scrollerView上(view添加到scrollerView上之后,重復(fù)添加是沒(méi)有關(guān)系的)锯岖;這個(gè)時(shí)候如果view沒(méi)有添加過(guò)介袜,就會(huì)調(diào)用到相應(yīng)控制器的viewDidLoad方法
原因:
CKAGMessageBoxController *vc = self.childViewControllers[index];
1 vc.view.x = scrollView.contentOffset.x;
vc.view.y = 0; // 設(shè)置控制器view 的y值為0(默認(rèn)為20) vc.view.width = scrollView.width;
2 vc.view.height = scrollView.height; // 設(shè)置控制器view 的height值為整個(gè)屏幕的高度(默認(rèn)比屏幕少20)
[scrollView addSubview:vc.view];
代碼1的時(shí)候,控制器的view實(shí)例處理出吹,調(diào)用viewDidLoad方法遇伞;
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置UITableView
}
接著,viewDidLoad方法會(huì)去實(shí)例控制器中tableView捶牢,并且設(shè)置tableVIew的frame鸠珠;而tableView的frame是根據(jù)self.view的frame設(shè)置的
在代碼1到代碼2才完成了View的frame設(shè)置巍耗,因此設(shè)置tableViewframe的時(shí)候view的frame為zero,因此tableView的frame就不是準(zhǔn)確的了
活用loadView方法:
翻看之前的項(xiàng)目渐排,之所以之前的項(xiàng)目沒(méi)有出現(xiàn)問(wèn)題炬太,是因?yàn)橛玫氖荱ITableViewController,而UITableViewController的view就是tableView驯耻,因此tableVIew的frame也就不存在出錯(cuò)的問(wèn)題亲族。
和同事討論loadVIw方法的時(shí)候,想到loadVIew方法就是用來(lái)實(shí)例self.view的可缚,那么上面的情況霎迫,我們將使用到的tableView在loadView方法中實(shí)現(xiàn),并且成為self.view不就相當(dāng)于自己實(shí)現(xiàn)了UITableViewController嗎帘靡?不知道這樣是否會(huì)出現(xiàn)問(wèn)題