欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS仿擦玻璃效果的實(shí)現(xiàn)方法

 更新時(shí)間:2016年10月13日 11:19:11   作者:萌小菜  
最近在網(wǎng)上看到一個(gè)博客分享的這個(gè)效果很不錯(cuò),就拿下來看看,結(jié)果看了好幾遍也沒完全看懂,再結(jié)合自己之前學(xué)的東西感覺不用這么復(fù)雜也能實(shí)現(xiàn)同樣的效果,于是就開始動(dòng)手了?,F(xiàn)在將實(shí)現(xiàn)的步驟和示例代碼分享給大家,有需要的朋友們可以參考借鑒。

照例先看下效果圖

實(shí)現(xiàn)思路

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

bug測試及解決

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

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

圖形上下文:不再用layer的默認(rèn)的圖形上下文了(也就是在drawRect方法里面用UIGraphicsGetCurrentContext()獲取的),而是自己創(chuàng)建一個(gè)全局的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);

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

#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;
}

最后實(shí)現(xiàn)

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

 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;

最后

別忘記釋放相關(guān)內(nèi)存

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

 if (_colorSpace != NULL) {
  CFRelease(_colorSpace);
 }
}

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

總結(jié)

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

相關(guān)文章

  • ios 實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式

    ios 實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式

    這篇文章主要介紹了ios實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,第一種方式使用NSTimer來實(shí)現(xiàn),第二種方式使用GCD來實(shí)現(xiàn)。具體內(nèi)容詳情大家參考下本文
    2017-01-01
  • Swift 去除 TableView 多余的空Cell中的橫線的方法

    Swift 去除 TableView 多余的空Cell中的橫線的方法

    這篇文章主要介紹了Swift 去除 TableView 多余的空Cell中的橫線的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • iOS仿擦玻璃效果的實(shí)現(xiàn)方法

    iOS仿擦玻璃效果的實(shí)現(xiàn)方法

    最近在網(wǎng)上看到一個(gè)博客分享的這個(gè)效果很不錯(cuò),就拿下來看看,結(jié)果看了好幾遍也沒完全看懂,再結(jié)合自己之前學(xué)的東西感覺不用這么復(fù)雜也能實(shí)現(xiàn)同樣的效果,于是就開始動(dòng)手了?,F(xiàn)在將實(shí)現(xiàn)的步驟和示例代碼分享給大家,有需要的朋友們可以參考借鑒。
    2016-10-10
  • 談?wù)勚谱鱥OS Ad-Hoc測試應(yīng)用

    談?wù)勚谱鱥OS Ad-Hoc測試應(yīng)用

    這篇文章主要介紹了談?wù)勚谱鱥OS Ad-Hoc測試應(yīng)用,AD-HOC測試是指隨機(jī)測試,這種測試的特點(diǎn)是無特定的測試用例,有興趣的可以了解一下。
    2016-12-12
  • iOS倒計(jì)時(shí)的實(shí)現(xiàn)方法

    iOS倒計(jì)時(shí)的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了iOS倒計(jì)時(shí)的實(shí)現(xiàn)方法,點(diǎn)擊進(jìn)行倒計(jì)時(shí)準(zhǔn)備,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 在iOS App中實(shí)現(xiàn)地理位置定位的基本方法解析

    在iOS App中實(shí)現(xiàn)地理位置定位的基本方法解析

    這篇文章主要介紹了在iOS App中實(shí)現(xiàn)地理位置定位的基本方法解析,包括獲取當(dāng)前位置和計(jì)算兩點(diǎn)間距離等基本功能的實(shí)現(xiàn),需要的朋友可以參考下
    2016-05-05
  • IOS10 隱私權(quán)限設(shè)置實(shí)例詳解

    IOS10 隱私權(quán)限設(shè)置實(shí)例詳解

    這篇文章主要介紹了IOS10 隱私權(quán)限設(shè)置實(shí)例詳解的相關(guān)資料,本文主要是介紹,在使用相機(jī)功能是遇到錯(cuò)誤,這里說明該如何解決,需要的朋友可以參考下
    2016-12-12
  • iOS逆向工程使用dumpdecrypted工具給App脫殼

    iOS逆向工程使用dumpdecrypted工具給App脫殼

    這篇文章主要介紹了iOS逆向工程使用dumpdecrypted工具給App脫殼的相關(guān)資料,本文圖文并茂給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • 圖文講解如何解決App的iOS 7頂部狀態(tài)欄適配問題

    圖文講解如何解決App的iOS 7頂部狀態(tài)欄適配問題

    至今很多iOS App還要照顧到iOS 7進(jìn)行最低的版本適配,而iOS7開始status bar的實(shí)際屏幕占用情況與iOS 6等不盡相同,這里我們就來以圖文講解如何解決App的iOS 7頂部狀態(tài)欄適配問題
    2016-06-06
  • iOS自定義UIBarButtonItem的target和action示例代碼

    iOS自定義UIBarButtonItem的target和action示例代碼

    這篇文章主要給大家介紹了關(guān)于iOS自定義UIBarButtonItem的target和action的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評論