iOS開(kāi)發(fā) 如何在列表上方添加水印

為了防止工程師泄露用戶信息茵典,我們有個(gè)需求是在列表上面添加水印系冗。我封裝了這個(gè)視圖分享出來(lái)祝钢。

水印效果圖.png
watermarkView.h
#import <UIKit/UIKit.h>

@interface watermarkView : UIImageView

/**
 設(shè)置水印

 @param frame 水印大小
 @param markText 水印顯示的文字
 */
- (instancetype)initWithFrame:(CGRect)frame WithText:(NSString *)markText;

@end
watermarkView.m
#import "watermarkView.h"

#define HORIZONTAL_SPACE 30//水平間距
#define VERTICAL_SPACE 50//豎直間距
#define CG_TRANSFORM_ROTATION (M_PI_2 / 3)//旋轉(zhuǎn)角度(正旋45度 || 反旋45度)

@implementation watermarkView

- (instancetype)initWithFrame:(CGRect)frame WithText:(NSString *)markText{
    if(self = [super initWithFrame:frame]){
        
        UIFont *font = [UIFont systemFontOfSize:14];
        
        UIColor *color = YTHColorAlpha(152, 152, 152, 0.1);
        
        //原始image的寬高
        CGFloat viewWidth = frame.size.width;
        CGFloat viewHeight = frame.size.height;
        
        //為了防止圖片失真窖杀,繪制區(qū)域?qū)捀吆驮紙D片寬高一樣
        UIGraphicsBeginImageContext(CGSizeMake(viewWidth, viewHeight));
        
        //sqrtLength:原始image的對(duì)角線length角骤。在水印旋轉(zhuǎn)矩陣中只要矩陣的寬高是原始image的對(duì)角線長(zhǎng)度投蝉,無(wú)論旋轉(zhuǎn)多少度都不會(huì)有空白养葵。
        CGFloat sqrtLength = sqrt(viewWidth*viewWidth + viewHeight*viewHeight);
        //文字的屬性
        NSDictionary *attr = @{
                               //設(shè)置字體大小
                               NSFontAttributeName: font,
                               //設(shè)置文字顏色
                               NSForegroundColorAttributeName :color,
                               };
        NSString* mark = markText;
        NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:mark attributes:attr];
        //繪制文字的寬高
        CGFloat strWidth = attrStr.size.width;
        CGFloat strHeight = attrStr.size.height;
        
        //開(kāi)始旋轉(zhuǎn)上下文矩陣,繪制水印文字
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        //將繪制原點(diǎn)(0瘩缆,0)調(diào)整到原image的中心
        CGContextConcatCTM(context, CGAffineTransformMakeTranslation(viewWidth/2, viewHeight/2));
        //以繪制原點(diǎn)為中心旋轉(zhuǎn)
        CGContextConcatCTM(context, CGAffineTransformMakeRotation(CG_TRANSFORM_ROTATION));
        //將繪制原點(diǎn)恢復(fù)初始值关拒,保證當(dāng)前context中心和源image的中心處在一個(gè)點(diǎn)(當(dāng)前context已經(jīng)旋轉(zhuǎn),所以繪制出的任何layer都是傾斜的)
        CGContextConcatCTM(context, CGAffineTransformMakeTranslation(-viewWidth/2, -viewHeight/2));
        
        //計(jì)算需要繪制的列數(shù)和行數(shù)
        int horCount = sqrtLength / (strWidth + HORIZONTAL_SPACE) + 1;
        int verCount = sqrtLength / (strHeight + VERTICAL_SPACE) + 1;
        
        //此處計(jì)算出需要繪制水印文字的起始點(diǎn),由于水印區(qū)域要大于圖片區(qū)域所以起點(diǎn)在原有基礎(chǔ)上移
        CGFloat orignX = -(sqrtLength-viewWidth)/2;
        CGFloat orignY = -(sqrtLength-viewHeight)/2;
        
        //在每列繪制時(shí)X坐標(biāo)疊加
        CGFloat tempOrignX = orignX;
        //在每行繪制時(shí)Y坐標(biāo)疊加
        CGFloat tempOrignY = orignY;
        for (int i = 0; i < horCount * verCount; i++) {
            [mark drawInRect:CGRectMake(tempOrignX, tempOrignY, strWidth, strHeight) withAttributes:attr];
            if (i % horCount == 0 && i != 0) {
                tempOrignX = orignX;
                tempOrignY += (strHeight + VERTICAL_SPACE);
            }else{
                tempOrignX += (strWidth + HORIZONTAL_SPACE);
            }
        }
        //根據(jù)上下文制作成圖片
                UIImage *finalImg = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        CGContextRestoreGState(context);
        
        self.image = finalImg;
    }
    
    return self;
}

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    
    //1.判斷自己能否接收事件
    if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {
        return nil;
    }
    //2.判斷當(dāng)前點(diǎn)在不在當(dāng)前View.
    if (![self pointInside:point withEvent:event]) {
        return nil;
    }
    //3.從后往前遍歷自己的子控件.讓子控件重復(fù)前兩步操作,(把事件傳遞給,讓子控件調(diào)用hitTest)
    int count = (int)self.subviews.count;
    for (int i = count - 1; i >= 0; i--) {
        //取出每一個(gè)子控件
        UIView *chileV =  self.subviews[I];
        //把當(dāng)前的點(diǎn)轉(zhuǎn)換成子控件坐標(biāo)系上的點(diǎn).
        CGPoint childP = [self convertPoint:point toView:chileV];
        UIView *fitView = [chileV hitTest:childP withEvent:event];
        //判斷有沒(méi)有找到最適合的View
        if(fitView){
            return fitView;
        }
    }
    
    //4.沒(méi)有找到比它自己更適合的View.那么它自己就是最適合的View
    return self;
}

