2012-05-11 7 views
0

ページビューでスクロールビューを実装して、一部の画像(グラフ)をフルページ(iPhoneにインストールされているフォトアプリ)のようにスクロールできます。画像スクロールビューがクラッシュする

私はアプリケーションのための小さな変更を加えた古典的な3ページのソリューションを使用する以下のコードを見つけましたが、たとえ "動作"してもスクロールが遅くなることが多く、アプリケーションがクラッシュします。

ARCオプションを有効にしてXcode 4.2を使用し、iPadデバイスで両方をテストしています。 イメージ(10 jpg)は2048x1539で、平均サイズは200/250Kbです。

問題の原因を見つけるのに役立つ人はいますか?

おかげで、 コラード

const int numImages = 10; 
const float kPageWidth = 1024.0f; 
const float kPageHeight = 768.0f; 


- (void)viewDidLoad { 
[super viewDidLoad]; 

    scroll.contentSize = CGSizeMake(kPageWidth * numImages, kPageHeight); 
imageview1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kPageWidth, kPageHeight)]; 

imageview2 = [[UIImageView alloc] initWithFrame:CGRectMake(kPageWidth, 0, kPageWidth, kPageHeight)];  

imageview3 = [[UIImageView alloc] initWithFrame:CGRectMake(kPageWidth * 2, 0, kPageWidth, kPageHeight)]; 

scroll.contentOffset = CGPointMake(0, 0); 

[imageview1 setImage:[UIImage imageNamed:@"grafico_0.jpg"]]; 
imageview1.contentMode = UIViewContentModeScaleAspectFit; 
[imageview1 setTag:1]; 

imageview2.contentMode = UIViewContentModeScaleAspectFit; 
[imageview2 setTag:2]; 

imageview3.contentMode = UIViewContentModeScaleAspectFit; 
[imageview3 setTag:3]; 

[scroll addSubview:imageview1]; 
[scroll addSubview:imageview2]; 
[scroll addSubview:imageview3];   
} 


- (void)scrollViewDidScroll:(UIScrollView*)scrollView { 

const CGFloat currPos = scrollView.contentOffset.x; 
const NSInteger selectedPage = lroundf(currPos * (1.0f/kPageWidth)); 
const NSInteger zone = 1 + (selectedPage % 3); 
const NSInteger nextPage = selectedPage + 1; 
const NSInteger prevPage = selectedPage - 1; 

/// Next page 
if (nextPage < numImages) 
{ 
    NSInteger nextViewTag = zone + 1; 
    if (nextViewTag == 4) 
     nextViewTag = 1; 

    UIImageView* nextView = (UIImageView*)[scrollView viewWithTag:nextViewTag];  
    nextView.frame = (CGRect){.origin.x = nextPage * kPageHeight, .origin.y = 0.0f, kPageHeight, kPageWidth}; 

    NSString *str = [NSString stringWithFormat:@"grafico_%d.jpg", nextPage]; 
    UIImage* img = [UIImage imageNamed:str]; 
    nextView.image = img; 
} 


/// Prev page 
if (prevPage >= 0) 
{ 
    NSInteger prevViewTag = zone - 1; 
    if (!prevViewTag) 
     prevViewTag = 3; 

    UIImageView* prevView = (UIImageView*)[scrollView viewWithTag:prevViewTag];  
    prevView.frame = (CGRect){.origin.x = prevPage * kPageHeight, .origin.y = 0.0f, kPageHeight, kPageWidth}; 

    NSString *str = [NSString stringWithFormat:@"grafico_%d.jpg", prevPage]; 
    UIImage* img = [UIImage imageNamed:str]; 
    prevView.image = img; 
} 

} 

答えて

1
その方法は、画像をキャッシュして、あなたのアプリケーション内で複数回使用して小さな画像にのみ使用する必要がありますので、あなたは、あなたの大きな画像をロードするため imageNamed:を使用しないでください

(ボタンの画像など)。この方法は、多くの大きな画像で使用するとメモリの問題を引き起こすことで有名です。

代わりにimageWithContentsOfFile:に切り替えてください。その方法で画像をロードすると、画像がキャッシュされず、その画像を使用しなくなってからメモリが解放されます。

スクロールが低迷すると思われる場合は、performSelectorInBackgroundを使用してバックグラウンドスレッドへのイメージのロードを移動することができます

[self performSelectorInBackground:@selector(retrieveImageData:) withObject:imagePath]; 
UIImageのロードは、この方法で起こる

- (void)retrieveImageData:(NSString *)imagePath { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 
    [self performSelectorOnMainThread:@selector(imageDataRetrieved:) withObject:image waitUntilDone:NO]; 
    [pool release]; 
} 

メインスレッド上のUIImageViewへのイメージの添付(UI操作はバックグラウンドスレッドで行われてはなりません):

- (void)imageDataRetrieved:(UIImage)*image { 
    yourImageView.image = image; 
} 
+0

ありがとうございます。ImageNamedをimageWithContentsOfFileに置き換えました。スクロールがまだ遅い場合でもアプリケーションはクラッシュしません。 – Corrado

+0

私の答えに記載されているようにイメージを読み込みますか? 「スクロールが遅い」とはどういう意味ですか?新しい画像がロードされているときに1ミリ秒間スクロールが停止することはありますか?それとも、一度に1つの画像しかスクロールできないのですか? – joern

+0

私は画像間の遷移が遅いと思われることを意味します。画像のサイズを1024x768に縮小しました。画像が大きすぎます(2048x1539(250Kb)の画像が大きすぎますか?)。私はまた、あなたの第2の解決策を理解しようとしていますが、それは私には分かりません(これは私の最初のアプリです!)。 – Corrado

関連する問題