3 回答

TA貢獻(xiàn)1852條經(jīng)驗 獲得超7個贊
擴(kuò)展UIView應(yīng)該可以解決問題。
extension UIView {
// Using a function since `var image` might conflict with an existing variable
// (like on `UIImageView`)
func asImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
}
蘋果不鼓勵使用UIGraphicsBeginImageContextiOS 10并引入P3色域。UIGraphicsBeginImageContext僅sRGB和32位。他們介紹了新的UIGraphicsImageRendererAPI,該API完全基于顏色進(jìn)行管理,基于塊,具有PDF和圖像的子類,并自動管理上下文生存期。請查看WWDC16會話205了解更多詳細(xì)信息(圖像渲染從11:50左右開始)
Edit1:為確保它能在所有設(shè)備上正常運行,請#available回退到iOS的早期版本:
extension UIView {
// Using a function since `var image` might conflict with an existing variable
// (like on `UIImageView`)
func asImage() -> UIImage {
if #available(iOS 10.0, *) {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
} else {
UIGraphicsBeginImageContext(self.frame.size)
self.layer.render(in:UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return UIImage(cgImage: image!.cgImage!)
}
}
}

TA貢獻(xiàn)1804條經(jīng)驗 獲得超8個贊
你可以使用擴(kuò)展
extension UIImage {
convenience init(view: UIView) {
UIGraphicsBeginImageContext(view.frame.size)
view.layer.render(in:UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.init(cgImage: image!.cgImage!)
}
}
這是迅速的3/4版本:
extension UIImage {
convenience init(view: UIView) {
UIGraphicsBeginImageContext(view.frame.size)
view.layer.render(in:UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.init(cgImage: image!.cgImage!)
}
}

TA貢獻(xiàn)1942條經(jīng)驗 獲得超3個贊
通過drawViewHierarchyInRect:afterScreenUpdates:將UIView轉(zhuǎn)換為圖像,這比renderInContext快很多倍
重要說明:請勿從viewDidLoad或viewWillAppear調(diào)用此函數(shù),請確保在視圖完全顯示/加載后捕獲視圖
對象C
UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.opaque, 0.0f);
[myView drawViewHierarchyInRect:myView.bounds afterScreenUpdates:NO];
UIImage *snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myImageView.image = snapshotImageFromMyView;
保存編輯的圖像相冊
UIImageWriteToSavedPhotosAlbum(snapshotImageFromMyView, nil,nil, nil);
迅捷3/4
UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.isOpaque, 0.0)
myView.drawHierarchy(in: myView.bounds, afterScreenUpdates: false)
let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
print(snapshotImageFromMyView)
myImageView.image = snapshotImageFromMyView
具有擴(kuò)展功能的超簡單通用化,iOS11,swift3 / 4
extension UIImage{
convenience init(view: UIView) {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.init(cgImage: (image?.cgImage)!)
}
}
Use :
//myView is completly loaded/visible , calling this code after only after viewDidAppear is call
imgVV.image = UIImage.init(view: myView)
// Simple image object
let img = UIImage.init(view: myView)
- 3 回答
- 0 關(guān)注
- 819 瀏覽
添加回答
舉報