背景:采用MBProgressHUD(0.9),封装Tip和Loading,在短屏上面出现被键盘遮住的问题。
Tip和Loading都有两个基础方法(下面以Tip为例):
- (void)show:(NSString *)message yoffset:(float)yoffset toView:(UIView *)view;
(展示文字提示) - (void)showCustomView:(UIView *)view message:(NSString *)message yoffset:(float)yoffset toView:(UIView *)view;(展示自定义视图和文字)
解决思路:
1.判断tip框是否被键盘遮住,如果被遮住,则修改yoffset的值,使其显示在键盘上方;否则不做处理。
2.将tip加到最上层的window上。这样有问题:键盘对应的window,在不同的操作系统版本下表现不一样。排除该方法。
采用方法1,有个最核心的问题:获取tip相对于屏幕的frame。而MBProgressHUD提供的size属性必须要调用layoutSubviews方法后,才会计算。
所以通过layoutIfNeeded提前调用layoutSuviews,这样可以获得正确的frame,但是,这样会导致更改yoffset之后,hud的背景会移动,customView不会移动。究其原因是因为,hud内部在drawRect方法里绘制的,所以背景会移动。而customView是在layoutSubviews里布局的,在手动调用layoutSubviews后,needLayoutSubviews标志位为NO,导致不会调用layoutSubviews。
解决办法:在调用layoutSubviews后,手动调用setNeedsLayout。
坑:
1.addSuview会移除superView的关联