先に結論
テストとかの時にデバッガからViewを見れたら便利になるよってお話。
debugQuickLookObject
Xcodeの機能として、独自クラスを見やすく表示するdebugQuickLookObject
という機能がある。
この機能はBreak Pointで止めている最中にObjectのプレビューを可能にするものであり、テキストや画像、URLなんかをPreviewできる。
@objc func debugQuickLookObject() -> Any? {
URL(string: "https://www.google.co.jp/")
}
このようにURLを返せば
ページが表示される
じゃあこれでリアルタイムのUIView
を表示できたら楽しそうという考え。
実装
debugQuickLookObject
を実装する。
Swift4.0あたりから@objc
をつけないと動かなくなってる。
iOS
extension UIView {
@objc func debugQuickLookObject() -> Any? {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
mac
extension NSView {
@objc func debugQuickLookObject() -> Any? {
guard let rep = self.bitmapImageRepForCachingDisplay(in: bounds) else { return nil }
self.cacheDisplay(in: self.bounds, to: rep)
guard let cgImage = rep.cgImage else { return nil }
return NSImage(cgImage: cgImage, size: bounds.size)
}
}
これでLLDBデバッガでbreakpointを貼って止めて、目のマークを押すと
Viewの内容をPreviewできる。