分享iOS中常用的繪圖, 截屏方法

  1. 設(shè)置某些角為圓角, 使用UIBezierPath
        let layer = CAShapeLayer()
        // 這里byRoundingCorners -> 指定圓角
        layer.path = UIBezierPath(roundedRect: testView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, .TopRight], cornerRadii: CGSize(width: 20, height: 20)).CGPath
        testView.layer.mask = layer
  1. 設(shè)置view的四個角都為圓角, 最簡單的方法, 使用當然最簡單的某些情況下肯定就是不適合的, 因為這個方法會觸發(fā)離屏渲染, 如果界面中有大量的圓角view的處理, 會出現(xiàn)掉幀的"現(xiàn)象"
        testView.layer.cornerRadius = 20.0
        testView.layer.masksToBounds = true
  1. 縮放圖片
  • 3.1
    // 縮放圖片
    func resizeImage(image: UIImage, toWidth width: CGFloat, withHeight height: CGFloat) -> UIImage {
        let size = CGSize(width: width, height: height)
        // 開啟一個上下文
        /// 設(shè)置為false 表示背景不透明 -> 黑色
        /// 設(shè)置為 0 -> 可以自適應(yīng)不同的屏幕的scale顯示
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        // 獲取上下文
        let context = UIGraphicsGetCurrentContext()
        // 轉(zhuǎn)換坐標原點到左下角
        CGContextTranslateCTM(context, 0.0, height)
        CGContextScaleCTM(context, 1.0, -1.0)
        // 設(shè)置繪制模式
        CGContextSetBlendMode(context, .Copy)
        // 繪圖
        CGContextDrawImage(context, CGRect(origin: CGPointZero, size: size), image.CGImage)
        // 取得圖片
        let retrivedImage = UIGraphicsGetImageFromCurrentImageContext()
        // 結(jié)束上下文
        UIGraphicsEndImageContext()
        return retrivedImage
    }
  • 3.2
    // 縮放圖片
    func resizeImage(image: UIImage, toWidth width: CGFloat, withHeight height: CGFloat) -> UIImage {
        let size = CGSize(width: width, height: height)
        // 開啟一個上下文
        /// 設(shè)置為false 表示背景不透明 -> 黑色
        /// 設(shè)置為 0 -> 可以自適應(yīng)不同的屏幕的scale顯示
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        /// 繪制圖片
        image.drawInRect(CGRect(origin: CGPointZero, size: size))
        // 取得圖片
        let retrivedImage = UIGraphicsGetImageFromCurrentImageContext()
        // 結(jié)束上下文
        UIGraphicsEndImageContext()
        return retrivedImage
    }
  1. 截屏功能
  • 4.1
    func snapView(targetView: UIView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(targetView.bounds.size, false, 0)
        // iOS7.0 之后系統(tǒng)提供的截屏的功能
        targetView.drawViewHierarchyInRect(targetView.bounds, afterScreenUpdates: false)
        
        let snapdImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapdImage

    }
  • 4.2
  //這個方法會返回一個"截屏"后的view
  // withCapInsets  -> 這個和拉伸圖片的image.resizableImageWithCapInsets()使用一樣
       let snapShotView  = view.resizableSnapshotViewFromRect(view.bounds, afterScreenUpdates: false, withCapInsets: UIEdgeInsetsZero)
  • 4.3
  func snapView(targetView: UIView) -> UIImage {
              UIGraphicsBeginImageContextWithOptions(targetView.bounds.size, false, 0.0)
// 區(qū)分和4.1中的使用
    targetView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()

      return image

  }

  1. 剪裁圖片的指定部分
  • 5.1
    func cutImage(image: UIImage, cutRect: CGRect) -> UIImage {
        
        UIGraphicsBeginImageContextWithOptions(cutRect.size, false, 0.0)
        // 獲取上下文
        let context = UIGraphicsGetCurrentContext()
        // 轉(zhuǎn)換坐標原點到左下角
        CGContextTranslateCTM(context, 0.0, cutRect.size.height)
        CGContextScaleCTM(context, 1.0, -1.0)
        // 設(shè)置繪制模式
        CGContextSetBlendMode(context, .Copy)
        // 繪圖
        CGContextDrawImage(context, cutRect, image.CGImage)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
  • 5.2
    func cutImage(image: UIImage, cutRect: CGRect) -> UIImage {
        
        UIGraphicsBeginImageContextWithOptions(cutRect.size, false, 0.0)
        // 獲取上下文
        let context = UIGraphicsGetCurrentContext()
        image.drawInRect(cutRect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
  1. 將顏色繪制為圖片
  • 6.1
    func imageFromColor(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        let rect = CGRect(origin: CGPointZero, size: size)
        color.setFill()
        UIRectFill(rect)
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
  • 6.2
    func imageFromColor(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        let rect = CGRect(origin: CGPointZero, size: size)
//        color.setFill()
//        UIRectFill(rect)
        
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

如果你覺得平時很少接觸過Quartzs 2D來繪圖, 可能看上面的代碼不是很明白, 如果想要更清楚, 建議閱讀相關(guān)的繪圖教程, 同時下一篇可能會簡單分享一下使用Quartzs 2D來繪圖的相關(guān)知識, 歡迎關(guān)注


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓷翻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子割坠,更是在濱河造成了極大的恐慌齐帚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼哼,死亡現(xiàn)場離奇詭異童谒,居然都是意外死亡,警方通過查閱死者的電腦和手機沪羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門饥伊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔫饰,你說我怎么就攤上這事琅豆。” “怎么了篓吁?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵茫因,是天一觀的道長。 經(jīng)常有香客問我杖剪,道長冻押,這世上最難降的妖魔是什么驰贷? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮洛巢,結(jié)果婚禮上括袒,老公的妹妹穿的比我還像新娘。我一直安慰自己稿茉,他們只是感情好锹锰,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漓库,像睡著了一般恃慧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渺蒿,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天痢士,我揣著相機與錄音,去河邊找鬼茂装。 笑死怠蹂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的训唱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼挚冤,長吁一口氣:“原來是場噩夢啊……” “哼况增!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起训挡,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤澳骤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澜薄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體为肮,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年肤京,在試婚紗的時候發(fā)現(xiàn)自己被綠了颊艳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡忘分,死狀恐怖棋枕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒峦,我是刑警寧澤重斑,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站肯骇,受9級特大地震影響窥浪,放射性物質(zhì)發(fā)生泄漏祖很。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一漾脂、第九天 我趴在偏房一處隱蔽的房頂上張望假颇。 院中可真熱鬧,春花似錦符相、人聲如沸拆融。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜豹。三九已至,卻和暖如春蓝牲,著一層夾襖步出監(jiān)牢的瞬間趟脂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工例衍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昔期,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓佛玄,卻偏偏與公主長得像硼一,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梦抢,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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