最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實(shí)現(xiàn)簡(jiǎn)單長(zhǎng)截圖

 更新時(shí)間:2022年07月20日 17:04:58   作者:MichaelJackchuang  
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)簡(jiǎn)單長(zhǎng)截圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了iOS實(shí)現(xiàn)簡(jiǎn)易的長(zhǎng)截圖的具體代碼,供大家參考,具體內(nèi)容如下

長(zhǎng)截圖的實(shí)現(xiàn)原理:

實(shí)際上是將view的內(nèi)容繪制成圖片,再將各個(gè)view繪制出來的圖片拼接出來。

具體代碼:

將view繪制成圖片

func getImage(in view:UIView?) -> UIImage? {
?? ?guard let view = view else {return nil}
?? ?let size = view.bounds.size
?? ?UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
?? ?view.layer.render(in: UIGraphicsGetCurrentContext()!)
?? ?view.layer.contents = nil
?? ?let image = UIGraphicsGetImageFromCurrentImageContext()
?? ?UIGraphicsEndImageContext()
?? ?return image
}

1.繪制狀態(tài)欄

// 先獲取狀態(tài)欄view
func getStatusBar() -> UIView? {
?? ?if Float(UIDevice.current.systemVersion)! >= 13 {
? ? ? ? guard let statusBarManager = UIApplication.shared.keyWindow?.windowScene?.statusBarManager,
? ? ? ? ? ? ? let localStatusBar = statusBarManager.value(forKey: "createLocalStatusBar") as? NSObject,
? ? ? ? ? ? ? let statusBar = localStatusBar.value(forKey: "statusBar") as? UIView else {return nil}
? ? ? ? return statusBar
? ? } else {
? ? ? ? guard let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow ?else {return nil}
? ? ? ? let statusBar = statusBarWindow.value(forKey: "statusBar") as? UIView
? ? ? ? return statusBar
? ? }
}

// 再繪制成圖片
let statusBarImage = getImage(in: getStatusBar())

2.繪制導(dǎo)航欄(如果有的話)

if let nav = vc.navigationController { // 表示有導(dǎo)航欄
? ? let navBar = nav.navigationBar
? ? let navBarImage = getImage(in: navBar)
}

在某些情況下,如自定義的導(dǎo)航欄,則需要另外自行獲取view再來繪制

3.繪制ScrollView

繪制scrollview長(zhǎng)圖的時(shí)候,如果直接繪制的話,那么得到的圖片就是scrollview的frame.size大小的圖片,而沒有滾動(dòng)到的地方則不會(huì)繪制進(jìn)去,所以要先將scrollview的size變成和contentSize一樣

func getScrollViewImage(scrollView:UIScrollView?) -> UIImage? {
? ? if let scroll = scrollView {
? ? ? ? let saveOffset = scroll.contentOffset // 保存偏移量,用于繪制圖片完成后還原
? ? ? ? let saveFrame = scroll.frame // 保存frame
? ? ? ? scroll.contentOffset = CGPoint.zero
? ? ? ? scroll.frame = CGRect(origin: saveFrame.origin, size: scroll.contentSize) // 設(shè)置size和contentSize一致
? ? ? ??
? ? ? ? UIGraphicsBeginImageContext(scroll.frame.size)
? ? ? ? UIGraphicsBeginImageContextWithOptions(CGSize(width: scroll.frame.size.width, height: scroll.frame.size.height), false, UIScreen.main.scale)
? ? ? ? scroll.layer.render(in: UIGraphicsGetCurrentContext()!)
? ? ? ? let scrollImage = UIGraphicsGetImageFromCurrentImageContext()
? ? ? ? UIGraphicsEndImageContext()
? ? ? ??
? ? ? ? scroll.contentOffset = saveOffset // 還原偏移量,否則繪制圖片之后,scrollview偏移量不正確
? ? ? ? scroll.frame = saveFrame // 還原frame
? ? ? ? return scrollImage
? ? }
? ? return nil
}

