0

ここに問題があります。すべてのページに 6 つの画像を表示するフォト ビューアー アプリを作成し、スクロール ビュー ページ コントロールを使用します。

しかし、多くのサブビューに追加すると遅延が発生するため、問題が発生しました。そして、私はそれを処理する方法がわかりません。

ここに私のコードがあります:

HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
HUD.labelText = @"Loading...";
HUD.mode = MBProgressHUDAnimationFade;
[self.view addSubview:HUD];
self.navigationItem.leftBarButtonItem.enabled = NO;

const CGFloat itemWidth    = 160.0f; //panjang
const CGFloat itemHeight   = 127.0f;
const CGFloat buttonWidth  = 157.0f; //panjang button
const CGFloat buttonHeight = 125.0f; //tinggi button
const CGFloat marginHorz   = (itemWidth - buttonWidth)/3.0f;
const CGFloat marginVert   = (itemHeight - buttonHeight)/2.0f;

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:storyUrl];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    jsons = JSON;
    NSString *urll;

    int index = 0;
    int row = 0;
    int column = 0;

    //start
    for(id item in jsons){

        //[self.button removeFromSuperview];

        if ([item objectForKey:@"img_medium"] == [NSNull null]) {

            urll=[item objectForKey:@"img_medium"];

        }else{

            urll=[item objectForKey:@"img2_medium"];

        }


        button = [UIButton buttonWithType:UIButtonTypeCustom];

        UIImageView *imgggg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, buttonWidth , buttonHeight)] ;
        [imgggg setImageWithURL:[NSURL URLWithString:urll] placeholderImage:[UIImage imageNamed:@"no_photo.png"]];


        [button addSubview:imgggg];
        button.tag = index;

        //button placing
        button.frame = CGRectMake(column*itemWidth + marginHorz, row*itemHeight + marginVert, buttonWidth, buttonHeight);
        [button addTarget:self
                   action:@selector(switchView:)
         forControlEvents:UIControlEventTouchUpInside];

        NSLog(@"offset but %f",column*itemWidth + marginHorz);
        NSLog(@"column %d",column);
        NSLog(@"row %d",row);
        //UIImage *pic = [UIImage imageNamed:@"1.jpg"];

        UILabel *labeling = [[UILabel alloc] initWithFrame:CGRectMake(0, 80, 157, 45)];
        [labeling setBackgroundColor:[UIColor colorWithWhite:0 alpha:0.45]];
        [labeling setText:[item objectForKey:@"title"]];
        [labeling setTextAlignment:NSTextAlignmentCenter];

        labeling.numberOfLines = 0;
        [labeling setTextColor:[UIColor whiteColor]];
        [labeling setFont:[UIFont boldSystemFontOfSize:12.0]];

        //UIImageView *img = [[UIImageView alloc] initWithImage:pic];
        //[img setFrame:CGRectMake(0, 0, 50, 50)];
        [button addSubview:labeling];
        [scrollView addSubview:button];

        index++;
        row++;

        if (row == 3) {
            row = 0;
            column++;
        }

        NSLog(@"index %d",index);

    }
    //end

    [MBProgressHUD hideHUDForView:self.view animated:YES];
    self.navigationItem.leftBarButtonItem.enabled = YES;
    [self listSubviewsOfView:scrollView];

    //end block ui
    //[[UIApplication sharedApplication] endIgnoringInteractionEvents];

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    [MBProgressHUD hideHUDForView:self.view animated:YES];
    self.navigationItem.leftBarButtonItem.enabled = YES;

    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:nil message:@"Request Time Out" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    [errorAlert show];
    //end block ui

    //[[UIApplication sharedApplication] endIgnoringInteractionEvents];

}];
[operation start];
4

3 に答える 3

0

scrollView の子ビューの CALayer の拡大と縮小のためのすべての補間方法をデフォルトlinearからnearestNeighborに切り替えます。これにより、非常に迅速なアップスケーリングとダウンスケーリングが可能になり、ズーム完了ブロックで以前の状態に戻すことができます (UI を最も滑らかに見せるには、トライリニアをお勧めします) / gfx)

Apple が速度の最適化のためにすべてのアプリでこの方法を行っていることを考えると、これは UIScrollView のデフォルトではないことに驚いています。

于 2016-09-01T03:24:39.497 に答える
0

少し前に私も同じ問題に直面し、PSTCollectionViewを使用しました。アプリが iOS6 未満で実行されている場合は PSTCollectionView を使用し、iOS6 より上で実行されているアプリの場合は UICollectionView を使用するという非常に優れた機能があります。

于 2013-03-12T07:22:44.173 に答える
0

ビューのリサイクルを実装する必要があるようです。scrollView を実装しているため、UITableView は UIScrollView のサブクラスであり、多くのセルを実装しています。セルを再利用してメモリを管理します。

ここにあなたが読みたいかもしれないドキュメントがあります。

于 2015-02-20T06:38:33.943 に答える