亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

iOS中一行代碼實現(xiàn) UIView 鏤空效果

 更新時間:2018年11月22日 14:07:04   作者:雷曼同學  
這篇文章主要介紹了一行代碼實現(xiàn) UIView 鏤空效果,這是一種實現(xiàn) UIView 鏤空效果的方案,可以快速實現(xiàn)任意形狀的鏤空、文字的鏤空、帶鏤空的毛玻璃效果等。需要的朋友可以參考下

這是一種實現(xiàn) UIView 鏤空效果的方案,可以快速實現(xiàn)任意形狀的鏤空、文字的鏤空、帶鏤空的毛玻璃效果等。本質上是 UIViewmaskView 效果。

前言

首先來復習一下遮罩效果的實現(xiàn)。如果我們有一張圖片,又恰好有一個圓,當我們把圓設置為圖片的遮罩時,會得到這樣的結果。

代碼實現(xiàn)看上去像是這樣:

view.maskView = maskView;

那么問題來了,如果我們希望得到下面的結果,該怎么做呢?這看起來像是圖層的相減,即原來的圖層減去遮罩的部分。

可惜蘋果爸爸不夠貼心,沒有提供方便的接口調用。讓我們來看看可以怎么實現(xiàn)。

一、思路

我們的最終目標是,封裝出一個接口,調用方式類似于 maskView 屬性,可以很方便地對一個 UIView 做鏤空效果。

注:以下用 originView 指代需要上效果的 view ,用 maskView 指代充當遮罩的 view

目前看來,可以從兩個方向入手:

  1. 修改遮罩的繪制過程
  2. 修改 maskView 本身

方式一是指,在設置這個屬性的時候,對 originView 的視圖進行重新繪制,然后在繪制的時候,減掉 maskView 的區(qū)域。

方式二是指,當拿到 maskView 的時候,先對 maskView 本身先進行處理,將遮罩范圍取反。然后再做遮罩效果,由于遮罩的區(qū)域已經(jīng)相反,于是得到的結果也是相反的,就達到鏤空的目的。

看上去方式二比較靠譜,而且最后是調用 UIViewsetMaskView: 來實現(xiàn),還可以保留原來遮罩的一些特性。比如當修改 maskViewframe 的時候, originView 的遮罩位置也會相應改變。

二、實現(xiàn)

生成相反的遮罩圖可以分為三步。假設一開始拿到的 maskView 是下面這樣,讓我們來看下,轉換過程中遮罩圖每一步的變化。

注:為了更直觀的效果,圖片中透明的部分用灰白相間格子來表示(以下相同)。

1、將 maskView 轉化為 UIImage

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextTranslateCTM(UIGraphicsGetCurrentContext(),
           view.frame.origin.x,
           view.frame.origin.y);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

這一步拿到了 maskView 對應的 image 圖像。此時遮罩圖的大小會被同步為 originView 的大小。

2、將

UIImage 轉換為只有 alpha 通道的 CGContextRef

CGImageRef originalMaskImage = [image CGImage];
float width = CGImageGetWidth(originalMaskImage);
float height = CGImageGetHeight(originalMaskImage);
  
int strideLength = ROUND_UP(width * 1, 4);
unsigned char * alphaData = calloc(strideLength * height, sizeof(unsigned char));
CGContextRef alphaOnlyContext = CGBitmapContextCreate(alphaData,
                           width,
                           height,
                           8,
                           strideLength,
                           NULL,
                           kCGImageAlphaOnly);
  
CGContextDrawImage(alphaOnlyContext, CGRectMake(0, 0, width, height), originalMaskImage);

這時候的 alphaOnlyContext 對應的圖像是下面這樣,只保留了 alpha 通道。

3、將

CGContextRef 中的 alpha 值進行遍歷轉換

for (int y = 0; y < height; y++) {
  for (int x = 0; x < width; x++) {
    unsigned char val = alphaData[y*strideLength + x];
    val = 255 - val;
    alphaData[y*strideLength + x] = val;
  }
}
  
CGImageRef alphaMaskImage = CGBitmapContextCreateImage(alphaOnlyContext);
UIImage *result = [UIImage imageWithCGImage:alphaMaskImage];

轉換后,獲得的 result 圖像是:

于是,我們就可以用 result 愉快地進行 mask 了。

三、使用

我們可以將上述的步驟,封裝為一個方法,用 category 來實現(xiàn)。

