web-dev-qa-db-ja.com

UIEdgeInsetsMakeはどのように機能しますか?

私はUIEdgeInsetsMakeresizableImageWithCapInsetsを使用するアプリを作成していますが、どのように機能するか理解できません。UIEdgeInsetsMakeには4つの引数があります。

しかし、それらはフロートなので、それを画像に設定する方法がわかりません、ありがとう! :D

59
pmerino

ドキュメントによると:

このメソッドを使用して、画像にキャップインセットを追加したり、画像の既存のキャップインセットを変更したりします。どちらの場合も、新しい画像を取得し、元の画像はそのまま残ります。

画像のスケーリングまたはサイズ変更中、キャップで覆われた領域はスケーリングまたはサイズ変更されません。代わりに、各方向のキャップで覆われていないピクセル領域は、画像のサイズを変更するために、左から右および上から下に並べて表示されます。この手法は、同じ角の丸い角を保持しているが、中央領域が必要に応じて拡大または縮小する可変幅ボタンを作成するためによく使用されます。最高のパフォーマンスを得るには、サイズが1x1ピクセルのタイル領域を使用してください。

したがって、UIEdgeInsetsMake関数の値で伸縮不可能にしたいピクセルの量だけを使用する必要があります。

21x50ポイントの画像(標準定義では21x50ピクセル、Retina "@ 2x"定義では42x100ピクセル)があり、この画像を水平方向に伸縮可能にしたい場合、ただし中央で1ポイント幅のバンドのみをストレッチします。次に、UIEdgeInsetsMake(0,10,0,10)を使用します。

それらがフロートであることを気にしないでください(たとえば、サブピクセルのサイズ変更に役立ちますが、実際にはおそらく整数(または小数部分のないフロート)のみを使用します)

これはiOS5 +専用の方法であり、以前のiOS5では使用できません。 iOS5以前のSDKを使用する場合は、stretchableImageWithLeftCapWidth:topCapHeight:代わりに。


[EDIT]いくつかのtipUIEdgeInsets構造体のフィールドがどの順序で—引数をUIEdgeInsetsMake関数に渡す順序—私は "指定されたinits"構文 の使用を好みます:

UIEdgeInsets insets = { .left = 50, .right = 50, .top = 10, .bottom = 10 };

または、明示的なキャストが必要な場合:

UIImage* rzImg = [image resizableImageWithCapInsets:(UIEdgeInsets){
   .left = 50, .right = 50,
   .top = 10, .bottom = 10
}];

特に異なる境界線/方向を混在させないようにするために、読みやすくしています!

70
AliSoftware

しかし、それらはフロートなので、それを画像に設定する方法がわかりません

これはUIImageインスタンスメソッドです。したがって、resizableImageWithCapInsetsを使用して画像に作成する方法は、そのメッセージto画像(UIImage)を送信することから始めます。

クールな新機能:エッジのインセットがすべてゼロの場合、画像がタイル化されることに注意してください。これは、背景画像を受け入れるものの背景として機能します。 UIImageViewでも機能します。

10
matt

UIEdgeInsetsMakeに関する私のすべての概念をクリアしたこの記事を読むだけです。

iOS:UIEdgeInsetsMakeで伸縮可能なボタンを作成する方法

3
Azhar