之前在使用TableView的时候遇到过问题,需要使用另外的TableViewController来先存放TableView,原有的View则使用ViewContainer来引用TableViewController。此时是第一回接触一个ViewController中使用另一个ViewController。后来在开发的时候遇到另外的问题也需要用到ChildViewController,本来这类问题可以使用自定义的View来解决。在开发Android的时候自定义的View可以指定用某个布局文件,但是iOS的不能给自定义的View指定布局文件,靠代码去实现控件布局就很大难度,于是就搜索ViewContainer相关问题。
使用ViewContainer其实也是在ViewController中添加一个子的ViewController。在可视化StoryBoard中可以用ViewContainer,但是用纯代码控制的话,还是用ChildViewController比较方便。
ChildViewController是iOS5出来的新东西,iOS5给UIViewController添加了5个方法和一个属性,围绕着这个ChildViewController
// 方法 addChildViewController: removeFromParentViewController: transitionFromViewController:toViewController:duration:options:animations:completion: willMoveToParentViewController: didMoveToParentViewController: // 属性 @property(nonatomic,readonly) NSArray *childViewControllers
在我看来以上的方法属性可以望文生义,方法的作用依次是添加ChildViewController、去除ChildViewController,切换ChildViewController,后面的两个方法是有事件性质的,在ChildViewController切换到主的ViewController和切换完之后触发的。
但我现在的应用场景是需要把ChildView放到ScrollView里面,实现翻页的效果。
在StoryBoard中添加了两个ViewController,一个是主的里面添加了UIScrollView,另外添加的是作为添加到ParentViewController的ChildViewController。
先把ChildView的StroyBoard中添加一下命名,那么在主ViewController中构造ViewController时就可以按照StoryBoardID来构造了。
由于UIScrollView实现翻页的功能,所以要对它作以下配置
self.scrollView.contentSize=CGSizeMake(self.view.frame.size.width*pagecount, self.scrollView.frame.size.height); self.scrollView.pagingEnabled=true;
添加ChildViewController的代码如下所示
SunRealAQIViewController *realCV2=[[self storyboard]instantiateViewControllerWithIdentifier:@"test123"]; realCV2.view.frame=CGRectMake(self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height); [self addChildViewController:realCV2]; [self.scrollView addSubview:realCV2.view];
先是构造ChildViewController,再设置它的frame属性,这时第一页,第一页可以不设置,但第二页第三页就需要去设置,第三行则是调用UIViewController的addChildViewController的方法添加ChildViewController里面,最后则是把ChildView的视图添加到主视图的指定位置,在这里是要添加到ScrollView里面去,所以就是调用[self.scrollView addSubver:]的方法,需要添加多个相同的ChildViewController到ScrollView里面肯定用循环
for (int i=0; i<pagecount; i++) { SunRealAQIViewController *realCV2=[[self storyboard]instantiateViewControllerWithIdentifier:@"test123"]; realCV2.view.frame=CGRectMake(self.view.frame.size.width*i, 0, self.view.frame.size.width, self.view.frame.size.height); [self addChildViewController:realCV2]; [self.scrollView addSubview:realCV2.view]; }
就这样子开启了使用ChildViewController的大门!