IOS开发自定义滑杆滑动不灵敏及卡顿问题调研及解决方案

iOS实际开发过程中有时会遇到自定义的滑杆不灵敏或者卡顿问题,造成原因是什么呢?
1、组件本身问题

1)、首先确认是不是控件本身的问题,注释掉valueChanged时执行的代码,观察滑杆的滑动是否灵敏;
2)、控件本身的问题,自定义的滑杆一般有三种方式:
a、在UISlider的基础上自定义
b、继承UIControl重新自定义一个滑杆
c、通过手势的拖拽来自定义一个滑杆
b、c方案,控件的灵敏度取决于点触区域的范围,一般建议a方案,系统组件的封装比较流畅

2、卡顿问题,滑动过程中执行了耗时操作

一般来说,执行过程中有耗时操作,不建议使用滑杆的方式来操作;正确的解决方案应该是更换需求(说服PM),可改为点击button切换等等,或者优化算法去除耗时里面的耗时操作。

如何来优化这一缺点呢?
1、方案选择:处理过程中有避免不掉的耗时操作时,UI上尽量不要采用滑杆的调节方式;不提倡异步处理,这样会使滑杆变化与实际处理不同步;
2、采用的丢帧处理,就是滑动比较快时一些回调不做处理。
如下面代码块

    NSLog(@"templateSlider1111 : %.3f", value);
    CGFloat interval = 0.01;
    if ([self isFastClickAction:interval])
    {
        return;
    }
    NSLog(@"templateSlider2222 : %.3f", value);
- (BOOL) isFastClickAction:(NSTimeInterval)interval{
    if (_lastClickDate == nil) {
        _lastClickDate = [NSDate date];
        return NO;
    }
    NSDate *currentDate = (NSDate *)[NSDate date];
    NSTimeInterval intervalFromLast = [currentDate timeIntervalSinceDate:_lastClickDate];
    NSLog(@"click intervalFromLast:%f,interval:%f",intervalFromLast,interval);
    if ( intervalFromLast < 0 ) {
        return NO;
    }
    if(intervalFromLast < interval){
        NSLog(@"click too fast now");
        return YES;
    }
    _lastClickDate = currentDate;
    return NO;
}

为防止最后一次回调是实现的,我们也必须进行最后一次的"补帧操作",在UISlider范围较大变动时,最后会执行UIControlEventTouchUpInside,通过监听这个事件来进行"补帧操作"。(UISlider小范围变动时‘UIControlEventTouchUpInside’可能不执行,当然此时滑杆的速度较慢,所以不需要补帧)

当然,丢帧处理的方式只能适用于耗时操作较小时,下面是针对UISlider的快速滑动操作,不同时间间隔下的丢帧情况(数据源于本人手速):
测试环境:
a、iPhone 6
b、个人普通快速滑动
c、滑杆长度320
下面为挑选的0.01s、0.05s、0.1s的丢帧情况,其他测试结果在此省略。
通过数据测试,可以得出以下结论:
1、耗时操作的执行时间高于设置的丢帧间隔,丢帧处理是不起作用的。
2、快速滑动时,每次滑杆valueChanged的处理间隔时间约0.005s ~0.02s,帧变跨度约2%;
3、丢帧处理的情况:0.01s的丢帧间隔,速度较快时偶尔会有一帧的丢失,跳帧跨度约5%;0.05s的丢帧间隔,每周期会有3帧丢失,帧变跨度20% ~ 30%;0.1s的丢帧间隔,每周期会有4~7帧丢失,帧变跨度40% ~ 60%;较高的帧变跨度会对我们刷新页面渐变变得跳动,所以,为保证刷新页面的渐变效果,一般的丢帧处理应该保证丢帧间隔在0.05s以内。

iPhone6 间隔为0.01s

