截取ScrollView中的全部內(nèi)容以及添加水印

一适篙、我們要做什么

我們要做的是這種效果铁坎!
打開一個網(wǎng)頁蜂奸,百度為例吧


webView展示網(wǎng)頁內(nèi)容

這個時候我們點擊保存截圖,我們要把整個網(wǎng)頁保存為圖片硬萍,然后在網(wǎng)頁的結(jié)尾加上一個二維碼扩所,這樣分享到微信什么的,就可以直接識別網(wǎng)頁鏈接了朴乖。效果是醬嬸兒的祖屏。


相冊中查看保存的圖

二、需要哪些知識點

1买羞、主要還是繪圖
2袁勺、二維碼
3、如果想做成home+power截屏時保存這張大長圖畜普,還要用到截屏的通知魁兼,這個最后說吧。

三、Let's 整咐汞!

第一頁

第一頁就不說了,storyboard上拖個輸入框儒鹿、按鈕什么的就ok了化撕。
輸入網(wǎng)址,點擊確定后傳給第二個頁面的webView去請求鏈接约炎,展示網(wǎng)頁植阴。
展示之后,我們要把整個網(wǎng)頁全部繪制成圖片圾浅。
下面是保存截圖按鈕執(zhí)行的代碼

- (IBAction)saveAction:(id)sender {
    // 獲取scrollView
    UIScrollView *scrollView = self.webView.scrollView;
    UIImage* image = nil;
    
    // 開始繪制
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(scrollView.contentSize.width, scrollView.contentSize.height+100), NO, 0.0);
    {
        // 保存原有的scrollView偏移量和frame
        CGPoint savedContentOffset = scrollView.contentOffset;
        CGRect savedFrame = scrollView.frame;
        
        // 展開scrollView
        scrollView.contentOffset = CGPointZero;
        scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
        
        // 將scrollView的layer渲染到上下文中
        [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
        
        // 畫背景
        UIImage *backImage = [UIImage createImageWithColor:[UIColor whiteColor]];
        [backImage drawInRect:CGRectMake(0, scrollView.contentSize.height-100, scrollView.contentSize.width, 100)];
        
        // 畫二維碼
        UIImage *qrImage = [QRCodeGenerator qrImageForString:self.url imageSize:300];
        [qrImage drawInRect:CGRectMake(scrollView.contentSize.width*0.5-40, scrollView.contentSize.height-100+10, 80, 80)];
        
        // 獲取結(jié)果圖片
        image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 還原scrollView偏移量和frame
        scrollView.contentOffset = savedContentOffset;
        scrollView.frame = savedFrame;
    }
    UIGraphicsEndImageContext();
    
    if (image != nil) {
        // 寫到相冊
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }
}

講解下原理:主要就是讓webView的frame中的寬高等于自己的contentSize的寬高掠手,這樣webView就把自己的所有內(nèi)容展示出來了,然后把webView的layer渲染到上下文中狸捕,再通過如下的庫生成二維碼圖片(頭文件QRCodeGenerator.h)喷鸽,再將二維碼繪制到剛才的layer上。文字灸拍、圖片什么的都可以這樣繪制上去做祝。最后再從上下文中獲取繪制好的最后的圖片,通過UIImageWriteToSavedPhotosAlbum方法鸡岗,可以將圖片保存到相冊混槐。


生成二維碼的庫

灰常簡單就實現(xiàn)了。

三轩性、拓展

這時如果說想用截屏來做的話声登,那就可以使用如下的通知來獲取截屏事件。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenShot:) name:UIApplicationUserDidTakeScreenshotNotification object:nil];