到這里,其實(shí)最難的一步已經(jīng)完成了,但是這個(gè)方法也不是完美的。當(dāng)這個(gè)scrollview添加到父視圖的時(shí)候是添加約束的方式來確定大小和位置的時(shí)候,使用這個(gè)方法繪制出來的圖片大小沒有問題,但是內(nèi)容卻可能只有屏幕上顯示出來的部分多一點(diǎn),其他部分是空白。具體原因我也不太清楚,只要在繪制成圖片之前將約束移除,繪制之后再添加回來

func getScrollViewImage(scrollView:UIScrollView?) -> UIImage? {
? ? if let scroll = scrollView {
? ? ? ? let saveOffset = scroll.contentOffset // 保存偏移量,用于繪制圖片完成后還原
? ? ? ? let saveFrame = scroll.frame // 保存frame
? ? ? ? scroll.contentOffset = CGPoint.zero
? ? ? ? scroll.frame = CGRect(origin: saveFrame.origin, size: scroll.contentSize) // 設(shè)置size和contentSize一致
? ? ? ? let layouts = scroll.superview!.constraints // 獲取的是scrollview的父容器的約束,這才是約束scrollview大小和位置的正確約束
? ? ? ? scroll.superview?.removeConstraints(layouts)
? ? ? ??
? ? ? ? UIGraphicsBeginImageContext(scroll.frame.size)
? ? ? ? UIGraphicsBeginImageContextWithOptions(CGSize(width: scroll.frame.size.width, height: scroll.frame.size.height), false, UIScreen.main.scale)
? ? ? ? scroll.layer.render(in: UIGraphicsGetCurrentContext()!)
? ? ? ? let scrollImage = UIGraphicsGetImageFromCurrentImageContext()
? ? ? ? UIGraphicsEndImageContext()
? ? ? ??
? ? ? ? scroll.contentOffset = saveOffset // 還原偏移量,否則繪制圖片之后,scrollview偏移量不正確
? ? ? ? scroll.frame = saveFrame // 還原frame
? ? ? ? scroll.superview?.addConstraints(layouts) // 還原約束
? ? ? ? return scrollImage
? ? }
? ? return nil
}

如果項(xiàng)目中集成了SnapKit的話可以用其給scrollview重新設(shè)置約束,繪制圖片結(jié)束后在還原也可以

func getScrollViewImage(scrollView:UIScrollView?) -> UIImage? {
? ? if let scroll = scrollView {
? ? ? ??
?? ??? ?// ......

? ? ? ? let layouts = scroll.superview!.constraints // 獲取的是scrollview的父容器的約束,這才是約束scrollview大小和位置的正確約束
? ? ? ? scroll.snp.remakeConstraints { (make) in
? ? ? ? ? ? make.top.left.right.equalTo(0)
? ? ? ? ? ? make.height.equalTo(scroll.contentSize.height)
? ? ? ? }
? ? ? ??
? ? ? ? // ......?
? ? ? ??
? ? ? ? scroll.snp.removeConstraints()
? ? ? ? scroll.superview?.addConstraints(layouts) // 還原約束
? ? ? ??
? ? ? ? return scrollImage
? ? }
? ? return nil
}

4.拼接圖片

已經(jīng)得到了所需要的各個(gè)部分的元素,這里按照上下位置將其拼接起來

func combineImages(with upImage:UIImage?, and downImage:UIImage?) -> UIImage? {
? ? if upImage == nil {
? ? ? ? return downImage
? ? }
? ? if downImage == nil {
? ? ? ? return upImage
? ? }
? ? guard let up = upImage,
? ? ? ? ? let down = downImage else {return nil}
? ? let size = CGSize(width: up.size.width, height: up.size.height + down.size.height)
? ? UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
? ??
? ? let upRect = CGRect(origin: CGPoint(x: 0, y: 0), size: up.size)
? ? up.draw(in: upRect)
? ? let downRect = CGRect(x: (up.size.width - down.size.width) / 2, y: upRect.origin.y + upRect.size.height, width: down.size.width, height: down.size.height)
? ? down.draw(in: downRect)
? ??
? ? let result = UIGraphicsGetImageFromCurrentImageContext()
? ? UIGraphicsEndImageContext()
? ? return result
}

