1

少し遅れたアニメーションがあり、これに絞り込みました。

アニメーションの一部として、aUIScrollViewは自動スクロールされます。サブビューはロードされているように見えますが、スクロールビューの境界外にある場合は、drawRect:アニメーション化されて表示領域に戻るときに、これらのビューで呼び出されます(drawRect:これらのビューのそれぞれに独自のサブビューを実装しています)。これが私のアニメーションを途切れさせている理由です。

スクロールビューのサブビューごとにshouldRasterizeをtrueに設定しましたが、違いはありません。UIScrollViewスクロールビューの境界を超えた場合でも、各ビューを強制的にメモリに保持するにはどうすればよいですか?

4

2 に答える 2

1

描画コードをdrawrectから他のメソッドに移動します。ビューのコンテキストにレンダリングする代わりに、画像コンテキストにレンダリングします。このメソッドを描画コードの先頭に追加して、画像コンテキストを作成します。

UIGraphicsBeginImageContextWithOptions(
   CGSize size,
   BOOL opaque,
   CGFloat scale
);

次のように使用します。

UIGraphicsBeginImageContextWithOptions(
   self.bounds.size,
   NO,       //if you are doing rounded corners or anything, else YES
   0.0       //Scales automatically for retina displays
);

//Need a reference to the context you just made?
CGContextRef ctx = UIGraphicsGetCurrentContext();

CG描画コードは通常どおり機能します。次に、コンテキストを画像にレンダリングします

UIImage * renderedImage = UIGraphicsGetImageFromCurrentImageContext();

することを忘れないでください

UIGraphicsEndImageContext();

必要なときに一度だけ描画する場所から、この描画コードを呼び出します。これらは、オーバーライドできるメソッドの候補です。

- (void)willMoveToSuperview:(UIView *)newSuperview //called when adding to a view
- (void)layoutSubviews  //called when first displayed, on frame change and after setNeedsLayout has been called.

次に、それらの画像をビューに設定します。ボタンがある場合は、UIButtonをサブクラス化する必要があります。- (void)setImage:(UIImage *)image forState:(UIControlState)stateこれで、Et voila、performaceができます!

于 2013-01-09T13:56:03.367 に答える
0

私はあなたがこれを間違った方向に進んでいると思います。UIScrollViewにサブビューに描画するかどうかを指示させる代わりに、それは進むべき道ではありません。Appleは、キューイングシステムを作成することにより、UITableViewsでこの問題を修正しました。まだ再利用できるサブビューがない場合は、サブビューをキューに入れます。

私は約1年前に自分のコレクションビューを書きました、そしてそれは私が下がらなければならなかった道です。また、新しいサブビューを作成するのではなく、サブビューを再利用するため、メモリを節約できます。

もっと複雑なことは理解していますが、間違いなく問題は解決します。

Appleからのこのコードをチェックしてください、彼らは似たようなものを使用しています。

https://developer.apple.com/library/ios/#samplecode/PhotoScroller/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010080

于 2013-01-09T13:08:08.793 に答える