3

次のいずれかを実行せずに丸みを帯びた UIImages を描画する方法はありますか?

  1. ブレンディング (コア アニメーション インストゥルメントの赤)
  2. オフスクリーン レンダリング (コア アニメーション インストゥルメントの黄色)
  3. drawRect

私はもう試した

  1. クリッピング パスを持つ drawRect。これでは遅すぎます。(参照: http://developer.apple.com/library/ios/#qa/qa1708/_index.html )
  2. maskLayer を含む CALayer コンテンツ。これにより、オフスクリーン レンダリングが導入されます。
  3. UIImageView と、cornerRadius と maskToBounds の設定。これは#2と同じ効果があります。

私の最後の手段は、画像を直接変更することです。助言がありますか?

4

2 に答える 2

3

blog.sallarp.com の角丸アルゴリズムのバリエーションを使用します。私は特定の角だけを丸くするように私のものを修正しました.これはシームレスな統合のためのカテゴリですが、そのリンクは基本的なアイデアを提供します. これは、拒否された手法の 1 つである「オフスクリーン レンダリング」に該当する可能性があると思いますが、完全にはわかりません。目に見えるパフォーマンスの問題は見たことがありませんが、異常な状況が発生している可能性があります。

イメージビューの上に角だけのイメージビューを重ねて、角が丸く見えるようにできますか?

または、角を丸くすることによるパフォーマンスへの影響が懸念される場合は、アプリに角を丸くした画像のコピーを保存させてみませんか? 「画像を直接変更する」という考えと同じですが、ジャストインタイムで実行してください。

アップデート:

要するに、私は他の解決策を知りません(私の不器用なアイデア、以下のポイント#2を除いて)。しかし、私はいくつかの実験を行い(同様の問題を扱っているため)、次の結論に達しました。

  1. 3GS以降のデバイスで丸め性能がある場合、問題は角の丸めではない可能性があります。3G では UI に重大な影響がありましたが、3GS ではほとんど目立たず、それ以降のデバイスでは感知できませんでした。角が丸くなっているためにパフォーマンスの問題が発生している場合は、それが丸みであり、それ以外のものではないことを確認してください。以前にキャッシュされた画像の角をジャストインタイムで丸めた場合、丸めによる影響はごくわずかであることがわかりました。(そして、キャッシュする前に丸めを行ったとき、UI はシルクのように滑らかでした。)

  2. マスキングの代わりに、丸みを帯びた角を反転した画像を作成し (つまり、角の背景と一致し、画像を透かして表示したい場所を透明にします)、この画像を tableviewcell の画像の前に配置します。 . これを機能させるには、カスタム セルを使用する必要があることがわかりました (たとえば、独自のメイン イメージ ビュー コントロール、独自のラベル、およびこのコーナー マスク イメージ ビュー コントロールを作成します)。コーナー丸めアルゴリズムの呼び出し。グループ化されたテーブルの角を丸くしようとしている場合、これはうまくいかないかもしれませんが、実際には角を丸くせずに角を丸くしたいだけの場合は、ちょっとしたハックです。

  3. グループ化されたテーブルビューを使用しているために角を丸くしており、丸みを帯びた角からはみ出す画像が気に入らない場合は、最初の行の画像の左上隅と最後の画像の左下隅を単純に丸めることができます。 . これにより、コーナーの丸めロジックの呼び出しが減少します。見た目もいいです。

  4. これについて質問していないことは知っていますが、テーブルビューの画像に関するその他の考えられるパフォーマンスの問題には次のものがあります。

    • imageWithContentsOfFileで(キャッシュしない)のようなものを使用している場合cellForRowAtIndexPath、パフォーマンスの問題が確実に発生します。キャッシングを利用できない場合imageNamed(とにかく不満を言う人もいます)、ジャストインタイムまたはセカンダリ スレッドで事前にイメージをプリロードして、自分でイメージをキャッシュすることができます。テーブルビューが以前に読み込まれた画像を参照している場合、パフォーマンスが大幅に向上しますが、その時点で角の丸みが問題になる場合とそうでない場合があります。

    • パフォーマンスの問題の他の原因には、テーブルビューのイメージビューに最適なサイズではないイメージの使用が含まれます。大きな画像は、パフォーマンスに劇的な影響を与えました。

  5. 要するに、

    • ここで自殺する前に、丸めが唯一のパフォーマンスの問題であることを確認してください。これは、最近のハードウェアで問題が発生している場合に特に当てはまります。私の経験では、影響はごくわずかだったからです。さらに、より広い解決策がより良い場合に、これについてあまりにも多くの睡眠を失うのは残念です. サイズが最適化されていない画像の使用、画像のキャッシュの失敗などはすべて、パフォーマンスに劇的な影響を与えます。

    • 可能であれば、事前に画像の角を丸くすると、UI が最適になり、ビュー コントローラーのコードが素晴らしくシンプルになります。

    • 事前に実行できない場合 (たとえば、画像をリアルタイムでダウンロードするため)、コーナー マスキング画像トリックを試すことができますが、これは特定の状況でのみ機能します (ただし、グループ化されていないテーブルビューはその 1 つです)。 )。

    • UI の進行中に角を丸める必要がある場合は、別のキューで角の丸めを行い、UI をブロックしないでください。

于 2012-07-04T01:48:56.727 に答える
1

それが私がしていることであり、そのパフォーマンスには概ね満足しています。

UIImageView *iv=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"769-male"]];
UIGraphicsBeginImageContextWithOptions(iv.bounds.size, NO, [UIScreen mainScreen].scale);
[[UIBezierPath bezierPathWithRoundedRect:v.bounds cornerRadius:s] addClip];
[image drawInRect:v.bounds];
v.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2014-01-17T00:06:59.030 に答える