亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS仿擦玻璃效果的實現方法

2020-07-26 03:08:48
字體:
來源:轉載
供稿:網友

照例先看下效果圖

實現思路

動手前先想了下思路,就是利用母雞哥講的涂鴉 + 設置layer的mask的方式,這樣做可以說是非常簡單了。然后就用了半下午的時間寫完了,效果基本和大神寫得那個一樣,而且對比了下代碼量,我寫得真是簡單明了呀,用了不到大神代碼量一半的代碼就完成了同樣的功能,心情愉悅。然后我又跑了大神的應用看了看cpu利用率(我用5s跑的),大約最高保持在百分這十幾,感覺有點高但也可以,再跑我自己寫得,令我大吃了一驚,隨便劃幾下就百分之40+了,這么個小東西耗這么多cpu那這也太low了。。。

bug測試及解決

經過測試,發現是母雞哥講的涂鴉有性能問題,雖然代碼簡單,思路清晰,但是隨著觸摸屏幕的點不斷增加,整個繪制復雜度也是呈指數上升,導致的結果就是耗cpu非常嚴重。所以關于繪制圖片我不得不再想其它的方法實現。但是我冥想了一天時間也沒有找到好的方法降低繪制的復雜度(除了大神的那個方法),當然最后的解決方法也非常簡單了,沒錯,就是copy大神的方法。

下面著重介紹下大神的解決涂鴉cpu消耗問題方法(這里是重點):

圖形上下文:不再用layer的默認的圖形上下文了(也就是在drawRect方法里面用UIGraphicsGetCurrentContext()獲取的),而是自己創建一個全局的bitmap上下文

 self.imageContext = CGBitmapContextCreate(0, frame.size.width, frame.size.height, 8, frame.size.width * 4, self.colorSpace, kCGImageAlphaPremultipliedLast); CGContextSetStrokeColorWithColor(self.imageContext,[UIColor redColor].CGColor); CGContextSetFillColorWithColor(self.imageContext, [UIColor redColor].CGColor); CGContextTranslateCTM(self.imageContext, 0.0f, self.bounds.size.height); CGContextScaleCTM(self.imageContext, 1.0f, -1.0f);

在觸摸屏幕的時候(touchesBegan、touchesMoved等方法),根據觸摸的位置,每兩個點之間連線,繪制到上面建立的圖形上下文當中,這樣就是隨著觸摸屏幕,隨著往圖形上下文繪制,不會把之前已經繪制的再重新添加繪制,解決了性能消耗過高的問題。

#pragma mark - touch- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch* touch = [touches anyObject];  [self reCreateImageWithTouchDict:@{@"touch":touch, @"lineWidth":@(touch.majorRadius)}];}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch* touch = [touches anyObject];  [self reCreateImageWithTouchDict:@{@"touch":touch, @"lineWidth":@(touch.majorRadius)}];}- (UIImage *)reCreateImageWithTouchDict:(NSDictionary *)touchDict{ UITouch* touch = touchDict[@"touch"]; CGFloat lineWidth = [touchDict[@"lineWidth"] floatValue] * 0.5; if (lineWidth < 1.0) {  lineWidth = 10; }  if (touch) {   CGPoint point = [touch locationInView:touch.view];  if (touch.phase == UITouchPhaseBegan) {   CGRect rect = CGRectMake(point.x - lineWidth, point.y - lineWidth, lineWidth*2, lineWidth*2);   CGContextAddEllipseInRect(self.imageContext, rect);   CGContextFillPath(self.imageContext);   [self.points removeAllObjects];   [self.points addObject:[NSValue valueWithCGPoint:point]];   }else if (touch.phase == UITouchPhaseMoved){   [self.points addObject:[NSValue valueWithCGPoint:point]];   if (self.points.count > 2) {    CGContextSetLineCap(self.imageContext, kCGLineCapRound);    CGContextSetLineWidth(self.imageContext, 2 * lineWidth);    do{     CGPoint point0 = [(NSValue *)self.points[0] CGPointValue];     CGPoint point1 = [(NSValue *)self.points[1] CGPointValue];     CGContextMoveToPoint(self.imageContext, point0.x, point0.y);     CGContextAddLineToPoint(self.imageContext, point1.x, point1.y);     [self.points removeObjectAtIndex:0];    }while (self.points.count > 2);     }  }    CGContextStrokePath(self.imageContext); }  CGImageRef cgImage = CGBitmapContextCreateImage(self.imageContext); UIImage *image = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return image;}

最后實現

最后設置mask就非常簡單了,設置我們將要顯示的圖片(那張清晰的)的layer的mask為上面通過繪制生成的image的layer,這樣只有繪制過的位置才能看到將要顯示的圖片,功能就完成了,我感覺利用這個小技巧可以做很多有趣的東西(類似刮獎等)

 CALayer *mask = [CALayer layer]; mask.contents = (id)image.CGImage; mask.anchorPoint = CGPointZero; mask.frame = self.bounds; self.imageView.layer.mask = mask; self.imageView.layer.masksToBounds = YES;

最后

別忘記釋放相關內存

- (void)dealloc{ if (_imageContext != NULL) {  CFRelease(_imageContext); } if (_colorSpace != NULL) {  CFRelease(_colorSpace); }}

demo地址:https://github.com/yuchuanfeng/CFScratchViewDemo

總結