關(guān)于圖像上下文揣苏,繪圖中比較難理解的還是圖形上下文悯嗓,很多人應該不理解為什么上下文就突然出現(xiàn)在這里了,它是做什么用的舒岸?這時看看下面這兩篇就差不多可以理解的差不多了绅作。
上下文是什么,了解上下文是什么蛾派、干嘛用的
iOS繪圖上下文的理解俄认,這樣就了解了上下文棧是干什么的,配合上面的文章就知道上下文的原理和用途了洪乍。
順便眯杏,tableView、collectionView什么的壳澳,都是繼承自ScrollView的岂贩,所以都可以用以上方法進行處理,其他的各種控件巷波,拿到layer也都可以渲染出來保存為圖片萎津,截屏也就很方便了卸伞。下面貼下,截取顯示屏幕的方法

    CGSize imageSize = CGSizeZero;
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (UIInterfaceOrientationIsPortrait(orientation))
        imageSize = [UIScreen mainScreen].bounds.size;
    else
        imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
    
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    for (UIWindow *window in [[UIApplication sharedApplication] windows])
    {
        CGContextSaveGState(context);
        CGContextTranslateCTM(context, window.center.x, window.center.y);
        CGContextConcatCTM(context, window.transform);
        CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
        if (orientation == UIInterfaceOrientationLandscapeLeft)
        {
            CGContextRotateCTM(context, M_PI_2);
            CGContextTranslateCTM(context, 0, -imageSize.width);
        }
        else if (orientation == UIInterfaceOrientationLandscapeRight)
        {
            CGContextRotateCTM(context, -M_PI_2);
            CGContextTranslateCTM(context, -imageSize.height, 0);
        } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
            CGContextRotateCTM(context, M_PI);
            CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
        }
        if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
        {
            [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
        }
        else
        {
            [window.layer renderInContext:context];
        }
        CGContextRestoreGState(context);
    }
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

主要思想還是獲取當前window锉屈,渲染他的layer荤傲,同時對屏幕的旋轉(zhuǎn)情況做了處理,如果app不支持屏幕旋轉(zhuǎn)颈渊,就可以省去了遂黍。

四、Demo如下

https://github.com/ZhaoheMHz/ScrollViewScreenShot

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俊嗽,一起剝皮案震驚了整個濱河市雾家,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绍豁,老刑警劉巖芯咧,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妹田,居然都是意外死亡唬党,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門鬼佣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驶拱,“玉大人,你說我怎么就攤上這事晶衷±陡伲” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵晌纫,是天一觀的道長税迷。 經(jīng)常有香客問我,道長锹漱,這世上最難降的妖魔是什么箭养? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮哥牍,結(jié)果婚禮上毕泌,老公的妹妹穿的比我還像新娘。我一直安慰自己嗅辣,他們只是感情好撼泛,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澡谭,像睡著了一般愿题。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天潘酗,我揣著相機與錄音杆兵,去河邊找鬼。 笑死仔夺,一個胖子當著我的面吹牛拧咳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囚灼,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祭衩!你這毒婦竟也來了灶体?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掐暮,失蹤者是張志新(化名)和其女友劉穎蝎抽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體路克,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡樟结,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了精算。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓢宦。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灰羽,靈堂內(nèi)的尸體忽然破棺而出驮履,到底是詐尸還是另有隱情,我是刑警寧澤廉嚼,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布玫镐,位于F島的核電站,受9級特大地震影響怠噪,放射性物質(zhì)發(fā)生泄漏恐似。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一傍念、第九天 我趴在偏房一處隱蔽的房頂上張望矫夷。 院中可真熱鬧,春花似錦捂寿、人聲如沸口四。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔓彩。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赤嚼,已是汗流浹背旷赖。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留更卒,地道東北人等孵。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蹂空,于是被迫代替她去往敵國和親俯萌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫上枕、插件咐熙、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • 1.Notification(通知) 自從Notification被引入之后,蘋果就不斷的更新優(yōu)化辨萍,但這些更新優(yōu)化...
    MMOTE閱讀 887評論 0 4
  • 開學啦開學啦锈玉∽ζ看微微特別想玩游戲,但是電腦帶不起來拉背,只能放棄了师崎。真羨慕游戲玩的好的女生啊。這一學期要奮發(fā)上進去团,雖然...
    GoodLee閱讀 341評論 0 0
  • 小寶過敏了抡诞,7個月16天的小寶貝因為使用雞蛋白過敏了,孩子滿臉紅彤彤的土陪,耳朵昼汗、眼皮、手以及小腳丫都紅腫起來了……孩...
    白敬華閱讀 222評論 0 0