95

firstButton は Custom 型の UIButton です。したがって、テーブルの各セルに3つをプログラムで配置しています。

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

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

4

17 に答える 17

188

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

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

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

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

于 2010-07-19T13:14:54.560 に答える
77

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

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

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

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

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

于 2014-03-04T22:29:24.287 に答える
59

contentModeボタン自体に を設定するのではなく、あらゆる種類のアスペクト フィルまたはフィットのボタンのプロパティと (重要なことに)contentHorizontalAlignmentを設定する必要があります。contentVerticalAlignmentcontentModeimageView

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

ボタンの画像を上に揃えるなど、他のこともできます。縦横の塗りつぶしやフィットが必要ない場合は、配置を単独で設定できます。

button.contentVerticalAlignment = .top
于 2011-10-30T10:09:43.477 に答える
7

数時間の混乱の後、iOS3.2で動作させる方法は次のとおりです。ダスカーが述べたように、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];
于 2010-10-02T14:20:54.260 に答える
6

答えは、UIImageView を必要な素敵なコンテンツ モード設定とともに使用し、その上にカスタム ボタンを重ねることです。ばかげていますが、それをすべて 1 回のショットで行うことはできませんが、できないようです。

于 2010-06-04T14:52:44.253 に答える
4

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

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

お役に立てれば。以下にコメントしてください。ご不明な点がございましたら、フォローアップいたします。

于 2012-06-10T04:44:54.420 に答える
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;
}
于 2014-03-06T07:22:37.117 に答える
3

スイフト3

self.firstButton.imageView?.contentMode = .scaleAspectFill
于 2017-09-05T06:41:57.153 に答える
1

ここには単純なインターフェースビルダーの問題があると思います.image-propertyを設定した後、IBはコンテンツモードの変更を無視するようです.

解決策は簡単です:コンテンツモードを設定し、以前に設定された画像名を削除します(すべての状態、デフォルト、強調表示などで必ず削除してください)。次に、必要なすべての状態で目的の画像名を再入力します-そして、出来上がり.

于 2013-01-19T20:18:37.733 に答える
1

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

于 2010-06-01T14:48:25.320 に答える
1

iOS 15 および Xcode 13 でこれが発生している場合は、この他の質問の Matt の回答を参照してください。

Xcode の動作が変更され、UIButtons がライブラリからplainスタイルにデフォルト設定されるようになりました。これにより、子イメージが期待どおりにスケーリングされなくなります。

于 2021-10-22T02:02:58.927 に答える
0

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

于 2010-10-07T16:54:20.647 に答える
0

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

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

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

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

//    [super setHighlighted:highlight];
}
于 2012-02-28T21:19:50.187 に答える
0

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

于 2016-09-20T04:56:45.380 に答える