//作用:判斷當(dāng)前點(diǎn)在不在它調(diào)用View,(誰(shuí)調(diào)用pointInside,這個(gè)View就是誰(shuí))
//什么時(shí)候調(diào)用:它是在hitTest方法當(dāng)中調(diào)用的.
//注意:point點(diǎn)必須得要跟它方法調(diào)用者在同一個(gè)坐標(biāo)系里面
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    NSLog(@"%s",__func__);
    return NO;
}
使用方法
   //加水印
    watermarkView *watermark = [[watermarkView alloc] initWithFrame:CGRectMake(0, 0, KScreenW, KScreenH) WithText:@"測(cè)試"];
    [self.view addSubview:watermark];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末着绊,一起剝皮案震驚了整個(gè)濱河市谐算,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌归露,老刑警劉巖洲脂,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剧包,居然都是意外死亡恐锦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門疆液,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)一铅,“玉大人,你說(shuō)我怎么就攤上這事堕油∨似” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵掉缺,是天一觀的道長(zhǎng)卜录。 經(jīng)常有香客問(wèn)我,道長(zhǎng)攀圈,這世上最難降的妖魔是什么暴凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮赘来,結(jié)果婚禮上现喳,老公的妹妹穿的比我還像新娘。我一直安慰自己犬辰,他們只是感情好嗦篱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著幌缝,像睡著了一般灸促。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涵卵,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天浴栽,我揣著相機(jī)與錄音,去河邊找鬼轿偎。 笑死典鸡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坏晦。 我是一名探鬼主播萝玷,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嫁乘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了球碉?” 一聲冷哼從身側(cè)響起蜓斧,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睁冬,沒(méi)想到半個(gè)月后挎春,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豆拨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年搂蜓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽装。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖相味,靈堂內(nèi)的尸體忽然破棺而出拾积,到底是詐尸還是另有隱情,我是刑警寧澤丰涉,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布拓巧,位于F島的核電站,受9級(jí)特大地震影響一死,放射性物質(zhì)發(fā)生泄漏肛度。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一投慈、第九天 我趴在偏房一處隱蔽的房頂上張望承耿。 院中可真熱鬧,春花似錦伪煤、人聲如沸加袋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)职烧。三九已至,卻和暖如春防泵,著一層夾襖步出監(jiān)牢的瞬間蚀之,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工捷泞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留足删,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓肚邢,卻偏偏與公主長(zhǎng)得像壹堰,于是被迫代替她去往敵國(guó)和親拭卿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1贱纠、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,979評(píng)論 3 119
  • 送給你們一篇很美的詩(shī)篇峻厚,以及現(xiàn)挖的無(wú)底的我的腦洞。 解發(fā)夫妻 簡(jiǎn)媜 你和他 原是滴水米粒的尋常夫妻 車水馬龍里守一...
    Poppyf閱讀 949評(píng)論 0 1
  • 這個(gè)世界沒(méi)有絕對(duì)的公平可言谆焊,但是時(shí)間對(duì)于每一個(gè)人是公平惠桃,都是24小時(shí),不管你有沒(méi)有在珍惜辖试,它終將逝去辜王,不是你可以掌...
    玲鋒閱讀 212評(píng)論 1 2
  • 此刻 我把一切都想象的那么完美 就在一瞬間 流逝 似乎所有的痛苦來(lái)臨前 都是快樂(lè)的 可惜的是 我們未曾有過(guò)類似的感...
    皆非_lx閱讀 220評(píng)論 0 6
  • 取適量面粉放入兩個(gè)雞蛋加入適量的水呐馆,少許鹽,攪拌成稀面糊莲兢,拌勻靜止十五分鐘備用汹来。平底鍋小火加熱,放少量油改艇,放鍋內(nèi)一...
    鶴舞霏揚(yáng)閱讀 273評(píng)論 0 0