質問
iPhone UI にカスタム ボタンを追加しているところですが、Apple アプリのようなガラスのような外観にしたいと考えています。デフォルトのガラスの適切な画像はありますが、必要な色合い (赤、緑、青など) ごとに個別の画像を用意する必要があるのは嫌です。
グレースケール PNG をロードして、希望の色に調整する方法はありますか?さらに良いことに、カスタム イメージをまったく読み込まずに Apple のガラスのような外観を得る方法はあるでしょうか?
解決
私が知っているワンライナーの方法はありませんが、デフォルトのグレースケール画像を取得してそれを合成することで、目的の効果を得ることができるかもしれません(つまり、単色の上に描画します。Core Graphics のドキュメントに目を通すと、十数種類の異なる合成方法 (カラー バーンなど) があり、それらの組み合わせによって希望の効果が得られることがわかります。
他のヒント
少し遅れましたが、私のような人がこの種の情報を検索する場合に備えて、次のようにします。使う UISegmentedControl
ボタン 1 つで次のように設定します momentary
, 、そしてそれを設定します tintColor
. 。この方法では、色の数だけ PNG を準備する必要がなく、フレームワークがすべてのレンダリングを処理します。
例:
UISegmentedControl *cancelButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Cancel"]];
[cancelButton setSegmentedControlStyle:UISegmentedControlStyleBar];
[cancelButton setTintColor:[UIColor colorWithRed:0.8 green:0.3 blue:0.3 alpha:1.0]];
[cancelButton setMomentary:YES];
[cancelButton addTarget:self action:@selector(didTapCancel:) forControlEvents:UIControlEventValueChanged];
[self addSubview:cancelButton];
[cancelButton release];
いつも素晴らしい「Cocoa With Love」サイトにサンプルがあります。 CoreGraphic で光沢グラデーションを描画する
iPhone UI については知りませんが、単一の PNG を使用してカラーバリエーションのグラフィックスを作成できます。
つまりこれらのページの両方のロゴ (左上):
これを使って PNG
代替テキスト http://47degrees.com/images/logos/47_degrees.png
背景色をガラス状にするための色合いとして設定する必要があると思います。
私はこれを実行しましたが、非常にうまく機能します。
iOS:グレースケール PNG に RGB フィルターを適用する
ただし、これは不正行為であり、加算しているため、(たとえば) 各ピクセルの赤の成分については、 R_dest = R_src + R_tint となります。
たとえば、きめ細かい制御が必要な場合は、RGB コンポーネントを (適切な重み付けで) 平均して各ピクセルのグレースケール値を抽出し、この値に色合いを乗じて、結果の色がグレースケール(Sr) になるようにすることができます。 ,Sg,Sb) * {Tr,Tg,Tb}
これには、メモリのチャンクを作成し、このチャンクに描画するビットマップ コンテキストを作成し、このコンテキストに画像を描画し、安全に保管するためにメモリ チャンク全体をコピーし、コピーからデータを取得して元のバッキング ストアを変更して処理する必要があります。元のバッキング ストアからイメージを抽出し、割り当てたものをすべて解放します。
RGBA ピクセル バイト データから UIImage を再構成する際の問題
このライブラリはすべてを行ってくれます。最も効率的な方法ではありませんが、仕事は完了します。iirc 彼は calloc を使用すべきときに malloc を使用します。
結局、連絡先編集ビューの [連絡先を削除] ボタンで使用されるレンダリングとほぼ一致する独自のカスタム ボタンを作成することになりました。
興味のある方は、github で見つけることができます。