<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了iOS實現簡易的長截圖的具體程式碼,供大家參考,具體內容如下
長截圖的實現原理:
實際上是將view的內容繪製成圖片,再將各個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.繪製狀態列
// 先獲取狀態列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.繪製導航欄(如果有的話)
if let nav = vc.navigationController { // 表示有導航欄 let navBar = nav.navigationBar let navBarImage = getImage(in: navBar) }
在某些情況下,如自定義的導航欄,則需要另外自行獲取view再來繪製
3.繪製ScrollView
繪製scrollview長圖的時候,如果直接繪製的話,那麼得到的圖片就是scrollview的frame.size大小的圖片,而沒有捲動到的地方則不會繪製進去,所以要先將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) // 設定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 }
到這裡,其實最難的一步已經完成了,但是這個方法也不是完美的。當這個scrollview新增到父檢視的時候是新增約束的方式來確定大小和位置的時候,使用這個方法繪製出來的圖片大小沒有問題,但是內容卻可能只有螢幕上顯示出來的部分多一點,其他部分是空白。具體原因我也不太清楚,只要在繪製成圖片之前將約束移除,繪製之後再新增回來
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) // 設定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 }
如果專案中整合了SnapKit的話可以用其給scrollview重新設定約束,繪製圖片結束後在還原也可以
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.拼接圖片
已經得到了所需要的各個部分的元素,這裡按照上下位置將其拼接起來
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 }
這裡是圖片的上下拼接,左右拼接與這個類似,只需要計算好圖片的左右位置即可。
效果圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45