いくつかのUIButtonsがあり、IBではAspect Fitに設定されていますが、何らかの理由で常に伸縮しています。他に設定する必要があるものはありますか?さまざまなビューモードをすべて試してみましたが、どれも機能せず、すべて拡張されています。
私は前にその問題があったことがあります。 UIImageView
の設定が実際に機能するcontentMode
に画像を置き、その上に透明なカスタムUIButton
を置くことで解決しました。
編集:この答えは時代遅れです。 iOSの最新バージョンでの正しい答えについては、 @ Werner Altewischer's answer を参照してください。
解決策は、contentMode
のimageView
プロパティにUIButton
を設定することです。これが機能するためには、UIButton
をカスタムタイプで作成する必要があります(そうでない場合、このプロパティに対してnil
が返されます)。
この方法は私にとって非常にうまくいった。:
Xibでボタンを選択し、user defined runtime attributes
:
self.imageView.contentMode
Number
1
そこで数値を使用できないので、数値を使用します。ただし、UIViewContentModeScaleAspectFitは1です。
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
を使用して画像を取得する方法があります。
- (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];
Swiftの別の答えは次のとおりです。
myButton.imageView?.contentMode = .ScaleAspectFit
いくつかの異なる答えを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)
これは私のために働いた
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
コメントしてくれた@ayreguitarに感謝
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
この回答は @ WernerAltewischerの回答 。に基づいています
ボタンをIBOutletに接続してコードを実行することを避けるために、UIButtonのクラスをサブクラス化しました。
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
次に、xibにカスタムボタンを作成し、その画像(背景画像ではなく)を設定します。
次に、クラスを設定します。
できました!
の代わりに
ボタンの画像の縦横比が期待どおりになりました。
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()
}
}
画像が比例的にサイズ変更されないという問題があったため、修正方法はエッジインセットを使用していました。
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
UIViewコンテンツモードは、対応するCALayerの「コンテンツ」に適用されます。これは、UIImageView
コンテンツを対応するCALayer
に設定するため、CGImage
sに対して機能します。
drawRect:
最終的にレイヤーコンテンツにレンダリングします。
カスタムUIButton
(私が知る限り)にはコンテンツがありません(角丸長方形のボタンはコンテンツを使用してレンダリングされる場合があります)。ボタンにはサブビューがあります:背景UIImageView
、画像UIImageView
、およびタイトルUILabel
。サブビューにcontentMode
を設定することで望みどおりに動作するかもしれませんが、UIButton
ビュー階層をいじるのは少し難しいです。
これは他の多くの答えと重複していますが、解決策は
contentMode
のUIImageView
を.ScaleAspectFit
に設定します。これは、Interface Builderの「User Defined Runtime Attributes」で実行できます(つまり、self.imageView.contentMode
、Number、1)またはUIButton
サブクラス。上記のようにimageWithCGImageを使用できます(ただし、かっこがありません)。
また...何百万台の非4.0電話はそのコードではまったく動作しません。
UIButton.imageView.contentMode
を変更しても機能しません。
画像を「背景」プロパティに設定することで問題を解決しました。
必要に応じて比率制約を追加できます
[button sizeToFit]
私のために働いた。