addChildViewController debug
2015-12-21 本文已影响143人
烟影很美
使用addChildViewController方法的视图不能使用xib? 不知道是不是这个原因...如图 如果当前控制器有xib fashion中的tableview就不能滑动 删掉就好了 谨记
4CAB6394-694F-4418-B294-97F1320E1396.png
续--2016.7.8
刚刚写了个demo研究下原因, 代码如下:
#import "ViewController.h"
#import "SubViewController.h"
@interface ViewController ()
@end
@implementation ViewController {
UIViewController *currentVC;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.titleView = [self titleView];
SubViewController *sub1 = [SubViewController new];
[self addChildViewController:sub1];
SubViewController *sub2 = [SubViewController new];
[self addChildViewController:sub2];
[self.view addSubview:sub1.view];
[sub1 didMoveToParentViewController:self];
currentVC = sub1;
sub1.view.backgroundColor = [UIColor orangeColor];
sub2.view.backgroundColor = [UIColor yellowColor];
NSLog(@"---view:%lf %lf", self.view.frame.size.width, self.view.frame.size.height);
NSLog(@"---sub1:%lf %lf", sub1.view.frame.size.width, sub1.view.frame.size.height);
NSLog(@"---sub2:%lf %lf", sub2.view.frame.size.width, sub2.view.frame.size.height);
}
- (UIView *)titleView {
UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 120, 44)];
UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 44)];
btn1.backgroundColor = [UIColor orangeColor];
[titleView addSubview:btn1];
btn1.tag = 0;
[btn1 addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(60, 0, 60, 44)];
btn2.backgroundColor = [UIColor yellowColor];
[titleView addSubview:btn2];
btn2.tag = 1;
[btn2 addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
return titleView;
}
- (void)btnClick:(UIButton *)btn {
UIViewController *viewController = self.childViewControllers[btn.tag];
if (viewController == currentVC) {
return;
}
NSLog(@"==========================================");
NSLog(@"---view:%lf %lf", self.view.frame.size.width, self.view.frame.size.height);
NSLog(@"---sub1:%lf %lf", viewController.view.frame.size.width, viewController.view.frame.size.height);
[self transitionFromViewController:currentVC toViewController:viewController duration:.5f options:UIViewAnimationOptionTransitionNone animations:^{
} completion:^(BOOL finished) {
if (finished) {
currentVC = viewController;
}
}];
}
其中SubViewController中通过代码添加了一个tableView
出现bug的条件为:
父控制器有xib, 子控制器(出现tableview不能滑动bug的控制器)没有xib.
注意: 如果子控制器也有xib, 不会触发bug
bug表现为:
子控制器(如代码中的sub1)中的tableview的左侧能够活动, 右侧用手指滑动无效
控制台打印结果为:
252651EA-2CFF-4C8B-96EB-714599DB1CBF.png
再打开View UI Hierarchy功能, 可以看到如下情况:
87D6862A-A152-4D0F-97FC-A74F9AC5A4C9.png
其中橙色的是sub1, 淡蓝色是tableView
通过控制台的打印和View UI Hierarchy, bug出现的原因就很明显啦, 在父控制器添加子控制器的时候, 父控制器的大小为600600, 而自控制器的大小为375667, 所以把子控制器的view添加在父控制器的view上时, 会出现上图那样的情况, 导致tableview只有左半边能够点击
而在切换控制器的时候调用transitionFromViewController方法的时候, 父控制器的view大小又变成了375*667, 所以sub1出现了bug, sub2却是正常的