4

わかりました、皆さん、

あちこち検索しましたが、問題の解決策が見つからないようです。

ボタンの背景にかなりの画像を使用して、UIButton のカスタムの外観を取得し、アプリの全体的なサイズを縮小しようとしています。これは正しいことのように思われるからです。

ただし、ボタンに画像を設定しようとすると、ボタンがすべて奇妙に見え、角が通常の UIButton の標準の角の半径と一致しません。

いくつかの異なるサイズの画像を作成しようとしましたが、何もうまくいかないようです。

キャップが均一であることを知っており、それに加えて1ピクセルの中央を伸ばす必要があります。

私の UIButton の高さは 44 です。高さ 44 ピクセル、幅 21 ピクセルで、デフォルトのボタンと同じ丸みを帯びた角の半径を持つ画像を作成し (アスピリン カプレットが好きです)、背景画像を次のように設定するとします。

UIImage *btnImage = [UIImage imageNamed:@"buttontest1.png"];
UIImage *newImg = [btnImage stretchableImageWithLeftCapWidth:10 topCapHeight:0];

角が一致せず、奇妙に広く伸びて見え、ボタンの高さが伸びます!

StretchableImagewithLeftCapWidth が非推奨であることは知っていますが、 resizableCapWithInsets の使用は私にとってさらに意味がありません。それをしようとすると、ボタンの画像が何度も繰り返されるように見えます。

誰かが私が間違っていることを理解できますか? このがらくたを簡単に説明している場所はありますか?私はそれを得ることができないようです。

ありがとう!-TJ

編集 - resizableImageCapWithInserts を使用した後に画像を追加して結果を表示します。うまくいくと思われる例がいたるところにあるので、それらは典型的ではありませんが、例は私にとっては決してうまくいきません。ここに画像を追加する方法を見つけたので、これが役立つかもしれません。

私の PNG ファイル幅 21 ピクセル、高さ 29 ピクセル 幅 21 ピクセル、高さ 39 ピクセルの PNG ファイルを次に示します。

私のコードの結果 これは、次のコードを使用して背景画像を設定した結果です。

[self.button1 setBackgroundImage:[[UIImage imageNamed:@"buttontest4.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)] forState:UIControlStateNormal];

私が理解しているように、これは 21 ピクセル幅の画像の左 10 ピクセルと右 10 ピクセルをそのままコピーし、中央の 1 ピクセルを横に伸ばす必要があります。この奇妙な繰り返しを取得します。隣のBTNと同じサイズである必要があります。

これが私のXcodeレイアウトです: Xcode レイアウト

どの画像を使用しても、同様の結果が得られます。

私は明らかにここで何かを怒らせているわけではありません。

これまでの回答に感謝します。少し霧が少なくなってきました。

TJ

EDIT2: 画像 21px x 44px で cap insets メソッドを使用したサンプルを表示します。

ストーリーボードでデザインした場合、4 つのボタンはすべて高さ 44px です。

両方のボタンの高さ 44px ご覧のとおり、オレンジ色のボタンは両方とも、スケール比較のために白いボタンよりも大きくなっています。

上がボタン1、下がボタン2です。

UIImageResizingModeStretch のオプションの resizingMode パラメータを使用して、より近づける方法を見つけました。

ただし、ボタンが本来よりも大きいことに注意してください。

ボタン画像を設定するコードは次のとおりです。

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

[self.button1 setBackgroundImage:[[UIImage imageNamed:@"buttontest1a.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal];

[self.button2 setBackgroundImage:[[UIImage imageNamed:@"buttontest1a.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch]  forState:UIControlStateNormal];
}

(10,10,10,10) で上部の画像を実行すると、以前のように画像の上部を繰り返さない画像が得られます。一番上の画像はオプションのサイズ変更パラメーターを使用していないことを知っています。これは、それぞれが何を得るかを確認するためのテストであるためです。

さて、事態をさらに複雑にします。一番上のボタンのサイズを 43 に設定すると、画像よりも 1 ピクセル小さくなり、オプションのサイズ変更パラメーターを使用して呼び出しを行うと、ボタンのサイズが適切でないことを除けば、ほぼ完璧な結果が得られます。

ここで一体何が起こっているのですか?

私の厚い頭蓋骨を通して知識を叩き込もうとしているすべての人に感謝します. TJ

ボタン 43 と 44

4

3 に答える 3

7

UIEdgeInsetsは頭を包むのが少し難しいですが、より現代的な使用法です。それがどのように機能するかを説明します。基本的に、4つのオフセットを使用して、画像を9つのスライスに分割します。これがどのように見えるかをイメージしたい場合は、このページの「スケーラブルエリア」セクションをご覧ください(注:Android用ですが、概念は同じです。Androidが最初にそれを行っていました)。画像を通る4本の線に気付くでしょう。これらは、4つの挿入図に対応します。したがって、左から右、上から下の9つのセクションは次のようになります。

  1. X:0->左インセット、Y:0->上インセット
  2. X:左インセット->(幅-右インセット)、Y:0->上インセット
  3. X :(幅-右インセット)->幅、Y:0->上部インセット
  4. X:0->左インセット、Y:上インセット->(高さ-下インセット)
  5. X:左インセット->(幅-右インセット)、Y:上インセット->(高さ-下インセット)
  6. X :(幅-右のはめ込み)->幅、Y:上のはめ込み->(高さ-下のはめ込み)
  7. X:0->左の挿入図、Y :(高さ-下の挿入図)->高さ
  8. 左のはめ込み->(幅-右のはめ込み)、Y :(高さ-下のはめ込み)->高さ
  9. X :(幅-右のはめ込み)->幅、Y :(高さ-下のはめ込み)->高さ

セクション1、3、7、および9が設定されており、ストレッチされません。
セクション2と8は水平方向にのみ伸びます
セクション4と6は垂直方向にのみ伸びます
セクション5は両方向に伸びます。

iOS 6の新機能として、モードを選択できます。伸縮可能なタイルを引き伸ばすか、繰り返して希望の効果を得ることができます(色などは引き伸ばされ、テクスチャは繰り返されます)。

于 2012-10-01T01:19:44.877 に答える
5

UIEdgeInsets を試す

[button setBackgroundImage:[[UIImage imageNamed:@"buttontest1.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal];
于 2012-10-01T00:41:24.230 に答える
1

2016 年の方法は、この時点で WWDC2016 ビデオ 213 で説明されていることを実行することです: https://developer.apple.com/videos/play/wwdc2016-213/?time=1084 アセットを拡張できます。今回はリンクだけですみません。詳しくは後ほどご紹介します。ビデオの手順は、せいぜい 1 ~ 2 分です。つまり、Xcode のアセット スライサー ツールを使用して、画像が UIButton の背景として使用されるときに、画像のどの部分が引き伸ばされるべきでないかを定義します。UIButton は、丸みを帯びたエッジなどを歪めることなく、任意のサイズに拡張できます。

于 2016-11-25T01:51:11.247 に答える