web-dev-qa-db-ja.com

UIButtonはコンテンツモード設定をリッスンしませんか?

firstButtonは、カスタムタイプのUIButtonです。私はプログラムでテーブルの各セルにそれらの3つを配置しています。

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

他の場所では、clipToBoundsに伝えています。私が取得するのは、画像のアスペクトスケールレンダリングではなく、画像の中央の正方形のトリミングです。 firstButton.imageViewでmodeプロパティを設定するなど、この方法も試しましたが、これも機能していないようです。

87
Dan Ray

同じ問題がありました。この質問は少し古いものですが、他の人(私のような人)が検索結果にポップアップ表示されたときにそれを保存するために、明確で正しい答えを提供したいと思います。

検索と実験に少し時間がかかりましたが、解決策が見つかりました。 UIButton内にある「非表示」ImageViewのContentModeを設定するだけです。

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

多分それはダン・レイが彼の受け入れられた答えでほのめかしたことですが、私はそうではないと思います。

182
Dave

UIButtonの画像(backgroundImageではなく)を扱っている場合、UIButton自体またはそのimageViewでcontentModeを設定しても効果はありません(他の答えにかかわらず)。

または、代わりにこれを行います:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

または、それに応じて画像のサイズを変更します。

または、UITapGestureRecognizerが添付されたUIImageView(contentModeを適切に尊重する)、またはその上の透明なUIButtonを使用します。

65
Alfie Hanssen

ボタン自体にcontentModeを設定するのではなく、contentHorizontalAlignmentcontentVerticalAlignmentのプロパティを設定し、(重要な)ボタンのcontentModeimageViewを設定します。あらゆる種類のアスペクトフィルまたはフィット。以下に例を示します。

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

もちろん、ボタンの画像をボタンの上部に揃えるなど、他のこともできます。アスペクトの塗りつぶしやフィットが必要ない場合は、それだけで配置を設定できます。

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

Swiftでは、次のものを使用します。

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

これは、自動レイアウトを備えた最新バージョン(つまり、iOS 4からiOS 11+まで)を含む、iOSのすべてのバージョンで機能します。

45
Chris Nolet

数時間の混乱の後、iOS 3.2で動作するようになりました。 duskerが述べたように、setImageの代わりにsetBackgroundImageを使用することは私にとっては仕事でした。

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];
7
Pierre

答えは、必要な素敵なコンテンツモード設定をすべて備えたUIImageViewを使用し、その上にカスタムボタンを重ねることです。一度にすべてを実行することはできませんが、できないように見えます。

6
Dan Ray

これに対する修正が見つかりました。 adjustsImageWhenHighlightedUIButtonプロパティをNOに設定します。

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

お役に立てれば。以下にコメントしてください、私はあなたが持っている質問についてフォローアップします。

4
iOSDevSF

私の答えは、キューバのものに似ています。イメージをプログラムで設定する必要がありました。

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}
3
ninjaneer

私のために働いた唯一の解決策:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
3
Tariq

Swift

self.firstButton.imageView?.contentMode = .scaleAspectFill
3
Vaibhav Saran

ここではシンプルなインターフェイスビルダーの問題があると思います。明らかに、IBは、イメージプロパティを設定した後、コンテンツモードの変更を無視します。

解決策は簡単です:コンテンツモードを設定し、以前に設定したイメージ名を削除し(すべての状態、デフォルト、強調表示などで削除することを確認してください)、必要なすべての状態で目的のイメージ名を再入力します-etvoilà 。

1
JohnPayne

SetImageの代わりにsetBackgroundImageを試してください

1
dusker

また、ボタンが押されたときに画像の奇妙な変形を避けるために、adjustsImageWhenHighlightedUIButtonプロパティを確認することをお勧めします。

0
MonsieurDart

UIButtonがレイアウト制約設定をリッスンしていないように見える場合は、画像がボタンサイズよりも大きいかどうかを確認してください。 Retina解像度には、常に@ 2xおよび@ 3x画像を使用します。

0
Totoro

これを理解しようとして、時間が経つにつれて私のメソッドが少しハックされ、UIButtonをサブクラス化し、setHighlightedをオーバーライドしました。

私にとっては、画像のアルファを.5にノックダウンするだけです。なぜなら、それらは黒い背景の上にあるからです。

ただし、[super setHighlighted:](イメージストレッチコードが実行されているように見える)をコメントアウトした場合にのみ機能します。ただし、正常に動作しています。作業を続けていくと、どのように保持されるかがわかります。

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}
0
jankins

IOS 6とiOS 7およびストーリーボードで機能する回答を探している人がいる場合:

ストーリーボードで画像を設定できます:

enter image description here

その後:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}
0
Jakub