私はいくつかのUIButtonを持っていますが、IBではそれらはAspect Fitに設定されていますが、何らかの理由で常に伸縮しています。他に設定する必要があるものはありますか?私はすべての異なる表示モードを試しましたが、どれも機能せず、すべて伸びています。
私はいくつかのUIButtonを持っていますが、IBではそれらはAspect Fitに設定されていますが、何らかの理由で常に伸縮しています。他に設定する必要があるものはありますか?私はすべての異なる表示モードを試しましたが、どれも機能せず、すべて伸びています。
回答:
私は以前にその問題を抱えていました。設定が実際に機能するUIImageViewに画像を配置し、その上にcontentMode透明なカスタムを配置UIButtonすることで解決しました。
編集:この答えは時代遅れです。最新バージョンのiOSでの正しい答えについては、@ Werner Altewischerの答えを参照してください。
解決策はcontentMode、のimageViewプロパティをに設定することUIButtonです。これUIButtonを機能させるには、カスタムタイプでを作成する必要があります(それ以外の場合nilは、このプロパティに対して返されます)。
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
                    button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
                    この方法は私にとってはうまくいきました。
でXIBボタンやセットを選択user defined runtime attributes:
self.imageView.contentModeNumber1
enumは使用できないため、数値を使用しています。ただし、UIViewContentModeScaleAspectFitは1です。
extension UIButton {     @IBInspectable var imageContentMode: Int {         get {return imageView?.contentMode.rawValue ?? 0}         set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit}     } }
                    imageView.contentModeで私のために働いた!
                    contentModeにはボタンのimageViewを使用します。ボタン自体には直接ありません。
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];UIImageViewボタンの後ろに画像を配置すると、組み込みの機能が失われます。UIButtonadjustsImageWhenHighlightedとadjustsImageWhenDisabled、やなどクラスの失われます。もちろん、さまざまな状態にさまざまな画像を設定できます(これを自分で行う必要はありません)。
すべての制御状態で画像を展開しない場合はimageWithCGImage:scale:orientation、次のメソッドのように、1つの方法は、を使用して画像を取得することです。
- (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:場合もあるでしょう。
しばらく前にこの問題がありました。私が抱えていた問題は、この効果を限られたバックグラウンドのUIButtonに適用しようとしていたため、簡単に調整できないことでした。
トリックは、それを単なる画像として設定してから、@ ayreguitarの手法を適用することです。
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];いくつかの異なる答えを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)この回答は@WernerAltewischerの回答に基づいています。
ボタンをIBOutletに接続してコードを実行しないようにするために、UIButtonのクラスをサブクラス化しました。
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
次に、xibにカスタムボタンを作成し、その画像(背景画像ではない)を設定します。

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

完了です!
ボタンの画像のアスペクトフィットの
代わりに

、期待どおりにフィットします。

ios 12.コンテンツAlignmentも追加する必要があります
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()
    }
}UIViewコンテンツモードは、対応するCALayerの「コンテンツ」に適用されます。コンテンツが対応するUIImageViewに設定されているため、これはsで機能します。CALayerCGImage
drawRect: 最終的には、レイヤーコンテンツにレンダリングされます。
カスタムUIButton(私の知る限り)にはコンテンツがありません(角丸四角形のボタンはコンテンツを使用してレンダリングされる場合があります)。ボタンにはサブビューがあります。背景UIImageView、画像UIImageView、タイトルUILabelです。contentModeサブビューにonを設定すると、望みどおりの結果が得られますが、UIButtonビューの階層をいじるのは少々ノーノーです。
これは他の多くの回答と重複していますが、私にとっての解決策は
contentModeのをUIImageViewボタンにするために.ScaleAspectFit-のいずれかInterface Builderでの「ランタイムユーザー定義属性」を行うことができます(。すなわちself.imageView.contentMode、数、1)またはでUIButtonサブクラス;