iOS 14更新后APP出现的问题解决

昨天更新了下Xcode到 Xcode 12.0,然后真机运行了iOS 14的手机,出现了几个问题,记录一下,希望对大家有帮助。

1、自定义的UITableViewCell里的子view(名字叫TagsPanelView)的- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 方法没有响应

 

解决】:检查UITableViewCell 加入这个子view的方式:使用 [self.contentView addSubview:xxx] 而不是 [self addSubview:xxx]

  参考地址: iOS14 自定制tableViewCell不能点击

 

2、Launch Screen 黑屏

解决】:检查Launch Screen.storyboard里面用到的图片是不是太大了,图片过大会显示不出来。我的Launch Screen.storyboard用的是一张全屏的大图,尺寸是 1500 × 2668(2x图)、2250 × 4002(3x图)。后来改成了750 × 1334(2x图)、1242 × 2209(3x图)。然后能正常展示了。

另外注意的是】:无论是改了Launch Screen.storyboard里面的图片的大小还是名字,都要卸载APP并且重启手机,运行出来的才是最新的启动图。因为系统会对Launch Screen进行缓存。

 

3、popToViewController:animated 后底部tabBar 不能正确隐藏

A ->B -> C A显示TabBar,B、C不显示。C通知A,在A中调用:[self.navigationController popToViewController:self animated:YES];  达到从C直接返回A的效果。

出现问题:从C直接返回A后,在A中第一次Push ViewController,这个ViewController的TabBar没有被隐藏。

【解决方法】:请参考地址iOS开发 -- iOS 14下popToRootViewControllerAnimated:YES 导致TabBar隐藏的问题

 

4、popToViewController:animated 后viewWillAppear 方法中调用setNavigationBarHidden:true animated:animated 失效/不管用(跟第三点是一个场景)。一直都是用下面的方法来处理在Navigation 导航中push一个不展示导航栏的VC。 

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:true animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:false animated:animated];
}

A->B->C,其中A不展示导航栏,B、C展示导航栏。iOS 14下,C通过通知,通知A,直接从在A中调用[self.navigationController popToViewController:self animated:YES],达到C直接返回到A。

【出现问题】:A意外滴出现了导航栏

【投机取巧的解决方法】:发现在viewDidLayoutSubviews中调用    [self.navigationController setNavigationBarHidden:true animated:animated]; 是能正确展示的。但是viewDidLayoutSubviews在调用viewWillDisappear之后也会被调用到。所以直接在viewDidLayoutSubviews中调用是不对的,会有问题。

我的投机取巧的方式就是:(1)用一个BOOL 的属性popToSelf在调用 [self.navigationController popToViewController:self animated:YES]的时候标记为YES。(2)然后在viewDidLayoutSubviews中判断是popToSelf是否为YES,如果为YES就会调用setNavigationBarHidden:true,然后把popToSelf 恢复为NO。这样保证在viewWillDisappear之后setNavigationBarHidden:true不会被调用到。

害!谁有更好的解决方法请滴滴我,谢谢啦!!

               
@property(nonatomic, assign) BOOL popToSelf; //只用在iOS 14,没有别的办法了,只能酱紫投机取巧一下
   


    PREP_BLOCK
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:KPopToSelfNotification object:nil] subscribeNext:^(NSNotification *notification) {
        BEGIN_BLOCK
        [self.navigationController popToViewController:self animated:YES];
        self.popToSelf = YES; //设置popToSelf为YES

        END_BLOCK
    }];
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [self.tableView reloadData];
}

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    if (@available(iOS 11.0, *)) {
        if (self.popToSelf) {   //判断popToSelf
            if (![self.navigationController isNavigationBarHidden]) {
                [self.navigationController setNavigationBarHidden:YES animated:YES];
            }
 
            self.popToSelf = NO;  //重置popToSelf
        }
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

 

 

 

 

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页