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却是正常的

上一篇下一篇

猜你喜欢

热点阅读