说是两个问题, 但我不知道算不算是问题, 至少我感受这影响到了用户体验.app
我测试时候发现, 当界面正在展现进度条, 这时候弹出了键盘, 进度展现控件会自动上移一段距离, 键盘隐藏, 进度展现会恢复到原来的位置. 可是, 在键盘显示, 进度圈上移以后, 应用程序进入后台, 再回到前台时候, 进度展现圈的位置在上移以前的位置. 以下所示:ide
分析测试
固然, 想固然的分析确定是不行的, 必须去阅读相关的代码才能找到问题所在. 经过查阅源码发现, sv中全部的更改位置的代码都是经过positionHUD:
这个方法来实现了, 在弹出键盘隐藏键盘, 应用成为活跃状态等等的通知都走这个方法. 这个方法比较长, 由于做者考虑到了各类应用场景, 各类可能会出现的状况. 此方法的功能实现思路大概是: 算出键盘的高度, 根据键盘高度算出HUD位置, 最后重置HUD位置.code
出现如上提出的问题, 确定是在应用从后台进入前台时候键盘高度没有计算好, 在源码的 Get keyboardHeight in regards to current state
这块代码中, 做者并无对从后台进入前台时候进行特殊处理, 读取的仍是键盘隐藏或者显示出来时候的通知, 如图: 为了解决这个问题, 个人处理方法就是对从后台进入前台时候进行特殊处理, 主动获取键盘的高度, 并计算出HUD的位置. 如图:
这样处理以后, 能够完美解决上述问题1. 若是谁有更好的方法或者其余观点, 欢迎留言 !orm
问题2是在测试问题1时候新发现的问题. 问题是这样的, 先弹出键盘, 再用代码弹出一个进度提示, 与, 先弹出进度提示, 而后弹出键盘, sv的位置不一样, 第一种方式比第二种方式高了一点(模拟机上没有这个问题, 真机iOS9.2系统会出现这样的问题). 如图所示:图片
测试发现, 出现这个问题是由于, 经过以下图所示两种方法获取到的键盘高度不一致! 同一个键盘, 相同的状态, 我测试时候高度差了40, 不知道是什么缘由. 测试发现, 键盘高度取值若是是
UIKeyboardFrameEndUserInfoKey
, 那么两个方法获取键盘高度就一致了. 就这样, 问题解决了. 其实用代码解决问题仍是很简单的, 只是修改了两句源码, 可是分析问题, 发现并去解决问题这个过程却并非这么容易. 若是谁有更好的方法或者其余观点, 欢迎留言.ip
简单的懒加载却是没什么好说的, 可是当去造一个轮子时候, 且轮子的样式有不少种, 而且可能随时放生变化时候, 这时候使用以下所示的方法仍是比较好的. 之前有本身造一个拥有不少属性可能会变化的轮子, 个人处理方法是, 在须要用到属性的位置去获取, 今天看到这个方法感受仍是懒加载这种方法比较好, 懒加载建立, 其余属性每次须要时候都动态的去获取.element
- (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; }
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);
事实上, 尚未搞懂这东西怎么用.....源码
// Accessibility support self.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.it
这个库在代码学到了一些 , 在程序总体结构上, 没什么东西, 总之仍是有收获的.