前言
- 背景:
最近开发横屏的电子签名,发现筛选视图的蒙版挡住了电子签名界面
- 问题的具体描述:
首次跳转到采集签名页面,有一半,屏幕是暗的,点击屏幕后才正常. 且这样的情况下查看商户协议和确认签名按钮无法点击.
- 重现方法:
从商户列表去新增进件的商户
- 问题的原因:
之前商户列表的筛选视图和蒙版居于keyWindow的顶部视图,隐藏时没有考虑横屏的情况,导致电子签名切换到横屏的时候,并没有被移除到屏幕之外。
具体原因是
:商户列表的筛选视图隐藏的方式是采用的一种不推荐的小技巧(将筛选视图的x(视图的左侧)设置为竖屏状态下的屏幕宽度1.15倍。这样搜索视图就移动到屏幕右侧,在竖屏就看不见,而在电子签名切换到横屏的时候,就展现了)
I 、解决方案:
移动筛选视图到屏幕外的隐藏方式必要要移除到横屏以及竖屏之外。
1.1.具体的做法:
1、电子签名视图即将展示的 时候,保证先设置View约束,再进行切换横屏。
2、通过修改筛选视图的隐藏方式来保证切换横屏之后电子签名界面始终在最前面
(不推荐使用;self.tabBarController.view.layer.zPosition = 999和[UIApplication.sharedApplication.keyWindow bringSubviewToFront:self.tabBarController.view];
)
1.2 具体的修改方案是:
1)设置筛选视图earchV和它的蒙版alphaView为横屏也看不见(#define searchVHiddenx (kWidth * 9.15 + kWidth))
2) 进入商户列表的商户,如果没有点击筛选按钮,提前创建的蒙蔽视图alphaView要保证是透明的并且是移除到横竖屏之外。
(或者创建蒙蔽之后直接触发蒙蔽的点击事件来隐藏搜索searchV,并要设置蒙蔽为透明的。)
II、错误的代码示例:
weakSelf.alphaView.frame = CGRectMake(kWidth, 0, kWidth, kHeight); [UIView animateWithDuration:0.5 animations:^{ weakSelf.alphaView.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.0]; }]; [UIView animateWithDuration:0.5 animations:^{ weakSelf.searchV.frame = CGRectMake(kWidth * 0.15 + kWidth, 0, kWidth * 0.85, kHeight); }];
III、正确的代码:
- (void)resignTapGestureAction:(UITapGestureRecognizer *)tap { __weak typeof(self) weakSelf = self; // 往右滑隐藏筛选视图 [UIView animateWithDuration:0.5 animations:^{ weakSelf.searchV.frame = CGRectMake(searchVHiddenx, 0, weakSelf.wid, kHeight); weakSelf.alphaView.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.0]; }]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ weakSelf.alphaView.frame = CGRectMake(searchVHiddenx, 0, kWidth, kHeight); }); }
- 由于之前同事写的代码是到处copy,并没有封装,现只能抽取一个方法
- (void)resignTapGestureAction:(UITapGestureRecognizer *)tap { return [QCT_Common resignTapGestureAction:nil searchV:_searchV alphaView:_alphaView]; }
+ (void)resignTapGestureAction:(UITapGestureRecognizer *)tap searchV:(UIView*)searchV alphaView:(UIView*)alphaView{ CGFloat searchVwid = kWidth * 0.85; [UIView animateWithDuration:0.5 animations:^{ searchV.frame = CGRectMake(searchVHiddenx, 0, searchVwid, kHeight); alphaView.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.0]; }]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ alphaView.frame = CGRectMake(searchVHiddenx, 0, kWidth, kHeight); }); }
- 安全起见,保证的做法是viewWillDisappear方法执行隐藏筛选View的方法
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [QCTStatusBarTool setStatusBarBackgroundColor:[UIColor clearColor]]; [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; [self resignTapGestureAction:nil]; }