91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS中如何使用一行代碼實現UIView鏤空效果

發布時間:2021-09-28 14:28:59 來源:億速云 閱讀:167 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關iOS中如何使用一行代碼實現UIView鏤空效果,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、思路

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

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

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

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

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

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

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

二、實現

生成相反的遮罩圖可以分為三步。假設一開始拿到的 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 來實現。

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

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

view.subtractMaskView = maskView;

四、局限性

1. subtractMaskView 不會自動刷新

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

2. setSubtractMaskView: 不宜被頻繁調用

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

關于“iOS中如何使用一行代碼實現UIView鏤空效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郴州市| 安乡县| 晋江市| 宜君县| 宁海县| 安福县| 寿阳县| 阿鲁科尔沁旗| 奉新县| 黑河市| 汨罗市| 朝阳县| 贵南县| 江都市| 凤山县| 丘北县| 宜兰市| 兴国县| 内黄县| 横山县| 洛南县| 肃宁县| 宣汉县| 称多县| 县级市| 吉木萨尔县| 平和县| 唐山市| 花莲市| 麻栗坡县| 盐源县| 肥西县| 图木舒克市| 疏勒县| 黔江区| 林甸县| 昌吉市| 韶山市| 文安县| 醴陵市| 乌鲁木齐市|