昨天更新了下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];
}