2010-11-25 22 views
4

UIImageViewで画像をロードしていますが、これをUIScrollViewに追加しています。 イメージはローカルイメージで、高さが約5000ピクセルです。UIScrollviewでUIScrollviewを大きな画像ブロックスレッドで追加する

UISmrollViewをUIScrollViewに追加すると、スレッドがブロックされるという問題があります。 これを行うと、画像が表示されるまでUIScrollViewをスクロールできないので、明らかです。

例を示します。

UIScrollView *myscrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1004)]; 
myscrollview.contentSize = CGSizeMake(7680, 1004); 
myscrollview.pagingEnabled = TRUE; 

[self.view addSubview:myscrollview]; 

NSString* str = [[NSBundle mainBundle] pathForResource:@"APPS.jpg" ofType:nil inDirectory:@""]; 
NSData *imageData = [NSData dataWithContentsOfFile:str]; 
UIImageView *singleImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:imageData]]; 

    //the line below is the blocking line 
[scrollView addSubview:singleImageView]; 

これは、スクロールをブロックする最後の行です。私がそれを残すと、イメージはもちろん表示されていないという事実を除いて、すべてが完璧に動作します。

マルチスレッドを使用するとUIViewの操作がうまくいかないことを思い出しています。だから私はうんざりしています。

ご協力ありがとうございます。

答えて

0

なぜ巨大なイメージを一度にメモリにロードしたいのですか?多くの小さなイメージに分割し、動的にロード/フリーにします。

+0

あなたのフィードバックのお寄せいただきありがとうございます。私は雑誌のアプリケーションの一部であるため、この作業を行っています。イメージは実際にはスナップなしで垂直スクロールを必要とする記事です。 –

+0

ありがとうございます。私はまだUssrollviewがUIをブロックせずにコンテンツをレンダリングすることが可能でなければならないと信じています... –

+0

ユーザがスクロールしているときに、いくつかの画像をあらかじめロードする必要があります。 UIScrollViewDelegateプロトコルとscrollViewDidScrollのようなメッセージを見てください。あなたはユーザーの活動を制御することができ、いつロード/アンロードする必要があるのか​​を知ることができます。 –

1

これらの大きな画像を提供している場合は、CATiledLayerをチェックアウトする必要があります。

これらが自分のイメージではなく、それらをダウンサンプリングしたり、タイルに分割できない場合は、イメージをバックグラウンドスレッドで描画することができます。メインスレッドではなくメインスレッド上のスクリーングラフィックスコンテキストに描画することはできますが、非スクリーングラフィックスコンテキストに描画することはできません。

  • あなたがイメージをロードし、描画完了したら:あなたのバックグラウンドスレッドでは、あなたは

    • はあなたのdrawRectで、画面上に描くのと同じように、その上に自分の画像を描画CGBitmapContextCreate
    • と描画コンテキストを作成することができますあなたは完全にメモリ内のコンテキストにあなたの画像を描画した後、方法、それを画面にコピーします。performSelectorOnMainThreadを使用して、メインスレッド上のメソッド::withObject:waitUntilDone:あなたのビューののdrawRectで

    ビューののdrawRectを呼び出しますCGBitmapContextCreateImageを使用してCGContextDrawImageです。

    これは簡単なことではありません。適切なタイミングでバックグラウンドスレッドを開始し、画像へのアクセスを同期させる必要があります。CATiledLayerのアプローチは、それを動作させるための画像。

  • +0

    ありがとうアダム!私はCATiledLayerアプローチを試みます。私はこれに戻ります:-) –

    0

    UIImageViewをUIImageなしで割り当てて、UIScrollViewにサブビューとして追加してみてください。

    別のスレッドでUIImageをロードし、別のスレッドでメソッドを実行して、イメージがメモリにロードされたときにUIImageViewのイメージプロパティを設定します。また、あなたはおそらくメモリに目を維持し、可能性のあるオブジェクトをUIImageに便利なコンストラクタを使用しての用心(またはおそらく30メガバイト+

    UIScrollView *myscrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1004)]; 
    myscrollview.contentSize = CGSizeMake(7680, 1004); 
    myscrollview.pagingEnabled = TRUE; 
    
    [self.view addSubview:myscrollview]; 
    
    NSString* str = [[NSBundle mainBundle] pathForResource:@"APPS.jpg" ofType:nil inDirectory:@""]; 
    UIImageView *singleImageView = [[UIImageView alloc] init]; 
    
    [scrollView addSubview:singleImageView]; 
    
    //Then fire off a method on another thread to load the UIImage and set the image 
    //property of the UIImageView. 
    

    になりますUIImageにロードされ、このサイズの画像として、いくつかのメモリの問題が発生します

    また、このコードは現在どこで実行されていますか?

    関連する問題