UIButtonの画像サイズを調整するにはどうすればよいですか?私はこのように画像を設定しています:
[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
しかし、これで画像がいっぱいになりボタン全体が表示されます。
UIButtonの画像サイズを調整するにはどうすればよいですか?私はこのように画像を設定しています:
[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
しかし、これで画像がいっぱいになりボタン全体が表示されます。
回答:
ティムの答えは正しいですが、私の場合はより簡単な解決策があったため、別の提案を追加したいと思いました。
UIButton
ボタンのにコンテンツモードを設定できることに気づかなかったため、イメージのインセットを設定UIImageView
しようとしていました。これにより、UIEdgeInsetsとハードコードされた値を完全に使用する必要がなくなります。ボタンの基になる画像ビューにアクセスし、コンテンツモードを設定するだけです。
myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
UIButtonがコンテンツモード設定をリッスンしないのを参照してください。
スウィフト3
myButton.imageView?.contentMode = .scaleAspectFit
button.backgroundImageView.contentMode
動作しません
スウィフト3:
button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
contentVerticalAlignment/contentHorizontalAlignment
オプションを使用して希望どおりに拡大縮小できるようになりました。これを投稿していただきありがとうございます。
contentHorizontalAlignment
やcontentVerticalAlignment
トリックはなかった
画像が大きすぎる(そして単に画像を小さくすることはできない/望まない)場合は、最初の2つの答えを組み合わせるとうまくいきます。
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)
画像インセットを適切に取得しない限り、画像はを変更せずに傾斜しcontentMode
ます。
スウィフト4
この2行のコードを、この特定の順序で使用する必要があります。必要なのは、エッジインセットの上部と下部の値を変更することだけです。
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
EXC_BAD_ACCESS
はから呼び出されoverride func layoutSubviews()
たときにエラーを引き起こしました。
Tim Cの回答の助けを借りて、UIButton
Swiftを使用して拡張機能を作成.setImage()
し、追加のframe
パラメーターを持つ関数を使用して画像フレームを指定できるようにしました
extension UIButton{
func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){
self.setImage(image, forState: state)
if let frame = frame{
self.imageEdgeInsets = UIEdgeInsets(
top: frame.minY - self.frame.minY,
left: frame.minX - self.frame.minX,
bottom: self.frame.maxY - frame.maxY,
right: self.frame.maxX - frame.maxX
)
}
}
}
あなたがのフレーム設定したい場合は、これを使用UIButton
するとCGRectMake(0, 0, 64, 64)
、し、それの画像を設定myImage
するフレームとCGRectMake(8, 8, 48, 48)
、あなたが使用することができます
let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
myImage,
inFrame: CGRectMake(8, 8, 48, 48),
forState: UIControlState.Normal
)
でアイコンのサイズを変更する場合
UIEdgeInsetsMake(top, left, bottom, right)
、ボタンの寸法と、UIEdgeInsetsMakeが負の値を正の値であるかのように処理する機能に留意してください。
例:高さ100、アスペクト1:1の2つのボタン。
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)
ABS(100-(40 + 40))= ABS(100-(60 + 60))なので、例1と3は同じです。
1つの方法は、次のようなコードでUIImageのサイズを変更することです。注:このコードは高さでのみスケーリングしますが、幅でスケーリングするように関数を簡単に調整することもできます。
let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)
fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
// Get current image size
let size = image.size
// Compute scaled, new size
let heightRatio = targetHeight / size.height
let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
// Create new image
UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
image.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Return new image
return newImage!
}