web-dev-qa-db-ja.com

UIButtonはiPhoneのAspect Fitに移動しません

いくつかのUIButtonsがあり、IBではAspect Fitに設定されていますが、何らかの理由で常に伸縮しています。他に設定する必要があるものはありますか?さまざまなビューモードをすべて試してみましたが、どれも機能せず、すべて拡張されています。

97
marty

私は前にその問題があったことがあります。 UIImageViewの設定が実際に機能するcontentModeに画像を置き、その上に透明なカスタムUIButtonを置くことで解決しました。

編集:この答えは時代遅れです。 iOSの最新バージョンでの正しい答えについては、 @ Werner Altewischer's answer を参照してください。

43
Dan Ray

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

224

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

Xibでボタンを選択し、user defined runtime attributes

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

Click here to see more clearly the solution

そこで数値を使用できないので、数値を使用します。ただし、UIViewContentModeScaleAspectFitは1です。

48

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

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

imageview.contentMode = 1

21
averydev

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

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
12
Ahmed Elashker

ボタンの後ろのUIImageViewに画像を置くと、UIButtonなどのadjustsImageWhenHighlightedクラスの組み込み機能が失われます。そしてadjustsImageWhenDisabled、そしてもちろん、異なる状態に異なる画像を設定する機能(これを自分でやるという手間をかけずに)。

画像すべての制御状態で非表示が必要な場合、次の方法のように、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];

これにより、すべての制御状態で画像が伸縮するのを防ぐことができます。うまくいきましたが、うまくいかない場合はお知らせください!

注:ここではUIButtonに関連する問題に取り組んでいますが、insideButton:insideView:、または画像を収めたいものになります。

6

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

トリックは、それを単なるイメージとして設定し、@ ayreguitarのテクニックを適用することです。

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
6
Joe Barbour

Swiftの別の答えは次のとおりです。

myButton.imageView?.contentMode = .ScaleAspectFit
4
João Neves

いくつかの異なる答えを1つのソリューションに結合します。カスタムタイプのボタンを作成し、ボタンのimageView contentModeプロパティを設定し、ボタンの画像を設定します(背景画像ではなく、まだ塗りつぶされます)。

//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)
4
Swindler

これは私のために働いた

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

コメントしてくれた@ayreguitarに感謝

4
Karan Alangat
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
3
selaband

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

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

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

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

@end



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

UIButtonWithImageAspectFit: create and set image


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

UIButtonWithImageAspectFit: set custom class

できました!
の代わりに
UIButton without image aspect fit
ボタンの画像の縦横比が期待どおりになりました。
UIButton with image aspect fit

2
Guillaume

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()


    }

}
1
João Nunes

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

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
1
ninjaneer

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

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

カスタムUIButton(私が知る限り)にはコンテンツがありません(角丸長方形のボタンはコンテンツを使用してレンダリングされる場合があります)。ボタンにはサブビューがあります:背景UIImageView、画像UIImageView、およびタイトルUILabel。サブビューにcontentModeを設定することで望みどおりに動作するかもしれませんが、UIButtonビュー階層をいじるのは少し難しいです。

1
tc.

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

  • ボタンのcontentModeUIImageView.ScaleAspectFitに設定します。これは、Interface Builderの「User Defined Runtime Attributes」で実行できます(つまり、self.imageView.contentMode 、Number、1)またはUIButtonサブクラス。
  • 「サブビューの自動サイズ変更」を無効にします。
  • 「Edge」を「Image」に設定し、「Inset」に適切な「Top」および「Bottom」の値を設定します(私のように、PDFを画像として使用した場合のみ必要)。
1
plindberg

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

interface builder

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

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}
0
Motine

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

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

0
Alice

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

0
Soohwan Park

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

0
Hila