3

画像をスクロールビューに動的に追加しました。コードは次のとおりです。

-(void)displayimages {
    for (int i=0; i<[featuredarray count]; i++) {
        NSString *image=[[featuredarray objectAtIndex:i]objectForKey:@"img"];

        if (i==0) {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*290+15, 0, 270, 380)];
        }
        else {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*290+15, 0, 270, 380)];
        }
        webview.backgroundColor=[UIColor clearColor];
        webview.layer.borderWidth=4;
        webview.layer.cornerRadius=4;
        webview.layer.borderColor=[[UIColor whiteColor]CGColor];
        [webview setTag:i];
        webview.userInteractionEnabled=YES;
        NSURL *url = [NSURL URLWithString:image];
        [webview setImageWithURL:url placeholderImage:[UIImage 
           imageNamed:@"placeholder.png"]];
        [scroll addSubview:webview];

        UITapGestureRecognizer *tap1 =
        [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlefirstTap:)];
        tap1.delegate=self;
        tap1.numberOfTapsRequired=1;
        [webview addGestureRecognizer:tap1];
        [tap1 release];
        [webview release];
   }

   pages.defersCurrentPageDisplay=YES;
   scroll.delegate =self;

   scroll.contentSize = CGSizeMake(290*[featuredarray count],300);
   scroll.pagingEnabled = YES;
   pages.numberOfPages = [featuredarray count]-1;
   pages.currentPage =0;
}

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
    CGRect frame = scroll.frame;
    frame.origin.x = frame.size.width-15*gallerypage;
    NSLog(@"frame.origin.x..%f",frame.origin.x);
    frame.origin.y =0;
    [scroll scrollRectToVisible:frame animated:YES];
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
    CGRect frame = scroll.frame;
    frame.origin.x=gallerypage*290;
    frame.origin.y =0;
    [scroll scrollRectToVisible:frame animated:YES];
}

pagecontrollerアクションを使用すると画像がうまく表示されます

-(IBAction)pagecontrolaction:(id)sender {
    int page = pages.currentPage;
    CGRect frame = scroll.frame;
    frame.origin.x=page*290;
    frame.origin.y =0;
    [scroll scrollRectToVisible:frame animated:YES];
}

しかし、イメージビューにタッチイベントを使用すると、画像がスムーズに表示されません。スクロール中に固まる。

これらは、現在の画像と 2 番目の画像の開始を示すプレビューです。

4

8 に答える 8

1

scrollViewWillBeginDecelerating と scrollViewDidEndDecelerating の 2 つのメソッドには、アニメーション化される x 位置が異なる 2 つのアニメーションが含まれています。

frame.origin.x = frame.size.width-15*gallerypage;

frame.origin.x=gallerypage*290;

scrollViewWillBeginDecelerating または scrollViewDidEndDecelerating のいずれかの機能をオフにできるとよいでしょう。それ以外の場合は、アニメーション化される x 位置を調整する必要があります (両方の関数で同期している必要があります)。

于 2013-06-30T12:46:35.290 に答える
0

You need to change your implementation for loading the images from a remote resource, thats where the biggest bottle neck lies.

I don't want to go into details but try to replace this line of code

[webview setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

With something more c.p.u friendly. Use a caching mechanism that employs multi-threading, what you want to do is move the heavy lifting (Downloading remote images) to another thread.

SDWebImage does a perfect job at this https://github.com/rs/SDWebImage If you are a bit hard core, you can roll your own multi-threaded image downloader using

[NSURLConnection sendAsynchronousRequest:queue: completionHandler:] 

And do the image loading in the block, Or even better dispatch_async(queu, block)

于 2013-07-03T12:11:56.660 に答える
0
if (i==0) {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*320, 0, 270, 440)];
        }
        else {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*320, 0, 270, 380)];
        }
于 2013-06-27T07:05:54.717 に答える
0

これは、画像のサイズ (MB) が大きく、特定のサイズにサイズ変更せずにそれに収まるために発生すると思いますCGRect。また、スクロールビュー内にロードした写真の数も重要です。多くの写真をロードすると、多くのメモリがあり、ゆっくりとスライドします。

于 2013-07-06T22:11:08.943 に答える
0

より大きなサイズの画像を表示しようとしているときに発生します。その場合、キャッシュを使用してそこに画像を取得し、そこから画像をロードしようとする必要があります。それを行うと、それは高速です。あなたは読むことができます

  1. 遅延読み込み

    2.ページングが有効になっています。

https://github.com/rs/SDWebImage

さらにヘルプが必要です。喜んでお手伝いします。

于 2013-07-07T04:40:28.747 に答える
0

SYPaginatorをチェックアウトする必要があります(SYPaginator は、遅延読み込みとビューのリサイクルを備えた水平方向の TableView です)。

複雑なタスクを簡単にするシンプルなページング スクロール ビュー。Hipstamatic、D-Series、IncrediBooth など、いくつかの Synthetic アプリでこれを使用しています。

より高いパフォーマンスが必要な場合は、MSCachedAsyncViewDrawingを試してください。

ビューを (a) UIImage に同期して描画し、キャッシュを使用して優れたパフォーマンスを実現できるようにするヘルパー クラス。

于 2013-07-03T12:36:00.217 に答える
0

スクロールを開始するときにフレームを設定する理由はわかりませんが、私があなたの場所にいた場合、以下のようにロジックを実行します。

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    // do nothing
}

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

    int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
    CGFloat xoffset = 290 * gallerypage;
    [UIView animateWithDuration:0.5
                     animations:^{
                         scrollView.contentOffset = CGPointMake(xoffset, 0);
                     } 
                     completion:^(BOOL finished){
                         NSLog(@"Done!");
                     }];
}

それが役に立てば幸い。

于 2013-07-07T09:22:45.290 に答える