1. 发现两个问题
说是两个问题, 但我不知道算不算是问题, 至少我感觉这影响到了用户体验.
1.1 问题1
我测试时候发现, 当界面正在展示进度条, 这时候弹出了键盘, 进度展示控件会自动上移一段距离, 键盘隐藏, 进度展示会恢复到原来的位置. 但是, 在键盘显示, 进度圈上移之后, 应用程序进入后台, 再回到前台时候, 进度展示圈的位置在上移之前的位置. 如下所示:
分析
当然, 想当然的分析肯定是不行的, 必须去阅读相关的代码才能找到问题所在. 通过查阅源码发现, sv中所有的更改位置的代码都是通过positionHUD:
这个方法来实现了, 在弹出键盘隐藏键盘, 应用成为活跃状态等等的通知都走这个方法. 这个方法比较长, 因为作者考虑到了各种应用场景, 各种可能会出现的情况. 此方法的功能实现思路大概是: 算出键盘的高度, 根据键盘高度算出HUD位置, 最后重置HUD位置.
出现如上提出的问题, 肯定是在应用从后台进入前台时候键盘高度没有计算好, 在源码的 Get keyboardHeight in regards to current state
这块代码中, 作者并没有对从后台进入前台时候进行特殊处理, 读取的还是键盘隐藏或者显示出来时候的通知, 如图: 为了解决这个问题, 我的处理方法就是对从后台进入前台时候进行特殊处理, 主动获取键盘的高度, 并计算出HUD的位置. 如图: 这样处理之后, 可以完美解决上述问题1. 如果谁有更好的方法或者其他观点, 欢迎留言 !
1.2 问题2
问题2是在测试问题1时候新发现的问题. 问题是这样的, 先弹出键盘, 再用代码弹出一个进度提示, 与, 先弹出进度提示, 然后弹出键盘, sv的位置不同, 第一种方式比第二种方式高了一点(模拟机上没有这个问题, 真机iOS9.2系统会出现这样的问题). 如图所示:
测试发现, 出现这个问题是因为, 通过如下图所示两种方法获取到的键盘高度不一致! 同一个键盘, 相同的状态, 我测试时候高度差了40, 不知道是什么原因. 测试发现, 键盘高度取值如果是 UIKeyboardFrameEndUserInfoKey
, 那么两个方法获取键盘高度就一致了. 就这样, 问题解决了. 其实用代码解决问题还是很简单的, 只是修改了两句源码, 但是分析问题, 发现并去解决问题这个过程却并不是这么容易. 如果谁有更好的方法或者其他观点, 欢迎留言.
2. 阅读笔记
2.1 懒加载创建view
简单的懒加载倒是没什么好说的, 但是当去造一个轮子时候, 且轮子的样式有很多种, 并且可能随时放生变化时候, 这时候使用如下所示的方法还是比较好的. 以前有自己造一个拥有很多属性可能会变化的轮子, 我的处理方法是, 在需要用到属性的位置去获取, 今天看到这个方法感觉还是懒加载这种方法比较好, 懒加载创建, 其他属性每次需要时候都动态的去获取.
- (SVProgressAnimatedView*)ringView { if(!_ringView) { _ringView = [[SVProgressAnimatedView alloc] initWithFrame:CGRectZero]; } // Update styling _ringView.strokeColor = self.foregroundColorForStyle; _ringView.strokeThickness = self.ringThickness; _ringView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius; return _ringView;}
2.2 图片渲染模式
typedef NS_ENUM(NSInteger, UIImageRenderingMode) { UIImageRenderingModeAutomatic, // Use the default rendering mode for the context where the image is used UIImageRenderingModeAlwaysOriginal, // Always draw the original image, without treating it as a template UIImageRenderingModeAlwaysTemplate, // Always draw the image as a template image, ignoring its color information} NS_ENUM_AVAILABLE_IOS(7_0);
2.3 accessibility属性
事实上, 还没有搞懂这东西怎么用.....
// Accessibility supportself.accessibilityIdentifier = @"SVProgressHUD";self.accessibilityLabel = @"SVProgressHUD";self.isAccessibilityElement = YES;
An identifier can be used to uniquely identify an element in the scripts you write using the UI Automation interfaces. Using an identifier allows you to avoid inappropriately setting or accessing an element’s accessibility label.
3. 后记
这个库在代码学到了一些 , 在程序整体结构上, 没什么东西, 总之还是有收获的.