2016-12-12 8 views
-1

サブクラスのUIlablelのテキストからイメージを作成しています。 UIlablelのテキストはawakeFromNibに設定されており、アプリが起動するたびに異なります。イメージがUIlablelのテキスト全体をキャプチャする唯一の場所は、私が信じるフレームサイズのためにlayoutSubviews - です。下のコードでは、ラベルの親ビューにあるboundsを使用しています。問題は、layoutSubviewsが複数回呼び出されるため、このイメージが何度も作成される可能性があることです。私はdidMoveToWindowと他の場所で画像をキャプチャしようとしましたが、UIlablelのテキストの一部だけがキャプチャされます。これはイメージを作るためのコードです:どのような考えですか?テキストからイメージを作成する(不適切なサイズ)

func createImage(withText text: NSAttributedString, inParent parent: UIView) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(frame.size, false, 0) 
    text.draw(in: parent.bounds) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image! 
} 
+0

parent.boundsとframeのサイズと出所を確認できますか? –

+0

あなたのUILabelからテキストを一度保存​​してから、layoutSubviewを呼び出すたびにUIImageを再描画します。 –

答えて

0

問題は、この画像が何回

を作成されることがありますのでlayoutSubviewsが複数回呼び出されることである。しかし、あなたがif文を与えられているなぜあなたは画像であることを確認できるように、つまり、 を一度だけと作成しました。

var createdImage = false 
func createImage(... { 
    if !createdImage { 
     createdImage = true 
     // create image 
    } 
} 
+0

これはマットがマットである理由です、ありがとう!私はこれに似たようなことをしていましたが、コードには深刻なリファクタリングが必要でした。 – JEL

0

通常、別の変数を使用して、layoutSubviewsが呼び出されたかどうかを知ることができます。

var layoutInvoked = false 

func layoutSubviews() -> (Void) 
{ 
    super.layoutSubviews() 
    if layoutInvoked == false 
    { 
     layoutInvoked = true 
     // Do your stuff 
    } 
} 

簡単な方法があるかどうかわかりませんが、これは私の仕事です。

関連する問題