110

私はいくつかのUIButtonを持っており、IBではそれらはAspect Fitに設定されていますが、何らかの理由でそれらは常に伸びています。他に設定しなければならないことはありますか?私はすべての異なる表示モードを試しましたが、どれも機能せず、すべてストレッチします。

4

21 に答える 21

243

解決策はcontentMode、 のimageViewプロパティでを設定することUIButtonです。これUIButtonが機能するには、カスタムタイプで作成する必要があります(そうでない場合nilは、このプロパティに対して返されます)。

于 2010-10-22T10:10:12.810 に答える
63

この方法は私にとって非常にうまくいきました。

Xibでボタンを選択し、次のように設定しますuser defined runtime attributes

  • キーパス:self.imageView.contentMode
  • タイプ:Number
  • 価値:1

ソリューションをより明確に表示するには、ここをクリックしてください

そこでは列挙型を使用できないため、数値を使用します。しかし、UIViewContentModeScaleAspectFit は 1 です。

于 2016-03-08T09:35:10.403 に答える
46

私は以前にその問題を抱えていました。UIImageView設定が実際に機能するに画像を配置し、その上にcontentMode透明なカスタムを配置することで解決しました。UIButton

編集:この回答は廃止されました。最新バージョンの iOS での正しい答えについては、@Werner Altewischer の答えを参照してください。

于 2010-08-11T17:02:26.303 に答える
23

これを Interface Builder で行っている場合は、ランタイム属性インスペクターを使用して、コードなしで直接設定できます。

ボタンのキー パスを「imageView.contentMode」に設定し、タイプを「Number」、値を「1」に設定します (または任意のモード)。

imageview.contentMode = 1

于 2017-02-10T22:42:02.290 に答える
17

ボタンの imageView を contentMode に使用します。ボタン自体に直接ではありません。

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
于 2016-09-11T20:30:25.990 に答える
6

画像をUIImageViewボタンの後ろに配置すると、 やUIButtonなどのクラスの組み込み機能が失われ、もちろん、さまざまな状態にさまざまな画像を設定する機能が失われます (これを自分で行う手間がかかりません)。adjustsImageWhenHighlightedadjustsImageWhenDisabled

すべての制御状態に対して画像をストレッチしない場合、1 つのアプローチはimageWithCGImage:scale:orientation、次の方法のように、を使用して画像を取得することです。

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

これを実装するには、次のように記述します。

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

これにより、すべてのコントロール状態で画像が伸びるのを防ぐことができます。それは私にとってはうまくいきましたが、そうでない場合はお知らせください!

注:ここでは、 に関連する問題に対処しUIButtoninsideButton:いますがinsideView:、 、または画像を適合させたいものであれば何でもかまいません。

于 2010-12-14T13:17:39.450 に答える
6

私はしばらく前にこの問題を抱えていました。私が抱えていた問題は、この効果を背景の UIButton に適用しようとしていたことでした。これは制限されているため、簡単に調整できないことを意味します。

トリックは、それを単なる画像として設定し、@ayreguitar のテクニックを適用することです。これで修正されるはずです!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
于 2013-11-04T01:33:59.143 に答える
4

迅速な代替回答は次のとおりです。

myButton.imageView?.contentMode = .ScaleAspectFit
于 2015-11-29T16:04:21.697 に答える
3

iOS 12。コンテンツの配置も追加する必要があります

class FitButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)


    }

    override func layoutSubviews() {
        self.imageView?.contentMode = .scaleAspectFill
        self.contentHorizontalAlignment = .fill
        self.contentVerticalAlignment = .fill
        super.layoutSubviews()


    }

}
于 2015-02-10T14:53:51.957 に答える
3
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
于 2016-03-18T08:06:04.747 に答える
2

この回答は、 @WernerAltewischer の回答に基づいています。

ボタンを IBOutlet に接続してコードを実行することを避けるために、UIButton のクラスをサブクラス化しました。

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



次に、xib にカスタム ボタンを作成し、その画像を設定します (背景画像ではありません)。

UIButtonWithImageAspectFit: 画像の作成と設定


次に、クラスを設定します。

UIButtonWithImageAspectFit: カスタム クラスの設定

あなたは終わった! ボタンのイメージ アスペクトの
代わりに、期待どおりにフィットするようになりました。
画像縦横比のない UIButton

画像アスペクト フィットの UIButton

于 2014-06-26T09:10:52.087 に答える
1

UIView コンテンツ モードは、対応する CALayer の「コンテンツ」に適用されます。コンテンツを対応するUIImageViewに設定するため、これは s に対して機能します。CALayerCGImage

drawRect:最終的にレイヤーコンテンツにレンダリングされます。

カスタムUIButton(私が知る限り) にはコンテンツがありません (丸みを帯びた四角形のスタイルのボタンは、コンテンツを使用してレンダリングされる場合があります)。ボタンには、 background UIImageView、 image UIImageView、および title というサブビューがありますUILabelcontentModeサブビューに を設定すると、必要なことが行われる場合がありますが、UIButtonビュー階層をいじるのは少し面倒です。

于 2010-08-11T18:18:34.763 に答える
1

これは他の多くの回答と重複していますが、私にとっての解決策は

  • contentModeボタンのUIImageViewを– に設定します.ScaleAspectFit。これは、Interface Builder の「ユーザー定義ランタイム属性」(つまりself.imageView.contentMode、Number、1) またはUIButtonサブクラスで実行できます。
  • 「サブビューの自動サイズ変更」を無効にします。
  • 「Edge」を「Image」に設定し、「Inset」に適切な「Top」と「Bottom」の値を設定します(これは、私のように PDF を画像として使用する場合にのみ必要になる場合があります)。
于 2016-05-17T16:57:40.120 に答える
1

変更UIButton.imageView.contentModeしてもうまくいきませんでした。
画像を「背景」プロパティに設定することで問題を解決しました。
必要に応じて比率制約を追加できます

于 2015-12-24T02:53:59.627 に答える
1

画像のサイズが比例して変更されないという問題があったため、修正方法はエッジインセットを使用していました.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
于 2012-06-07T07:45:33.377 に答える
0

@Guillaume と同様に、UIButton のサブクラスを Swift-File として作成しました。次に、Interface Builder でカスタム クラスを設定します。

インターフェースビルダー.

そして、ここに Swift ファイル:

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}
于 2016-08-09T13:38:21.640 に答える
0

上記のように imageWithCGImage を使用できます (ただし、括弧がありません)。

また、何百万もの非 4.0 の電話は、そのコードではまったく動作しません。

于 2010-12-20T04:47:27.603 に答える
0

[button sizeToFit]私のために働いた。

于 2012-07-17T15:42:32.673 に答える
-1

私は同じ問題を抱えていましたが、動作させることができませんでした (おそらく SDK のバグです)。

最終的に、回避策として、UIImageViewボタンの後ろに配置し、必要なオプションを設定してから、その上に空白を配置しましUIButtonた。

于 2010-08-11T17:03:57.370 に答える