本文的主角是viewWillLayoutSubviews,在UIViewController有这样一个方法,在VC默认的那个view将要layoutSubViews时会被调用,在VC的子类需要的时候可以重载它,默认的操作是个空操作,在API还有个对应的viewDidLayoutSubviews的方法。
这里提到这个是因为开发项目的时候碰到这样的情况,我建了一个继承自UITabController的controller,默认的那个tabBar上有5个UITabBarButton,我根据需求自定义了一个view加在了tabBar的上面,这个时候我不想要这5个UITabBarButton,所以我就在viewDidLoad里把它们都移除了,这样我的tabBar的子视图便只有我想要的那一个。
看起来很OK,可是好景不长,app里面点过来点过去,然后就发现那5个该死的UITabBarButton就回来了,测试了很多次,发现是在某些页面调用了popToViewController造成的。不过没有关系,来一个我删一个,我再把它们删了就好了,反正又不看。
找了蛮久,找到像上面这样的方法,如获至宝,重载之后简单实现如下:
- (void)viewWillLayoutSubViews {
for (UIView *vi in self.tabBar.subviews) {
if ([vi isKindOfClass:[IWTabBar class]]) {
continue;
}
[vi removeFromSuperview];
}
}
然后还在文档里找到这样一句话:
当视图的bounds变化时。视图需要调整它的子视图的位置,这个时候就会call上面的方法。
由此可见,popToViewController是会影响到window的根视图控制器的view的bounds的,即使没有变化,也会重新刷新下。当然,这些只是猜测有待验证。
网友评论