以上就是利用iOS模仿擦玻璃效果的全部內容,感興趣的朋友們可以自己動手操作下,這樣才能更利于理解和學習,希望這篇文章對各位iOS開發者們能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕国产精品| 51精品国产黑色丝袜高跟鞋| 久久久久久久久久久免费精品| 精品视频一区在线视频| 91精品视频观看| 91夜夜未满十八勿入爽爽影院| 亚洲精品成人免费| 色婷婷综合成人av| 高清欧美性猛交xxxx| 欧洲亚洲免费在线| 欧美电影在线观看| 亚洲第一二三四五区| 自拍偷拍亚洲在线| 亚洲偷熟乱区亚洲香蕉av| 欧美理论电影在线播放| 亚洲第一偷拍网| 亚洲丝袜一区在线| 91精品国产电影| 欧美性猛交xxxx| 中文字幕av一区二区三区谷原希美| 国模精品一区二区三区色天香| 欧美最顶级的aⅴ艳星| 国产狼人综合免费视频| 国语自产精品视频在免费| 欧美精品久久久久久久免费观看| 欧美俄罗斯性视频| 国产午夜精品全部视频播放| 日韩中文字幕欧美| 亚洲奶大毛多的老太婆| 国产91|九色| 欧美日韩加勒比精品一区| 中文字幕亚洲二区| 亚洲国内高清视频| 久久999免费视频| 欧美肥老妇视频| 日本午夜精品理论片a级appf发布| 91亚洲精品在线| 欧美精品18videos性欧| 国产精品久久久久77777| 国产精品日韩一区| 色综合影院在线| 欧美自拍大量在线观看| 亚洲精品国产拍免费91在线| 亚洲欧美在线第一页| 久热99视频在线观看| 亚洲热线99精品视频| 日韩不卡中文字幕| 91国偷自产一区二区三区的观看方式| 成人中心免费视频| 最好看的2019年中文视频| 日韩中文字幕国产精品| 黄色成人在线免费| 亚洲欧美另类人妖| 亚洲国产精品成人va在线观看| 91理论片午午论夜理片久久| 欧美性猛交xxxxx水多| xxav国产精品美女主播| 久久久国产精品亚洲一区| 欧美日韩视频免费播放| 4438全国亚洲精品在线观看视频| 26uuu久久噜噜噜噜| 91色中文字幕| 久久99国产精品久久久久久久久| 日韩在线视频免费观看| 日韩免费av一区二区| 中文字幕亚洲一区二区三区五十路| 中文字幕一精品亚洲无线一区| 美女撒尿一区二区三区| 国产精品视频一区二区三区四| 欧美日韩成人黄色| 欧美激情在线播放| 久久久久久久久久国产| 欧美性色视频在线| 久久久久久97| 亚洲天堂av在线播放| 亚洲精品欧美日韩| 国产精品mp4| 黑人与娇小精品av专区| 亚洲精品91美女久久久久久久| 两个人的视频www国产精品| 日韩av在线导航| 久久久免费av| 尤物tv国产一区| 日韩在线观看高清| 亚洲人午夜色婷婷| 精品日本美女福利在线观看| 日本午夜人人精品| 国产精品网红直播| 欧美成人亚洲成人| 国产不卡精品视男人的天堂| 伊人久久久久久久久久| 精品国产91久久久| 91精品久久久久久久久久久久久| 国产精自产拍久久久久久| 米奇精品一区二区三区在线观看| 日韩电影免费在线观看中文字幕| 97香蕉超级碰碰久久免费软件| 综合av色偷偷网| 亚洲黄色av网站| 国产精品久久久久国产a级| 亚洲精品乱码久久久久久按摩观| 欧洲中文字幕国产精品| 日韩动漫免费观看电视剧高清| 69久久夜色精品国产69乱青草| 欧美激情国产高清| 午夜精品福利在线观看| 国产亚洲精品一区二区| 欧美香蕉大胸在线视频观看| 国产一区二区三区在线观看视频| 精品国内亚洲在观看18黄| 国产在线视频不卡| 亚洲四色影视在线观看| 久久99久久99精品中文字幕| 国产中文日韩欧美| 91精品美女在线| 日韩欧美在线视频| 国产91精品在线播放| 亚洲性日韩精品一区二区| 91精品国产99久久久久久| 日韩av男人的天堂| 欧美成人精品三级在线观看| 日韩视频在线观看免费| 久久天天躁狠狠躁夜夜躁2014| 日韩中文字幕在线看| 国产一区二区丝袜高跟鞋图片| 欧美性猛交xxxx免费看久久久| 在线精品高清中文字幕| 亚洲精品国产免费| 性欧美xxxx| 欧美激情精品久久久久久蜜臀| 欧美日韩在线观看视频小说| 国产福利精品在线| 国产精品99一区| 国产精品久久久久久网站| 亚洲欧美精品一区| 国产欧美精品xxxx另类| 亚洲最大成人免费视频| 狠狠做深爱婷婷久久综合一区| 岛国av一区二区在线在线观看| 成人看片人aa| 精品网站999www| 亚洲女性裸体视频| 日韩av在线免费播放| 在线观看久久av| 亚洲欧美日韩综合| 性欧美xxxx视频在线观看| 黄色一区二区在线| 久久精品国产亚洲| 国产69久久精品成人| 在线免费看av不卡| 亚洲一区二区国产| 91av在线国产| 国产精品专区h在线观看| 亚洲精品电影网在线观看| 欧美第一页在线| 国产精品99免视看9| 亚洲第一男人av| 久久天天躁狠狠躁老女人| 国产精品视频公开费视频| 欧美国产日韩免费| 欧美色播在线播放| 96精品久久久久中文字幕| 日韩女优人人人人射在线视频| 欧美精品性视频|