2018-03-16 23:24:30.656984+0800 VivaLite[3234:625532] templateSlider2222 : 0.716
2018-03-16 23:24:30.671289+0800 VivaLite[3234:625532] templateSlider1111 : 0.633
2018-03-16 23:24:30.671405+0800 VivaLite[3234:625532] templateSlider2222 : 0.633
2018-03-16 23:24:30.693179+0800 VivaLite[3234:625532] templateSlider1111 : 0.547
2018-03-16 23:24:30.693286+0800 VivaLite[3234:625532] templateSlider2222 : 0.547
2018-03-16 23:24:30.704099+0800 VivaLite[3234:625532] templateSlider1111 : 0.465
2018-03-16 23:24:30.704215+0800 VivaLite[3234:625532] templateSlider2222 : 0.465
2018-03-16 23:24:30.726855+0800 VivaLite[3234:625532] templateSlider1111 : 0.400
2018-03-16 23:24:30.727765+0800 VivaLite[3234:625532] templateSlider2222 : 0.400
2018-03-16 23:24:30.737945+0800 VivaLite[3234:625532] templateSlider1111 : 0.341
2018-03-16 23:24:30.738882+0800 VivaLite[3234:625532] templateSlider2222 : 0.341
2018-03-16 23:24:30.762311+0800 VivaLite[3234:625532] templateSlider1111 : 0.301
2018-03-16 23:24:30.762470+0800 VivaLite[3234:625532] templateSlider2222 : 0.301
2018-03-16 23:24:30.771372+0800 VivaLite[3234:625532] templateSlider1111 : 0.272
2018-03-16 23:24:30.771598+0800 VivaLite[3234:625532] click too fast now
2018-03-16 23:24:30.822295+0800 VivaLite[3234:625532] templateSlider1111 : 0.252
2018-03-16 23:24:30.822398+0800 VivaLite[3234:625532] templateSlider2222 : 0.252
2018-03-16 23:24:30.842367+0800 VivaLite[3234:625532] templateSlider1111 : 0.259
2018-03-16 23:24:30.842496+0800 VivaLite[3234:625532] templateSlider2222 : 0.259
2018-03-16 23:24:30.894287+0800 VivaLite[3234:625532] templateSlider1111 : 0.402
2018-03-16 23:24:30.904978+0800 VivaLite[3234:625532] templateSlider2222 : 0.402
2018-03-16 23:24:30.907098+0800 VivaLite[3234:625532] templateSlider1111 : 0.468
2018-03-16 23:24:30.907244+0800 VivaLite[3234:625532] click too fast now
2018-03-16 23:24:30.927183+0800 VivaLite[3234:625532] templateSlider1111 : 0.548
2018-03-16 23:24:30.927888+0800 VivaLite[3234:625532] templateSlider2222 : 0.548
2018-03-16 23:24:30.937072+0800 VivaLite[3234:625532] templateSlider1111 : 0.621
2018-03-16 23:24:30.937260+0800 VivaLite[3234:625532] click too fast now
2018-03-16 23:24:30.954610+0800 VivaLite[3234:625532] templateSlider1111 : 0.686
2018-03-16 23:24:30.954739+0800 VivaLite[3234:625532] templateSlider2222 : 0.686
2018-03-16 23:24:30.974871+0800 VivaLite[3234:625532] templateSlider1111 : 0.746
2018-03-16 23:24:30.976635+0800 VivaLite[3234:625532] templateSlider2222 : 0.746
2018-03-16 23:24:30.991061+0800 VivaLite[3234:625532] templateSlider1111 : 0.794
2018-03-16 23:24:30.991208+0800 VivaLite[3234:625532] templateSlider2222 : 0.794
2018-03-16 23:24:31.014046+0800 VivaLite[3234:625532] templateSlider1111 : 0.836
2018-03-16 23:24:31.014511+0800 VivaLite[3234:625532] templateSlider2222 : 0.836
2018-03-16 23:24:31.029180+0800 VivaLite[3234:625532] templateSlider1111 : 0.869
2018-03-16 23:24:31.029293+0800 VivaLite[3234:625532] templateSlider2222 : 0.869
2018-03-16 23:24:31.037419+0800 VivaLite[3234:625532] templateSlider1111 : 0.895
2018-03-16 23:24:31.037589+0800 VivaLite[3234:625532] click too fast now
2018-03-16 23:24:31.056255+0800 VivaLite[3234:625532] templateSlider1111 : 0.917
2018-03-16 23:24:31.056371+0800 VivaLite[3234:625532] templateSlider2222 : 0.917
2018-03-16 23:24:31.071071+0800 VivaLite[3234:625532] templateSlider1111 : 0.927
2018-03-16 23:24:31.071170+0800 VivaLite[3234:625532] templateSlider2222 : 0.927
2018-03-16 23:24:31.093576+0800 VivaLite[3234:625532] templateSlider1111 : 0.934
2018-03-16 23:24:31.093717+0800 VivaLite[3234:625532] templateSlider2222 : 0.934
2018-03-16 23:24:31.136368+0800 VivaLite[3234:625532] templateSlider1111 : 0.919
2018-03-16 23:24:31.136477+0800 VivaLite[3234:625532] templateSlider2222 : 0.919
2018-03-16 23:24:31.158405+0800 VivaLite[3234:625532] templateSlider1111 : 0.889
2018-03-16 23:24:31.158589+0800 VivaLite[3234:625532] templateSlider2222 : 0.889
2018-03-16 23:24:31.172826+0800 VivaLite[3234:625532] templateSlider1111 : 0.862
2018-03-16 23:24:31.173014+0800 VivaLite[3234:625532] templateSlider2222 : 0.862
2018-03-16 23:24:31.204725+0800 VivaLite[3234:625532] templateSlider1111 : 0.839
2018-03-16 23:24:31.204876+0800 VivaLite[3234:625532] templateSlider2222 : 0.839
2018-03-16 23:24:31.215004+0800 VivaLite[3234:625532] templateSlider1111 : 0.832
2018-03-16 23:24:31.215506+0800 VivaLite[3234:625532] templateSlider2222 : 0.832

