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


91

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

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

他の場所では、clipToBoundsに指示しています。表示されるのは、画像の縦横比のレンダリングではなく、画像の中央の正方形のトリミングです。私はfirstButton.imageViewにモードプロパティを設定するなど、さまざまな方法を試しましたが、これも機能しないようです。


1
以下のクリス・ノレットによる解決策を参照してください:button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

UIViewContentModeScaleAspectFitにはcontentVerticalAlignmentとcontentHorizo​​ntalAlignmentの両方の設定が必要であることを示すstackoverflow.com/a/28205566/481207を参照してください。
Matt

回答:


186

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

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

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

たぶん、ダンレイが彼の受け入れられた答えでほのめかしていたのかもしれませんが、私はそうではないと思います。


1
いいえ、そうではありませんでした。私が解決した解決策は、UIImageViewを使用して画像を保持し、次にその上に「カスタム」タイプの明確で透明なUIButtonを使用することでした。
ダン・レイ

Dave、少なくともiOS 3.2では、あなたのソリューションは私にはうまくいかないようです。「無料で」クリックして画像の強調表示を取得したいと思っていたので、残念です。contentModeを設定している場所でbutton.imageViewがnilでないことを確認し、contentModeを設定した後で、あなたが行っているように画像を設定しました。
ジャック

2
明確にするために、「機能しない」とは、「イメージがフル解像度で表示され、期待していたとおりに縮小されない」ことを意味します。
ジャック

ジャック、上記はiOS 4.xで動作します。残念ながら、v3.2ターゲットでビルドすると、「サイズを変更できない」問題を再現できます。UIButtonビューのフレームサイズを変更しようとしましたが、それも役に立たなかったようです。うん。
Dave、

4
以下のクリス・ノレットによる解決策を参照してください:button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

74

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

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

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

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

または、UITapGestureRecognizerがアタッチされたUIImageView(contentModeを適切に尊重する)、またはその上にある透明なUIButtonを使用するだけです。


4
これはiOS 7の私の場合には機能しますが、他のすべてのものは機能しません。
バイト

5
contentHorizo​​ntalAlignmentとcontentVerticalAlignmentを設定するのが正しいソリューションです。説明については、stackoverflow.com / a / 28205566/481207を参照してください。
Matt

1
これが私が探していた答えです。
忍者

4
この答えは間違っています。あなたはやる設定する必要がcontentMode上のimageViewあなたは他の回答が明らかにしたとして、アスペクト塗りつぶしやフィットのいずれかの種類をしたい場合。参照:stackoverflow.com/a/7944316/746890
Chris Nolet、2018

49

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

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のすべてのバージョンで機能します。


2
ありがとう、クリス-私の問題を解決しました。むしろ、私の画像を上端から少しだけ後退させるために、contentEdgeInsetsと組み合わせて解決しました。
Rob Reuss、2012

7

数時間の混乱の後、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];

6

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


4

これに対する修正を見つけました。のadjustsImageWhenHighlightedプロパティをUIButtonに設定しますNO

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

お役に立てれば。以下にコメントしてください。質問があればフォローアップします。


これは完璧なソリューションです。
Gaurav 2013

動作しません。これは単にボタンが強調表示されるのを防ぎます。
Matt

4

私の答えはクバのそれに似ています。プログラムで画像を設定する必要がありました。

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

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

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


1

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


3
Hmp。A、それはばかげています。コンテンツのコンテンツモード設定を尊重する必要がありますよね。そして、B、それはまだモード設定を尊重していないようです-それは今「ストレッチ」(この場合、より「スクイーズ」のようです)にロックされており、そのアスペクトに関してコンテンツをスケーリングしていません比率。
Dan Ray

1

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

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


1
同じことがプログラムで設定されたコンテンツモードにも
当てはまり

0

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


0

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

私にとっては、黒の背景にあるため、画像のアルファを0.5にノックダウンするだけで機能します。

ただし、[super setHighlighted:](画像の伸縮性のあるコードが実行されているように見える)をコメントアウトした場合にのみ機能します。これは、これを解決する正しい方法とはまったく思われません...すべてがでもうまくいきます。作業を続けていくうちに、それがどのように維持されるかを見ていきます。

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

//    [super setHighlighted:highlight];
}

1
オフチャンスでは、これが適切であると誰もが思うと、ボタンをハイライト表示することができなかったUIScrollViewにボタンを配置するまで、上記の方法は問題なく動作するように見えました。
jankins

0

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

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

ここに画像の説明を入力してください

その後:

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

0

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


0

これらの2つ(最初は見つけにくい)は、ボタンのサイズに合わせてUIButtonイメージを引き伸ばします。

ここに画像の説明を入力してください ここに画像の説明を入力してください

コードではなく、常にストーリーボードで設定するようにしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.