在上一篇里我们讨论了如何扩展GMStepper库,不过还没完,我们的扩展还有BUG!
上一篇地址在: 修改CocoaPods库:GMStepper增加新功能(一)
究其原因是GMStepper中间的Label是可以左右拖动的,顾名思义,向左表示减少,向右表示增加。
我们只是将增加按钮隐藏了,但是向右拖动Label还是可以增加Value值,用户就会很愤怒,尤其是有强迫症的用户 ;)
为了填补这个BUG,我们有2种方法:
1.让用户无法向右拖动
2.向右拖动但并不会增加Value
我们分别来看看实现的难度.
1.让用户无法向右拖动
用户拖动的处理在handlePan(gesture: UIPanGestureRecognizer)方法中,我们只要在如下代码位置阻断向右的行为即可:
let slidingRight = gesture.velocity(in: label).x > 0
let slidingLeft = gesture.velocity(in: label).x < 0
// Move the label with pan
if slidingRight {
label.center.x = min(labelMaximumCenterX, label.center.x + translation.x)
} else if slidingLeft {
label.center.x = max(labelMinimumCenterX, label.center.x + translation.x)
}
不过这里如果直接退出方法的话貌似不太合理,后面还有一些收尾逻辑,因为时间关系并不想再细细阅读,所以此种思路PASS掉!!!
2.向右拖动但并不会增加Value
接下来我们再来关注第二种思路,当用户拖动Label后,最终是要更新Value的,不过在哪里更新呢???观察源代码可知,GMStepper作者为了实现拖动后的一个延时动画效果,并没有立即更新Value,而是先设置更新状态:
if panState != .HitRightEdge {
stepperState = .ShouldIncrease
//省略无关代码
}
if panState != .HitLeftEdge {
stepperState = .ShouldDecrease
//省略无关代码
}
然后在计时器回调方法中做最终更新:
func updateValue() {
if stepperState == .ShouldIncrease {
value += stepValue
} else if stepperState == .ShouldDecrease {
value -= stepValue
}
}
所以我们只需要简单的将如上代码加上判断条件即可:
if rightButton.isHidden == false{
value += stepValue
}
App运行图就不贴出来,反正已经美美的实现了我们的效果 ;)
最后要说的是:
重构不要成瘾!!! I Love This Game!!!