美文网首页
addChildViewController debug

addChildViewController debug

作者: 烟影很美 | 来源:发表于2015-12-21 14:10 被阅读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却是正常的

    相关文章

      网友评论

          本文标题:addChildViewController debug

          本文链接:https://www.haomeiwen.com/subject/gsumhttx.html