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