3

UIScrollView のパフォーマンスの問題を回避するために、QuartzCore を使用せずに丸みを帯びた角を UIImageView に追加したいので、次のように解決しました。

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)];
    [path addClip];

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [[UIScreen mainScreen] scale]);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(UIGraphicsGetCurrentContext( ),kCGBlendModeClear); CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);
    CGContextAddPath(context,path.CGPath);
    CGContextClip(context);
    CGContextClearRect(context,CGRectMake(0,0,width,height));

    [_image drawInRect:rect];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

悲しいことに、drawRect で呼び出されると、UIScrollView でのスクロール中に遅延が発生するため、処理時間が少しかかります。したがって、dispatch_async を使用して別のスレッドでこれを処理しようとしました。これによりラグが解消され、すべてがスムーズに機能するようになりました。しかし今、私は別の問題を抱えています。スレッドが画像処理を非同期で開始するときに GraphicsContext が常に存在するとは限らないため、デバッガーで多くの無効なコンテキスト メッセージが表示されます。無効なコンテキスト メッセージを取得せずに、画像の丸みを帯びた角を処理する方法はありますか? QuarzCore の cornerRadius またはマスク関数を使用したくないことに注意してください。

4

2 に答える 2

5

あなたは必要以上の仕事をしています。「無効なコンテキスト」メッセージは、 を呼び出す[path addClip]前に を呼び出すことによって発生しますUIGraphicsBeginImageContextWithOptions()。はスレッドのUIBezierPath現在のグラフィック コンテキストにアクセスしようとしますが、まだ設定していません。

同じ結果を得る簡単な方法を次に示します。まったく使用する必要がないことに注意してくださいCGContext

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)];
[path addClip];

[_image drawInRect:rect];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2013-05-12T20:12:48.417 に答える
1

パフォーマンスの問題を回避するために、QuartzCore を使用せずに丸みを帯びた角を UIImageView に追加したい

1 つの方法は、UIImageView の角ではなく、画像の角を丸くすることです。ここで私の答えを見てください:

https://stackoverflow.com/a/8125604/341994

任意の UIImage から開始し、クリップされたコンテキストに描画して角を丸めます。これには「処理時間」がかからず、パフォーマンスの問題も発生しません。

(注:テーブル ビューやその他の非常に高速なスクロールまたはアニメーションの状況では、丸みを帯びた角の透明度が原因でパフォーマンスの問題が発生する可能性があります。動く形状を常に背景に合成しなければならないという事実に関係しています. 背景が単色で、それがどうなるかを事前に知っている場合は、角が丸くなっている不透明な画像を作成する方が効率的です.背景の色があります。)

于 2013-05-12T20:34:33.147 に答える