1

私は uiview の複数のスタックを作成しようとしています。これらの UIView のそれぞれには、影、わずかな回転、およびスケールがあります。テストとして、10 ビューの 10 スタックを作成しています。これをすべて描画するのは非常に遅い..これを最適化する良い方法はありますか? 画像から影と背景を作成しようとしましたが、それは醜く、同じくらい遅くなりました。これらのスタックを UIScrollView に入れました

   for (int k = 0; k < 9; k++) {

    for (int i = 0; i < 9; i++) {

        UIView *stack = [[UIView alloc] initWithFrame:CGRectMake((i * 106), (k * 106), 110, 110)];

        for (int i = 0; i < 10; i++) {

            CardView *cardView = [[CardView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];

            //cardView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"card_background.png"]];

            cardView.layer.shadowOffset     = CGSizeMake(0, 0);
            cardView.layer.shadowOpacity    = 0.3f;
            cardView.layer.shadowPath       = [UIBezierPath bezierPathWithRect:(CGRect){CGPointZero, cardView.layer.bounds.size}].CGPath; // Set shadow path, without this the performance is *really* bad
            cardView.transform              = CGAffineTransformMakeRotation(((arc4random() % 20) - 10.0f) / 100.0f);
            cardView.transform              = CGAffineTransformScale(cardView.transform, 0.35, 0.35);
            cardView.layer.shouldRasterize  = YES;
            cardView.layer.rasterizationScale = 0.5;

            cardView.center = CGPointMake(55, 55);

            [stack addSubview:cardView];
        }

        [_backgroundView addSubview:stack];
    }

}

編集 1; いくつか試してみましたが、ラスター化を無効にしてもあまり効果がありません。シャドウを無効にしてもあまり効果がありません。回転とスケーリングは、この多くの uiview にも依存しています。非同期描画 (一度に 1 つのスタック) はオプションですか?

編集 2; とにかく、100個のUIViewを作成するのは遅いと思います。より良い解決策を見つけたら報告します(非同期かそのようなものだと思います)

4

2 に答える 2

1

これらの画像を何らかのアニメーションで使用していますか? そうでない場合は、ラスタライズをオフにしてパフォーマンスを向上させることができます。

cardView.layer.shouldRasterize  = NO;
于 2013-05-23T20:56:18.953 に答える
1

影は非常に計算集約的です。そうshouldRasterizeでない場合はUIImage、影の を作成し、ビューのサイズを変更できる場合は、 で画像をロードしresizableImageWithCapInsetsます。

于 2013-05-23T20:56:30.183 に答える