0

UIViewサブクラスを作成し、UIBezierpathを使用して丸みを帯びた四角形を描画し、グラデーションで塗りつぶしています。

要するに、これはサブクラスの描画長方形がどのように見えるかです:

CGRect frame1 = //size of Frame 1

CGRect frame2 = //size of Frame 2



//gradientingStart
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

if (options == false) {
    self.color = [self createRandomColor];
}



NSArray *gradientColors = [NSArray arrayWithObjects:
                           (id)[UIColor colorWithHue:color saturation:saturationVal brightness:brightnessVal alpha:1].CGColor,
                           (id)[UIColor colorWithHue:color+0.04 saturation:saturationVal+0.15 brightness:brightnessVal-0.15 alpha:1].CGColor, nil];

CGFloat gradientLocations2[] = {0.25,1};
CGGradientRef gradient2 = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)gradientColors, gradientLocations2);
CGContextSaveGState(context);
//gradientingEnd

UIBezierPath *result =
[UIBezierPath bezierPathWithRoundedRect: frame1 cornerRadius:radius];
[result appendPath:
 [UIBezierPath bezierPathWithRoundedRect: frame2 cornerRadius:radius]];
[result setLineWidth:3];
[[UIColor blackColor]setStroke];
[result stroke];
[result fill];
[result addClip];
CGContextDrawLinearGradient(context, gradient2, CGPointMake(0, 0), CGPointMake(0, self.bounds.size.height), 0);

//important to prevent leaks
CGGradientRelease(gradient2);
CGColorSpaceRelease(colorSpace);
//-------
UIImage *texture = [UIImage imageNamed:@"texture2.png"];
[texture drawInRect:CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, self.bounds.size.height)];

これで、View Controllerでこのインスタンスをいくつか作成し、次のようなアニメーションでそれらを移動しようとしています。

[UIView animateWithDuration:0.5 delay:0 options:0 animations:^{
    costumview.alpha = 0;
    [costumview setFrame:CGRectMake(320,0,320,420)];
    [self reorderViewsFrom:costumview.intValue];
    overlay.alpha = 0;
}completion:^(BOOL finished){
}];

しかし、残念ながら、アニメーションは非常に遅いデバイス上にあり、より多くの(5-10)コスタムビューが表示されると、悪化します。

どうすればパフォーマンスを向上させ、スムーズなアニメーションを提供できますか?コスタムビューを変更することは、アプリケーションの感覚を損なうため、代替手段ではないと思います。コスタムビューをアニメーション化するためのより速い方法はありますか?

4

2 に答える 2

1

drawRectメソッドは非常に強力です。これらのグラデーションと丸みを帯びたエッジの描画はパフォーマンスが高いルーチンであり、アニメーションで画像のフレームを変更するため、drawRectが頻繁に呼び出されます。

描画四角形内にNSLogを追加し、カスタムビューをアニメーション化したときにNSLogが呼び出される回数を確認します。驚かれるかもしれません。

あなたは使用してみることができます:

view.layer.shouldRasterize = YES

このようにして、アニメーション化する前にカスタムビューのビットマップをレンダリングします。フレームの変更を再度アニメーション化した後、drawRectを再度呼び出し、shouldRasterizeを無効にする必要があります。

shouldRasterizeの詳細については、こちらをご覧ください。

https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instp/CALayer/shouldRasterize

于 2012-08-16T16:41:57.233 に答える
0

CALayer 変換 (角を丸くする) を使用するとラグが発生することを指摘しましたが、これは私が投稿したスニペットにはありませんでした。

独自の uiview サブクラスで角を丸くすることでそれを回避しました。これにより、アプリがよりスムーズになります。これらすべてのラスタライゼーションは私にとってはうまくいきませんでした...

于 2012-08-31T00:22:57.547 に答える