成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

iOS中如何使用一行代碼實(shí)現(xiàn)UIView鏤空效果-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)iOS中如何使用一行代碼實(shí)現(xiàn)UIView鏤空效果,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為濰城等服務(wù)建站,濰城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為濰城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

一、思路

我們的最終目標(biāo)是,封裝出一個(gè)接口,調(diào)用方式類似于maskView 屬性,可以很方便地對(duì)一個(gè)UIView 做鏤空效果。

注:以下用originView 指代需要上效果的view ,用maskView 指代充當(dāng)遮罩的view 。

目前看來(lái),可以從兩個(gè)方向入手:

  1. 修改遮罩的繪制過(guò)程修改 maskView 本身

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

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

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

二、實(shí)現(xiàn)

生成相反的遮罩圖可以分為三步。假設(shè)一開始拿到的maskView 是下面這樣,讓我們來(lái)看下,轉(zhuǎn)換過(guò)程中遮罩圖每一步的變化。

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

1、將maskView 轉(zhuǎn)化為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 對(duì)應(yīng)的image 圖像。此時(shí)遮罩圖的大小會(huì)被同步為originView 的大小。

2、將

UIImage 轉(zhuǎn)換為只有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);

這時(shí)候的alphaOnlyContext 對(duì)應(yīng)的圖像是下面這樣,只保留了alpha 通道。

3、將

CGContextRef 中的alpha 值進(jìn)行遍歷轉(zhuǎn)換

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];

轉(zhuǎn)換后,獲得的result 圖像是:

于是,我們就可以用result 愉快地進(jìn)行mask 了。

三、使用

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

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

這樣調(diào)用起來(lái)就十分方便了,一行代碼搞定:

view.subtractMaskView = maskView;

四、局限性

1.subtractMaskView 不會(huì)自動(dòng)刷新

我們知道,當(dāng)UIViewmaskView 的內(nèi)容動(dòng)態(tài)修改時(shí),會(huì)實(shí)時(shí)反映到UIView 中。但在本項(xiàng)目中,subtractMaskView 屬性會(huì)生成一張全新的圖片來(lái)作為遮罩圖,因?yàn)椴粫?huì)根據(jù)subtractMaskView 的內(nèi)容實(shí)時(shí)來(lái)刷新視圖。如果需要更新,必須手動(dòng)調(diào)用setSubtractMaskView: 方法來(lái)重新生成遮罩圖。

2.setSubtractMaskView: 不宜被頻繁調(diào)用

setSubtractMaskView: 本質(zhì)上是生成一個(gè)新的遮罩圖的過(guò)程,該過(guò)程涉及圖片像素的遍歷轉(zhuǎn)換,較為耗時(shí),不宜頻繁調(diào)用。

關(guān)于“iOS中如何使用一行代碼實(shí)現(xiàn)UIView鏤空效果”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

當(dāng)前文章:iOS中如何使用一行代碼實(shí)現(xiàn)UIView鏤空效果-創(chuàng)新互聯(lián)
標(biāo)題URL:http://jinyejixie.com/article26/hgjjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)網(wǎng)站維護(hù)、移動(dòng)網(wǎng)站建設(shè)微信小程序、品牌網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
大悟县| 呼玛县| 井研县| 灵丘县| 修文县| 宁晋县| 建昌县| 新平| 定远县| 晋江市| 巫山县| 涟源市| 福泉市| 博爱县| 虹口区| 新平| 南岸区| 闻喜县| 铁岭市| 开江县| 建瓯市| 麻栗坡县| 井研县| 文水县| 西充县| 三都| 界首市| 鹤山市| 沙坪坝区| 寿阳县| 上杭县| 老河口市| 罗平县| 通道| 浮山县| 安徽省| 安化县| 方城县| 庆云县| 法库县| 深泽县|