iPhone 6,间隔为0.05

2018-03-19 21:00:02.957876+0800 VivaLite[7297:1695311] templateSlider2222 : 0.189
2018-03-19 21:00:02.975809+0800 VivaLite[7297:1695311] templateSlider1111 : 0.209
2018-03-19 21:00:02.975954+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:02.990463+0800 VivaLite[7297:1695311] templateSlider1111 : 0.228
2018-03-19 21:00:02.990665+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.006789+0800 VivaLite[7297:1695311] templateSlider1111 : 0.248
2018-03-19 21:00:03.006998+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.023588+0800 VivaLite[7297:1695311] templateSlider1111 : 0.269
2018-03-19 21:00:03.023804+0800 VivaLite[7297:1695311] templateSlider2222 : 0.269
2018-03-19 21:00:03.037670+0800 VivaLite[7297:1695311] templateSlider1111 : 0.292
2018-03-19 21:00:03.037833+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.055167+0800 VivaLite[7297:1695311] templateSlider1111 : 0.314
2018-03-19 21:00:03.055330+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.073753+0800 VivaLite[7297:1695311] templateSlider1111 : 0.342
2018-03-19 21:00:03.073972+0800 VivaLite[7297:1695311] templateSlider2222 : 0.342
2018-03-19 21:00:03.090166+0800 VivaLite[7297:1695311] templateSlider1111 : 0.370
2018-03-19 21:00:03.090385+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.104700+0800 VivaLite[7297:1695311] templateSlider1111 : 0.399
2018-03-19 21:00:03.105188+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.121126+0800 VivaLite[7297:1695311] templateSlider1111 : 0.427
2018-03-19 21:00:03.121283+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.139574+0800 VivaLite[7297:1695311] templateSlider1111 : 0.452
2018-03-19 21:00:03.139784+0800 VivaLite[7297:1695311] templateSlider2222 : 0.452
2018-03-19 21:00:03.157042+0800 VivaLite[7297:1695311] templateSlider1111 : 0.473
2018-03-19 21:00:03.157255+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.173506+0800 VivaLite[7297:1695311] templateSlider1111 : 0.495
2018-03-19 21:00:03.173713+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.190615+0800 VivaLite[7297:1695311] templateSlider1111 : 0.517
2018-03-19 21:00:03.190844+0800 VivaLite[7297:1695311] templateSlider2222 : 0.517
2018-03-19 21:00:03.204320+0800 VivaLite[7297:1695311] templateSlider1111 : 0.548
2018-03-19 21:00:03.204850+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.223696+0800 VivaLite[7297:1695311] templateSlider1111 : 0.578
2018-03-19 21:00:03.223902+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.239675+0800 VivaLite[7297:1695311] templateSlider1111 : 0.611
2018-03-19 21:00:03.240310+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.255625+0800 VivaLite[7297:1695311] templateSlider1111 : 0.641
2018-03-19 21:00:03.255774+0800 VivaLite[7297:1695311] templateSlider2222 : 0.641
2018-03-19 21:00:03.270745+0800 VivaLite[7297:1695311] templateSlider1111 : 0.669
2018-03-19 21:00:03.270859+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.288238+0800 VivaLite[7297:1695311] templateSlider1111 : 0.691
2018-03-19 21:00:03.288352+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.304407+0800 VivaLite[7297:1695311] templateSlider1111 : 0.714
2018-03-19 21:00:03.304618+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.320181+0800 VivaLite[7297:1695311] templateSlider1111 : 0.736
2018-03-19 21:00:03.320342+0800 VivaLite[7297:1695311] templateSlider2222 : 0.736
2018-03-19 21:00:03.337332+0800 VivaLite[7297:1695311] templateSlider1111 : 0.752
2018-03-19 21:00:03.337417+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.353651+0800 VivaLite[7297:1695311] templateSlider1111 : 0.766
2018-03-19 21:00:03.353742+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.371080+0800 VivaLite[7297:1695311] templateSlider1111 : 0.772
2018-03-19 21:00:03.371196+0800 VivaLite[7297:1695311] templateSlider2222 : 0.772
2018-03-19 21:00:03.390947+0800 VivaLite[7297:1695311] templateSlider1111 : 0.777
2018-03-19 21:00:03.391106+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.406980+0800 VivaLite[7297:1695311] templateSlider1111 : 0.779
2018-03-19 21:00:03.407097+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.420120+0800 VivaLite[7297:1695311] templateSlider1111 : 0.781
2018-03-19 21:00:03.420216+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.453253+0800 VivaLite[7297:1695311] templateSlider1111 : 0.781
2018-03-19 21:00:03.453353+0800 VivaLite[7297:1695311] templateSlider2222 : 0.781
2018-03-19 21:00:03.470227+0800 VivaLite[7297:1695311] templateSlider1111 : 0.781
2018-03-19 21:00:03.470324+0800 VivaLite[7297:1695311] click too fast now
2018-03-19 21:00:03.487173+0800 VivaLite[7297:1695311] templateSlider1111 : 0.772

