-drawRect方法繪制卡頓,通過CALayer繪制解決

在drawRect方法中繪制大量的線條數(shù)據(jù)時藏畅,會出現(xiàn)卡頓xianxiang寸五。無論是通過異步去移動UIBezerPath還是適當(dāng)?shù)膬?yōu)化數(shù)據(jù)量都無法解決[path stroke]花費(fèi)的時間站楚。
經(jīng)過測試通過layer的異步繪制可以方便的實(shí)現(xiàn)功能苹享。

注意:

_layer.drawsAsynchronously = YES;實(shí)現(xiàn)異步繪制
_layer.contentsScale = [UIScreen mainScreen].scale;防止模糊
_layer的代理不能是UIView逢并,如果在view中添加的layer設(shè)置代理东囚,可以定義一個中間對象作為代理
在代理方法

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx

中用UIGraphicPush(),和UIGraphicPop可以將CGContextRef上下文引用壓入當(dāng)前方法中跺嗽,這樣就可以像drawRect方法一樣直接進(jìn)行繪制工作了。

@interface ViewController ()<CALayerDelegate>
@property (nonatomic, strong) UIBezierPath *path;
@property (nonatomic, strong) CALayer *layer;
@property (nonatomic, strong) NSArray *array;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    

    
    _layer = [CALayer layer];
    _layer.delegate = self;
    _layer.drawsAsynchronously = YES;
    _layer.frame = self.view.bounds;
    _layer.contentsScale = [UIScreen mainScreen].scale;
    [self.view.layer addSublayer:_layer];
    

    [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        [self setModels:self.array];
    }];
    
}


- (NSArray *)array {
    if (!_array) {
        NSInteger count = 20000;
        NSMutableArray *arr = [NSMutableArray arrayWithCapacity:count];
        for (NSInteger i = 0; i < count; i++) {
            Model *model = [[Model alloc] init];
            model.x =  [UIScreen mainScreen].bounds.size.width / count * i;
            model.y = arc4random() % 400 + 50;
            [arr addObject:model];
        };
        _array = [arr copy];
    }
    
    return _array;
}


- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    if (_path && !_path.isEmpty) {
        NSLog(@"開始繪制==");
        CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
        CGContextSetLineWidth(ctx, 1);
        CGContextAddPath(ctx, _path.CGPath);
        CGContextStrokePath(ctx);
        NSLog(@"結(jié)束繪制");
    }
}

- (void)setModels:(NSArray *)models {
    NSLog(@"設(shè)置了model");
    _path = [UIBezierPath bezierPath];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (NSInteger i = 0; i < models.count; i++) {
            Model *mod = [models objectAtIndex:i];
            if (i == 0) {
                [self.path moveToPoint:CGPointMake(mod.x, mod.y)];
            }
            else {
                [self.path addLineToPoint:CGPointMake(mod.x, mod.y)];
            }
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.layer setNeedsDisplay];
        });
    });
}

- (void)dealloc {
    self.layer.delegate = nil;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末页藻,一起剝皮案震驚了整個濱河市桨嫁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌份帐,老刑警劉巖璃吧,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異废境,居然都是意外死亡畜挨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門噩凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巴元,“玉大人,你說我怎么就攤上這事驮宴〈伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵幻赚,是天一觀的道長禀忆。 經(jīng)常有香客問我,道長落恼,這世上最難降的妖魔是什么箩退? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮佳谦,結(jié)果婚禮上戴涝,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好啥刻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布奸鸯。 她就那樣靜靜地躺著,像睡著了一般可帽。 火紅的嫁衣襯著肌膚如雪娄涩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天映跟,我揣著相機(jī)與錄音蓄拣,去河邊找鬼。 笑死努隙,一個胖子當(dāng)著我的面吹牛球恤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荸镊,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咽斧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躬存?” 一聲冷哼從身側(cè)響起张惹,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎优构,沒想到半個月后诵叁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钦椭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碑诉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪腔。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖进栽,靈堂內(nèi)的尸體忽然破棺而出德挣,到底是詐尸還是另有隱情,我是刑警寧澤快毛,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布格嗅,位于F島的核電站,受9級特大地震影響唠帝,放射性物質(zhì)發(fā)生泄漏屯掖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一襟衰、第九天 我趴在偏房一處隱蔽的房頂上張望贴铜。 院中可真熱鬧,春花似錦、人聲如沸绍坝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轩褐。三九已至椎咧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間把介,已是汗流浹背邑退。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劳澄,地道東北人地技。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像秒拔,于是被迫代替她去往敵國和親莫矗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果砂缩,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜作谚,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,485評論 6 30
  • 1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi閱讀 5,148評論 3 23
  • 在iOS中隨處都可以看到絢麗的動畫效果庵芭,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜妹懒,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,110評論 5 13
  • 轉(zhuǎn)載:http://www.reibang.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,196評論 0 13
  • 人在國外双吆,這次第三第四次作業(yè)比較倉促眨唬,老師同學(xué)多見諒。 在你的行業(yè)里面好乐,選擇一家規(guī)呢腋停化擴(kuò)張的公司,分析它的發(fā)展路徑...
    roger爸閱讀 248評論 0 0