@interface UIView (MFSubtractMask)
- (void)setSubtractMaskView:(UIView *)view;
- (UIView *)subtractMaskView;
@end

這樣調用起來就十分方便了,一行代碼搞定:

view.subtractMaskView = maskView;

四、局限性

1. subtractMaskView 不會自動刷新

我們知道,當 UIViewmaskView 的內容動態(tài)修改時,會實時反映到 UIView 中。但在本項目中, subtractMaskView 屬性會生成一張全新的圖片來作為遮罩圖,因為不會根據(jù) subtractMaskView 的內容實時來刷新視圖。如果需要更新,必須手動調用 setSubtractMaskView: 方法來重新生成遮罩圖。

2. setSubtractMaskView: 不宜被頻繁調用

setSubtractMaskView: 本質上是生成一個新的遮罩圖的過程,該過程涉及圖片像素的遍歷轉換,較為耗時,不宜頻繁調用。

綜上所述,這種方案適合只生成一次遮罩圖的場景。

 五、源碼

請到 GitHub 上查看完整代碼。

總結

以上所述是小編給大家介紹的iOS中一行代碼實現(xiàn) UIView 鏤空效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • IOS開發(fā)代碼分享之用nstimer實現(xiàn)倒計時功能

    IOS開發(fā)代碼分享之用nstimer實現(xiàn)倒計時功能

    在制作IOS項目中,我們經(jīng)常要用到倒計時功能,今天就分享下使用nstimer實現(xiàn)的倒計時功能的代碼,希望對大家能有所幫助
    2014-09-09
  • 詳解iOS11、iPhone X、Xcode9 適配指南

    詳解iOS11、iPhone X、Xcode9 適配指南

    這篇文章主要介紹了詳解iOS11、iPhone X、Xcode9 適配指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • iOS runtime forwardInvocation詳解及整理

    iOS runtime forwardInvocation詳解及整理

    這篇文章主要介紹了 iOS runtime forwardInvocation詳解及整理的相關資料,需要的朋友可以參考下
    2017-02-02
  • iOS經(jīng)驗之初始化方法中不該設置self.view的屬性淺析

    iOS經(jīng)驗之初始化方法中不該設置self.view的屬性淺析

    這篇文章主要給大家介紹了關于iOS經(jīng)驗之初始化方法中不該設置self.view的屬性的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-09-09
  • IOS中手風琴表不能移動的解決方法

    IOS中手風琴表不能移動的解決方法

    本文給大家分享的是IOS開發(fā)中遇到的一個手風琴特效無法正常工作的問題的解決方法,經(jīng)過度娘了很久才找到解決方法,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-05-05
  • iOS實現(xiàn)圓角箭頭矩形的提示框

    iOS實現(xiàn)圓角箭頭矩形的提示框

    不知道大家發(fā)現(xiàn)了沒,在現(xiàn)在的很多App中常使用圓角箭頭矩形, 如微博分組提示框, 地圖坐標顯示點等。iPad 中有 UIPopoverController 類供開發(fā)使用, iPhone中就需要開發(fā)人員定制了。那么下面這篇文中就來聊聊定制圓角箭頭矩形提示框,有需要的朋友們可以參考借鑒。
    2016-11-11
  • iOS 和 Android 哪個更利于賺錢?

    iOS 和 Android 哪個更利于賺錢?

    iOS 和 Android 哪個更利于賺錢?這篇文章為大家揭曉答案,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS開發(fā)中Swift3 監(jiān)聽UITextView文字改變的方法(三種方法)

    iOS開發(fā)中Swift3 監(jiān)聽UITextView文字改變的方法(三種方法)

    在項目中使用文本輸入框出UITextField之外還會經(jīng)常使用 UITextView ,難免會有需求監(jiān)聽UITextView文本框內文本數(shù)量.下面介紹在swift3中兩種常用方式,需要的朋友參考下吧
    2016-11-11
  • IOS給xcode工程關聯(lián)pod的實例詳解

    IOS給xcode工程關聯(lián)pod的實例詳解

    這篇文章主要介紹了IOS給xcode工程關聯(lián)pod的實例詳解的相關資料,希望大家通過本文能實現(xiàn)這樣的需求,需要的朋友可以參考下
    2017-09-09
  • IOS在Table View添加3D Touch功能

    IOS在Table View添加3D Touch功能

    在IOS開發(fā)中教給大家如何在Table View中添加 3D Touch Peek & Pop的功能,需要的朋友學習一下吧。
    2017-12-12

最新評論