2011-05-10 3 views
0

Obj-CとiOSプログラミングを始めましょう。その後、セットを単にUIImageViewには、setImageが完了し、アニメーションが準備完了であることを示すプロパティがありますか?

[bgImageView setImage:[UIImage imageNamed:@"Filename.jpg"]; 

コードとfgImageViewとbgImageViewにアニメーションをコミット - UIViewの:私は(YES HIDDEN)にいくつかのコードをロードし、ImageViewのを持っています。 イメージの一部が大きくなることがあるため、新しいbgImageのアニメーションは新しい背景イメージでレンダリングされず、代わりに 'ストールと表示'されます。 setImage中にストールが発生しないことに注意してください。後のコードで2番目のanimationCommitの間に発生します。 animationCommitは、このImageViewのアニメーションが完了するまで、アプリケーションを強制的に待機させるためです。私が探している何

は は

私はむしろイメージがロードされるまで、アニメーションを進めスピナーを表示し、しかしそこにないのだ、UIImageViewの「setImageコミット」の一種でありますUIImageViewクラスのisLoadedプロパティとして表示されます。

UIImageViewがsetImageコールで完了したことを確認する簡単な方法はありますか?

答えて

0

UIImageView - (BOOL)isAnimatingでの方法は、あります:

if (![bgImageView isAnimating]) { 
    // continue to next image; 
} 

または偽の応答を与える進行中の他のアニメーションはそれで十分にありますか?

+0

私はこれを試しましたが、利用できません - isAnimatingは明らかに、uiimageviewがまだバックグラウンドでイメージをスケーリングしていることを特定していません。 –

+0

それを聞いて申し訳ありません。それは少し面倒ですが、 'setImage:'メソッドを ' - (void)setImage:(UIImage *)image {[super setImage:image];}でオーバーライドすることは可能です。 //あなたのカスタムコード。 } '。さらに悪いことに、そこにメインスレッドに通知を含めて、次の画像に進むことができることを知らせることができます – justin

+0

そして、画像がいつ完了したかを伝える方法があればスケーリング/ロード - しかし、その問題は残っています。私は助けてくれてありがとうございます。でも、あなたのカスタムコードブロックは依然として疑問です。イメージが実際にアニメーション化する準備ができていることを知るにはどうすればよいですか? –

1

私は、setImageが同期して処理されるということは、特にあなたがアプリがどのように停止しているかを話しているからです。 NSOperationでsetImageを実行して、バックグラウンドで実行できるようにしたいと考えています。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSOperation_class/Reference/Reference.html

NSInvocationOperation *myOp = [[NSInvocationOperation alloc] initWithTarget:myImageView [email protected](setImage:) object:aUIImage]; 
[myOp addObserver:(NSObject *)self forKeyPath:(NSString *) @"isFinished" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:NULL]; 
[anOpQueue addOperation:myOp]; 

その後、KVO操作を処理し、そこにスピナーを削除扱いと思います。あなたが潜在的に使用できるよう

+0

アプリケーションは停止しません - bgimageのアニメーションコミットは停止しますが、setimageとそのアニメーションコミットの間のコードが実行されます(fgimageアニメーションが完了してストールします、後でコード7行です) –

+0

実際には、それはより良いでしょう。画像が背景のスレッドで読み込まれ、拡大縮小されているように見えます。バックグラウンドスレッドが完了し、uiimageviewがアニメーションの準備ができていることを確認しようとしています。 –

+0

さらに、setImageは同期的に読み込まれますが、UIImageViewは画像を非同期的に拡大します.....その中には欠点があります。 –

1

[UIImageView setImage:]は非同期ではありません。メッセージが返される直前です。ビューにイメージが即座に表示されない場合は、おそらく怠惰なUIImageコードが原因です。私の推測では、[UIImage imageNamed:]はバンドル内のファイルを参照し、イメージデータが要求された後にのみロードします。これはまだあなたがどこかでそれを描画する必要がイメージをロードするトリガーしない場合

[bgImageView.image CGImage]; 

:あなたはそれをCGImageメッセージを送信することにより、ロードするために画像を強制的に試みることができる

UIGraphicsBeginImageContext((CGSize){1, 1}); 
[bgImageView drawInRect:(CGRect){{0, 0}, {1, 1}}]; 
UIGraphicsEndImageContext(); 
+0

bgImageViewはdrawInRectに応答しませんが、bgImageView.imageは応答します。残念なことに、いずれのコードブロックも、イメージが本当に準備完了/スケーリング/ロードされるのを同期待機するようには思えません。 –

+0

画像がロードされているかもしれませんが、スケーリングが完了していない可能性があります。画像のサイズは1.5MBです。 –