2017-10-26 9 views
-3

私がイメージにキャプチャするビュー上のPNGのいくつかを持っている:空白がない画面をキャプチャしますか?

let rect: CGRect = self.frame 
     UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0); 
     let context: CGContext = UIGraphicsGetCurrentContext()! 
     self.layer.render(in: context) 
     let img: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

問題は、私はビュー上のコンテンツのサイズとして、最終的なPNGのサイズを取得したいということであり、そしてありません一定の矩形サイズとしてrect.sizeです。

は50pxの下、コンテンツの開始および最大コンテンツは200pxので終わるのであれば、私の新しいPNGの高さは150

+0

は、あなたがそれを解決するために管理するのですか? – jvrmed

答えて

1

になりますあなたのコンテンツの境界を検出するために、あなたの意見を反復処理する必要があります。

あなたは手動フレームを計算することができます。

var minX = view.frame.origin.x + view.frame.size.width 
var minY = view.frame.origin.y + view.frame.size.height 
var maxX = 0 
var maxY = 0 

for subview in self.subviews { 
    minX = min(minX, subview.frame.origin.x) 
    minY = min(minY, subview.frame.origin.y) 
    maxX = max(maxX, subview.frame.origin.x + subview.frame.size.width) 
    maxY = max(maxY, subview.frame.origin.y + subview.frame.size.height) 
} 

var newPngRect = CGRect(x: minX, y: minY, width: maxX-minX, height: maxY-minY) 

UIGraphicsBeginImageContextWithOptions(newPngRect!, false, 0.0) 

またはあなたのサブビューのunionを決定します。

var newPngRect = CGRect.zero 
for subview in subviews { 
    baseRect = baseRect.union(subview.frame) 
} 

UIGraphicsBeginImageContextWithOptions(newPngRect, false, 0.0) 

self.subviewsが必要な場合にはyourContentView.subviewsのために交換することができることを考えてみましょう。

+0

これは場合によっては間違っていると思います。 1つのサブビューがあり、1の幅と1の高さで(1,1)に位置しているとします。これにより、0のminX、0のminY、1の幅/高さが得られます。あなたが気に入っているすべてのビューを1つのビュー内でスクリーンショットし、そのrect上で 'UIGraphicsBeginImageContextWithOptions'を呼び出します。 – Connor

+0

True @Connor、私は答えを1つのサブビューのケースを考慮して変更しました – jvrmed

+0

それだけで問題ではありません。別のサブビューを(2、2)に追加すると、同じバグが発生します。 'minX'と' minY'のロジックが間違っています。 – Connor

0

スクリーンショットを追加するすべてのサブビュー(a containerView)を含む単一のビューを作成します。

自動レイアウトを使用して、必要に応じてすべてのサブビューをレイアウトします。

ビューをスクリーンショットする準備が整いました、使用します。

UIGraphicsBeginImageContextWithOptions(containerView.frame.size, false, 0.0); 
let context: CGContext = UIGraphicsGetCurrentContext()! 
containerView.layer.render(in: context) 
let img: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
UIGraphicsEndImageContext() 
+0

ありがとう、これは何ですか?あなたは私のコードをコピーしますか?これは私がしたことです、それはスペースを作成します。 – Curnelious

+0

あなたのコードと同じではありません。私は何をすべきかを説明しました。 – Connor

関連する問題