私はいくつかのUIButtonを持っており、IBではそれらはAspect Fitに設定されていますが、何らかの理由でそれらは常に伸びています。他に設定しなければならないことはありますか?私はすべての異なる表示モードを試しましたが、どれも機能せず、すべてストレッチします。
21 に答える
解決策はcontentMode
、 のimageView
プロパティでを設定することUIButton
です。これUIButton
が機能するには、カスタムタイプで作成する必要があります(そうでない場合nil
は、このプロパティに対して返されます)。
この方法は私にとって非常にうまくいきました。
Xibでボタンを選択し、次のように設定しますuser defined runtime attributes
。
- キーパス:
self.imageView.contentMode
- タイプ:
Number
- 価値:
1
そこでは列挙型を使用できないため、数値を使用します。しかし、UIViewContentModeScaleAspectFit は 1 です。
私は以前にその問題を抱えていました。UIImageView
設定が実際に機能するに画像を配置し、その上にcontentMode
透明なカスタムを配置することで解決しました。UIButton
編集:この回答は廃止されました。最新バージョンの iOS での正しい答えについては、@Werner Altewischer の答えを参照してください。
ボタンの imageView を contentMode に使用します。ボタン自体に直接ではありません。
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
画像をUIImageView
ボタンの後ろに配置すると、 やUIButton
などのクラスの組み込み機能が失われ、もちろん、さまざまな状態にさまざまな画像を設定する機能が失われます (これを自分で行う手間がかかりません)。adjustsImageWhenHighlighted
adjustsImageWhenDisabled
すべての制御状態に対して画像をストレッチしない場合、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];
これにより、すべてのコントロール状態で画像が伸びるのを防ぐことができます。それは私にとってはうまくいきましたが、そうでない場合はお知らせください!
注:ここでは、 に関連する問題に対処しUIButton
てinsideButton:
いますがinsideView:
、 、または画像を適合させたいものであれば何でもかまいません。
私はしばらく前にこの問題を抱えていました。私が抱えていた問題は、この効果を背景の UIButton に適用しようとしていたことでした。これは制限されているため、簡単に調整できないことを意味します。
トリックは、それを単なる画像として設定し、@ayreguitar のテクニックを適用することです。これで修正されるはずです!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
迅速な代替回答は次のとおりです。
myButton.imageView?.contentMode = .ScaleAspectFit
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()
}
}
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
この回答は、 @WernerAltewischer の回答に基づいています。
ボタンを IBOutlet に接続してコードを実行することを避けるために、UIButton のクラスをサブクラス化しました。
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
次に、xib にカスタム ボタンを作成し、その画像を設定します (背景画像ではありません)。
次に、クラスを設定します。
あなたは終わった!
ボタンのイメージ アスペクトの
代わりに、期待どおりにフィットするようになりました。
UIView コンテンツ モードは、対応する CALayer の「コンテンツ」に適用されます。コンテンツを対応するUIImageView
に設定するため、これは s に対して機能します。CALayer
CGImage
drawRect:
最終的にレイヤーコンテンツにレンダリングされます。
カスタムUIButton
(私が知る限り) にはコンテンツがありません (丸みを帯びた四角形のスタイルのボタンは、コンテンツを使用してレンダリングされる場合があります)。ボタンには、 background UIImageView
、 image UIImageView
、および title というサブビューがありますUILabel
。contentMode
サブビューに を設定すると、必要なことが行われる場合がありますが、UIButton
ビュー階層をいじるのは少し面倒です。
これは他の多くの回答と重複していますが、私にとっての解決策は
contentMode
ボタンのUIImageView
を– に設定します.ScaleAspectFit
。これは、Interface Builder の「ユーザー定義ランタイム属性」(つまりself.imageView.contentMode
、Number、1) またはUIButton
サブクラスで実行できます。- 「サブビューの自動サイズ変更」を無効にします。
- 「Edge」を「Image」に設定し、「Inset」に適切な「Top」と「Bottom」の値を設定します(これは、私のように PDF を画像として使用する場合にのみ必要になる場合があります)。
変更UIButton.imageView.contentMode
してもうまくいきませんでした。
画像を「背景」プロパティに設定することで問題を解決しました。
必要に応じて比率制約を追加できます
画像のサイズが比例して変更されないという問題があったため、修正方法はエッジインセットを使用していました.
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
@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
}
}
上記のように imageWithCGImage を使用できます (ただし、括弧がありません)。
また、何百万もの非 4.0 の電話は、そのコードではまったく動作しません。
[button sizeToFit]
私のために働いた。
私は同じ問題を抱えていましたが、動作させることができませんでした (おそらく SDK のバグです)。
最終的に、回避策として、UIImageView
ボタンの後ろに配置し、必要なオプションを設定してから、その上に空白を配置しましUIButton
た。