问题场景
1,实现标签页
2,子控制器使用UIViewController,添加UITableView实现
3,UIViewController的view在显示的时候添加到scrollerView中,调用viewDidLoad显示处理
4,tableView根据view设置布局(View的frame),View的frame是在容器中设置的(view添加到scrollerView布局)
问题:
tableView的frame计算错误
在项目中实现下面界面功能是遇到的问题:
[图片上传中。。。(1)]
这个页面的思路是使用一个viewController作为容器,在viewController中添加scrollerView,作为子视图的容器;
对于内部显示的每个小模块,都是使用一个对应的控制器进行实现,然后将控制器的视图(view)添加到容器的scrollerView中显示
[图片上传中。。。(2)]
1,首先,添加子控制器到父容器中
- (void)setupChildVc{
[self addChildController:CKAGMessageBoxMessageTypeTrends title:@"动态"];
[self addChildController:CKAGMessageBoxMessageTypeCourse title:@"课程"];
[self addChildController:CKAGMessageBoxMessageTypeDemand title:@"需求"];
[self addChildController:CKAGMessageBoxMessageTypeMoney title:@"钱包"];
[self addChildController:CKAGMessageBoxMessageTypeSys title:@"系统"];}- (void)addChildController:(CKAGMessageBoxMessageType)type title:(NSString *)title { CKAGMessageBoxController *trendsBoxVc = [[CKAGMessageBoxController alloc] initWithMessageType:type]; trendsBoxVc.title = title; trendsBoxVc.delegate = self; [self addChildViewController:trendsBoxVc];
}
2,在需要显示界面的时候,将相应子控制器的view添加到scrollerView中
a,这么做的好处是,界面不需要显示的情况下,不会调用viewDidLoad方法,不会提前加载页面的内容,提高性能
pragma mark - UIScrollViewDelegate- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ // 当前索引 NSInteger index = scrollView.contentOffset.x / scrollView.width; // 取出子控制器 CKAGMessageBoxController *vc = self.childViewControllers[index]; vc.view.x = scrollView.contentOffset.x; vc.view.y = 0; // 设置控制器view 的y值为0(默认为20) vc.view.width = scrollView.width;
vc.view.height = scrollView.height; // 设置控制器view 的height值为整个屏幕的高度(默认比屏幕少20)
[scrollView addSubview:vc.view]; [vc requsetNewData];
}
这里的实现是滚动到那个页面,就将哪个页面的view添加到scrollerView上(view添加到scrollerView上之后,重复添加是没有关系的);这个时候如果view没有添加过,就会调用到相应控制器的viewDidLoad方法
原因:
CKAGMessageBoxController *vc = self.childViewControllers[index];
1 vc.view.x = scrollView.contentOffset.x;
vc.view.y = 0; // 设置控制器view 的y值为0(默认为20) vc.view.width = scrollView.width;
2 vc.view.height = scrollView.height; // 设置控制器view 的height值为整个屏幕的高度(默认比屏幕少20)
[scrollView addSubview:vc.view];
代码1的时候,控制器的view实例处理,调用viewDidLoad方法;
- (void)viewDidLoad {
[super viewDidLoad];
// 设置UITableView
}
接着,viewDidLoad方法会去实例控制器中tableView,并且设置tableVIew的frame;而tableView的frame是根据self.view的frame设置的
在代码1到代码2才完成了View的frame设置,因此设置tableViewframe的时候view的frame为zero,因此tableView的frame就不是准确的了
活用loadView方法:
翻看之前的项目,之所以之前的项目没有出现问题,是因为用的是UITableViewController,而UITableViewController的view就是tableView,因此tableVIew的frame也就不存在出错的问题。
和同事讨论loadVIw方法的时候,想到loadVIew方法就是用来实例self.view的,那么上面的情况,我们将使用到的tableView在loadView方法中实现,并且成为self.view不就相当于自己实现了UITableViewController吗?不知道这样是否会出现问题