這里是圖片的上下拼接,左右拼接與這個(gè)類似,只需要計(jì)算好圖片的左右位置即可。

效果圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS獲取設(shè)備唯一標(biāo)識(shí)的實(shí)現(xiàn)步驟

    iOS獲取設(shè)備唯一標(biāo)識(shí)的實(shí)現(xiàn)步驟

    這篇文章主要介紹了iOS獲取設(shè)備唯一標(biāo)識(shí)的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)ios開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • 詳解iOS14 Widget 開發(fā)相關(guān)及易報(bào)錯(cuò)地方處理

    詳解iOS14 Widget 開發(fā)相關(guān)及易報(bào)錯(cuò)地方處理

    這篇文章主要介紹了詳解iOS14 Widget 開發(fā)相關(guān)及易報(bào)錯(cuò)地方處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • iOS中判斷Emoji表情問題

    iOS中判斷Emoji表情問題

    在項(xiàng)目中遇到ios判斷emoji表情的問題,下面小編把我的解決方案分享到腳本之家平臺(tái)供大家參考
    2016-06-06
  • IOS實(shí)現(xiàn)碎片化動(dòng)畫詳解

    IOS實(shí)現(xiàn)碎片化動(dòng)畫詳解

    在網(wǎng)上看到一個(gè)驚艷的碎片化動(dòng)畫,于是實(shí)現(xiàn)之后拿來講解一下,有需要的小伙伴們可以參考學(xué)習(xí)哦。
    2016-08-08
  • IOS改變UISearchBar中搜索框的高度

    IOS改變UISearchBar中搜索框的高度

    這篇文章主要介紹了IOS改變UISearchBar中搜索框的高度的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 詳解iOS-按鈕單選與多選邏輯處理

    詳解iOS-按鈕單選與多選邏輯處理

    本篇文章主要介紹了詳解iOS-按鈕單選與多選邏輯處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • iOS 清除xcode緩存和生成文件的方法

    iOS 清除xcode緩存和生成文件的方法

    下面小編就為大家分享一篇iOS 清除xcode緩存和生成文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 總結(jié)IOS中隱藏軟鍵盤的三種方式

    總結(jié)IOS中隱藏軟鍵盤的三種方式

    在IOS開發(fā)中,軟鍵盤是開發(fā)者們經(jīng)常需要打交道的地方,下面為大家?guī)砦艺砜偨Y(jié)的三種隱藏鍵盤的方法。有需要的可以參考借鑒。
    2016-08-08
  • iOS如何裁剪圓形頭像

    iOS如何裁剪圓形頭像

    這篇文章主要介紹了iOS如何裁剪圓形頭像的方法,如何為圓形頭像加邊框,如何進(jìn)行截圖操作,感興趣的小伙伴們可以參考一下
    2016-04-04
  • iOS如何跳轉(zhuǎn)到App Store下載評(píng)分頁(yè)面示例代碼

    iOS如何跳轉(zhuǎn)到App Store下載評(píng)分頁(yè)面示例代碼

    最近在工作中遇到一個(gè)需求,需要跳轉(zhuǎn)到App Store下載評(píng)分,通過查找相關(guān)的資料最終解決了,下面這篇文章主要給大家介紹了關(guān)于iOS如何跳轉(zhuǎn)到App Store下載評(píng)分頁(yè)面的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12

最新評(píng)論

旺苍县| 紫云| 太湖县| 麟游县| 紫阳县| 瓦房店市| 淮南市| 潞西市| 梁河县| 秦皇岛市| 平顺县| 瑞丽市| 轮台县| 淮南市| 英德市| 乐亭县| 册亨县| 彩票| 紫阳县| 葵青区| 樟树市| 黄山市| 黄浦区| 恩平市| 渭南市| 怀集县| 小金县| 镇雄县| 嘉兴市| 睢宁县| 沧州市| 兴和县| 公主岭市| 卓资县| 乐业县| 平舆县| 顺昌县| 宁波市| 五台县| 平罗县| 广昌县|