iPhone 6,间隔0.1s

2018-03-19 21:07:43.322574+0800 VivaLite[7318:1698461] templateSlider1111 : 0.130
2018-03-19 21:07:43.322943+0800 VivaLite[7318:1698461] templateSlider2222 : 0.130
2018-03-19 21:07:43.339668+0800 VivaLite[7318:1698461] templateSlider1111 : 0.128
2018-03-19 21:07:43.339841+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.406331+0800 VivaLite[7318:1698461] templateSlider1111 : 0.128
2018-03-19 21:07:43.406535+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.424621+0800 VivaLite[7318:1698461] templateSlider1111 : 0.131
2018-03-19 21:07:43.425226+0800 VivaLite[7318:1698461] templateSlider2222 : 0.131
2018-03-19 21:07:43.443287+0800 VivaLite[7318:1698461] templateSlider1111 : 0.146
2018-03-19 21:07:43.443509+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.458177+0800 VivaLite[7318:1698461] templateSlider1111 : 0.169
2018-03-19 21:07:43.458390+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.474857+0800 VivaLite[7318:1698461] templateSlider1111 : 0.199
2018-03-19 21:07:43.475393+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.493027+0800 VivaLite[7318:1698461] templateSlider1111 : 0.238
2018-03-19 21:07:43.493229+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.507813+0800 VivaLite[7318:1698461] templateSlider1111 : 0.284
2018-03-19 21:07:43.508290+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.525029+0800 VivaLite[7318:1698461] templateSlider1111 : 0.339
2018-03-19 21:07:43.525246+0800 VivaLite[7318:1698461] templateSlider2222 : 0.339
2018-03-19 21:07:43.542272+0800 VivaLite[7318:1698461] templateSlider1111 : 0.395
2018-03-19 21:07:43.542493+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.559304+0800 VivaLite[7318:1698461] templateSlider1111 : 0.453
2018-03-19 21:07:43.559520+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.573798+0800 VivaLite[7318:1698461] templateSlider1111 : 0.512
2018-03-19 21:07:43.574006+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.591655+0800 VivaLite[7318:1698461] templateSlider1111 : 0.570
2018-03-19 21:07:43.591867+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.609444+0800 VivaLite[7318:1698461] templateSlider1111 : 0.628
2018-03-19 21:07:43.609665+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.622374+0800 VivaLite[7318:1698461] templateSlider1111 : 0.681
2018-03-19 21:07:43.622571+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.639283+0800 VivaLite[7318:1698461] templateSlider1111 : 0.724
2018-03-19 21:07:43.639452+0800 VivaLite[7318:1698461] templateSlider2222 : 0.724
2018-03-19 21:07:43.658281+0800 VivaLite[7318:1698461] templateSlider1111 : 0.766
2018-03-19 21:07:43.658491+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.673879+0800 VivaLite[7318:1698461] templateSlider1111 : 0.801
2018-03-19 21:07:43.674044+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.689453+0800 VivaLite[7318:1698461] templateSlider1111 : 0.834
2018-03-19 21:07:43.689671+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.706020+0800 VivaLite[7318:1698461] templateSlider1111 : 0.864
2018-03-19 21:07:43.706178+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.723893+0800 VivaLite[7318:1698461] templateSlider1111 : 0.885
2018-03-19 21:07:43.724102+0800 VivaLite[7318:1698461] click too fast now
2018-03-19 21:07:43.742062+0800 VivaLite[7318:1698461] templateSlider1111 : 0.905
2018-03-19 21:07:43.742286+0800 VivaLite[7318:1698461] templateSlider2222 : 0.905

你可能感兴趣的:(IOS开发自定义滑杆滑动不灵敏及卡顿问题调研及解决方案)