1

ダイアログに必要なサイズに拡大縮小するダイアログ境界線を実装したいと思います。おそらく、この種のものにはもっと慣習的な名前があります。もしあれば、誰かがタイトルを編集するなら、それは素晴らしいことです。

とにかく、これを実行したいので、ボーダーアートを小さい、大きい、または奇抜な不均衡な寸法にスケーリングすることに伴う視覚的なアーティファクトなしで、任意のサイズのダイアログを作成できます。これがどのように行われるかについていくつかのアイデアがありますが、どちらがiphoneに適しているかはわかりません。少し質問があります。

1)基本的にdrawRectメソッドをオーバーロードし、メソッドが呼び出されたときに適切な縮尺で画像を描画する包含ビューオブジェクトを作成する必要がありますか、それとも単に8つのUIImageViewを含む包含ビューオブジェクトをメインにする必要がありますか?アニメーションのように、結果のダイアログクラスをアクティブにスケーリングする必要がある場合は、後者のアプローチは機能しないと思います。

1b)drawRectのオーバーロードが進むべき道である場合、誰かがdrawRect()から直接画像を描画することを示すサンプルコードまたは例へのリンクを持っていますか?

2)一般的に作成する方が良いですか

a)セグメントが画像の適切な1x1グリッドにある3 x 3画像?もしそうなら、この画像の一部からdrawRectのターゲットビューに描画するのは簡単ですか(前者の仮定が正しい場合は、drawRectを使用する必要があります)?

b)8つの異なるファイルに別々にピース?

更新:明確にするために、アイデアは、カスタマイズされたボーダーアートを使用し、2、4、6、および8番目のセル(3x3セルグリッド内)を拡大して、これらのアセットだけで任意のサイズのボーダーを形成できるようにすることです。プレーンな画像だけを伸ばすと角が歪むので、必要に応じて偶数のセルを伸ばして角をくっつけて歪まないようにしたいと思います。私はこれが以前に行われたのを見たので、それは標準的なものであり、私がそれを呼んだもの以外の標準的な名前を付けているのではないかと思いました。

とにかく、コンテナに8つのUIImageViewを追加することは、drawRectでその場でUIImageを描画するほど効率的ではないため、Yを変換およびスケーリングするために必要な変換をコンテキストに適用した後、CGContextDrawImage()を使用してそのアプローチを採用しました。この関数は、画像の左下隅から描画しますが、左上のUIViewに描画すると、Y軸が反転せずに画像が上下逆になります。drawAtPointのようなUIImage関数を使用するという提案も同様に機能しますが、UIImageはUIViewsと同じ方向に描画されるため、反転することをお勧めします。前者を使用して実装を継続し、それがどのように行われるかを確認しますが、もう1つ質問があります。

誰かがこれらのアプローチのどれがより効果的で、より速いかなどを知っているでしょうか?

4

2 に答える 2

2

フォローするかどうかはわかりませんが、これが私のベストショットです...

drawRect:を使用するか、個々のUIImageViewを親ビューに追加するかは、完全にあなた次第です。UIImageViewは、カプセル化された機能を無料で提供しますが、それ以外の点では、外観に関しては同じです。

drawRectルートを使用する場合は、UIImageのdrawAtPoint:メソッドを使用する必要があります。あなたがそれを置きたい場所のために数学をして、それを描きなさい。親ビューの寸法に基づいてポイントを計算できます。

拡大縮小に関しては、拡大縮小せずにこれらの画像のサイズを変更することは不可能です。そのため、事前に計画を立てて、元の画像を予想以上に大きくすることを計画します。

それが少し役立つことを願っていますか?

乾杯

于 2010-05-18T23:23:59.607 に答える
1

ダイアログボックスに境界線が必要な場合は、ボックスがUIView(またはサブクラス)であると想定して、レイヤーの境界線プロパティを設定し、システムに境界線を描画させます。

#import <QuartzCore/QuartzCore.h> 
// ... 

view.layer.borderWidth = 2;
view.layer.borderColor = [UIColor whiteColor].CGColor; 
view.layer.cornerRadius = 0;  // 0=square corners, >0 for rounded
于 2010-05-18T23:31:43.520 に答える