iOS 長截屏

GitHub Demo

介紹

UIScrollView 及其子類 UITableView征绎、UICollectionView 的內(nèi)容進行長截圖。

思路

UIScrollView進行長截屏時是整,需要知道它的全部內(nèi)容,包括未加載未渲染的內(nèi)容。

做法是通過設(shè)置它的內(nèi)容偏移量 contentOffset挺尾, 讓 ScrollView 的內(nèi)容滑動到底部返顺,這樣便可以觸發(fā) ScrollView 中全部內(nèi)容的加載和渲染肮蛹。

CoreGraphicsScrollView 的內(nèi)容渲染生成圖片,此時我們需要令 ScrollView 的寬高等于 它 contentSize 的真實寬高创南,在截屏結(jié)束后再恢復伦忠,因此需要提前緩存一份 ScrollView 的屬性。

問題

Q:設(shè)置 ScrollView 偏移量時稿辙,用戶看見的界面內(nèi)容會發(fā)生偏移昆码,怎么處理?

A:在設(shè)置偏移之前邻储,使用 UIViewfunc snapshotView(afterScreenUpdates afterUpdates: Bool) -> UIView? 方法對當前看見的內(nèi)容截屏(注意:此方法只會截屏已顯示加載出來的內(nèi)容赋咽,非全部),然后用 addSubview() 添加 Scrollview.superView上吨娜,蓋在 UIScrollView 之上脓匿,這樣用戶看見的就是一個假的不會變動的View

使用:

scrollView.swContentCapture { (image) in
    // TODO:                           
}

全部代碼如下:

代碼中有詳細注釋

// Reference:  https://github.com/startry/SwViewCapture
// Notes: The 'swContentCapture(_:)' method would lose constraints of UIScrollview, we need remake its constraints after screenshot.

import UIKit

public extension UIScrollView {

    func swContentCapture (_ completionHandler: @escaping (_ capturedImage: UIImage?) -> Void) {

        // Put a fake Cover of View
        let snapShotView = self.snapshotView(afterScreenUpdates: false)
        snapShotView?.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: (snapShotView?.frame.size.width)!, height: (snapShotView?.frame.size.height)!)
        self.superview?.addSubview(snapShotView!)

        // Backup all properties of scrollview if needed
        let bakFrame     = self.frame
        let bakOffset    = self.contentOffset
        let bakSuperView = self.superview
        let bakIndex     = self.superview?.subviews.firstIndex(of: self)

        // Scroll To Bottom show all cached view
        if self.frame.size.height < self.contentSize.height {
            self.contentOffset = CGPoint(x: 0, y: self.contentSize.height - self.frame.size.height)
        }

        self.swRenderImageView({ [weak self] (capturedImage) -> Void in
            // Recover View

            let strongSelf = self!

            strongSelf.removeFromSuperview()
            strongSelf.frame = bakFrame
            strongSelf.contentOffset = bakOffset
            bakSuperView?.insertSubview(strongSelf, at: bakIndex!)

            snapShotView?.removeFromSuperview()

            completionHandler(capturedImage)
        })
    }

    private func swRenderImageView(_ completionHandler: @escaping (_ capturedImage: UIImage?) -> Void) {
        // Due to scroll to bottom, delay to wait for contentOffset refreshing.
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
            // Rebuild scrollView superView and their hold relationship
            let swTempRenderView = UIView(frame: CGRect(x: 0, y: 0, width: self.contentSize.width, height: self.contentSize.height))
            self.removeFromSuperview()
            swTempRenderView.addSubview(self)

            self.contentOffset = CGPoint.zero
            self.frame         = swTempRenderView.bounds

            // Sometimes ScrollView will Capture nothing without defer;
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                let bounds = self.bounds
                UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale)
                self.layer.render(in: UIGraphicsGetCurrentContext()!)
                let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()

                completionHandler(capturedImage)
            }
        }
    }
}

SwViewCapture

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宦赠,一起剝皮案震驚了整個濱河市陪毡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勾扭,老刑警劉巖毡琉,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妙色,居然都是意外死亡桅滋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門身辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丐谋,“玉大人芍碧,你說我怎么就攤上這事『爬” “怎么了师枣?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萧落。 經(jīng)常有香客問我践美,道長,這世上最難降的妖魔是什么找岖? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任陨倡,我火速辦了婚禮,結(jié)果婚禮上许布,老公的妹妹穿的比我還像新娘兴革。我一直安慰自己,他們只是感情好蜜唾,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布杂曲。 她就那樣靜靜地躺著,像睡著了一般袁余。 火紅的嫁衣襯著肌膚如雪擎勘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天颖榜,我揣著相機與錄音棚饵,去河邊找鬼。 笑死掩完,一個胖子當著我的面吹牛噪漾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播且蓬,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欣硼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恶阴?” 一聲冷哼從身側(cè)響起诈胜,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎存淫,沒想到半個月后耘斩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沼填,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡桅咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坞笙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岩饼。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡荚虚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出籍茧,到底是詐尸還是另有隱情版述,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布寞冯,位于F島的核電站渴析,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吮龄。R本人自食惡果不足惜俭茧,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漓帚。 院中可真熱鬧母债,春花似錦、人聲如沸尝抖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧辽。三九已至衙熔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搅荞,已是汗流浹背青责。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留取具,地道東北人脖隶。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像暇检,于是被迫代替她去往敵國和親产阱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,667評論 1 9
  • 想必使用iPhone的用戶, 大家都知道按照Home鍵+電源鍵就可以截屏了块仆。 截屏對于產(chǎn)品經(jīng)理构蹬、工程師、設(shè)計師都比...
    Startry閱讀 8,121評論 21 44
  • 轉(zhuǎn)載:http://www.reibang.com/p/aa64fd3dd621 想必使用iPhone的用戶, 大...
    曉飛90閱讀 1,278評論 0 1
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多悔据,會對里面所有的內(nèi)容的引用計數(shù)+1庄敛,想要解決就用__block...
    炙冰閱讀 2,488評論 1 14
  • 我支持同性戀壹置,理解抑郁癥兄墅,我會喂樓底下的流浪貓,會給老奶奶讓座位爽雄,會對服務員說謝謝……縱然,我平庸怖亭,長相普通涎显,脾氣...
    潘琰澤不走心閱讀 70評論 0 1