182

如何调整 UIButton 的图像大小?我正在设置这样的图像:

[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

但是,这会将图像填充到完整按钮,如何使图像变小?

4

18 回答 18

273

如果我正确理解您要执行的操作,则需要使用按钮图像边缘插图。就像是:

myLikesButton.imageEdgeInsets = UIEdgeInsets(top: 30, left: 30, bottom: 30, right: 30)
于 2012-05-14T01:49:53.960 回答
112

蒂姆的回答是正确的,但是我想添加另一个建议,因为就我而言,完全有一个更简单的解决方案。

我正在寻找设置UIButton图像插图,因为我没有意识到我可以在按钮的 上设置内容模式UIImageView,这将避免完全使用 UIEdgeInsets 和硬编码值的需要。只需访问按钮上的底层图像视图并设置内容模式:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

UIButton 不听内容模式设置?

斯威夫特 3

myButton.imageView?.contentMode = .scaleAspectFit
于 2014-11-21T19:57:12.017 回答
71

斯威夫特 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
于 2017-05-05T18:39:50.240 回答
47

您也可以像这样从界面构建器中执行此操作。

在此处输入图像描述

我认为这很有帮助。

于 2016-11-14T10:05:39.290 回答
40

如果您的图像太大(并且您不能/不想将图像缩小),则前两个答案的组合效果很好。

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)

除非您获得恰到好处的图像插图,否则图像将倾斜而不改变contentMode.

于 2017-02-07T19:16:56.793 回答
39

这是缩放 UIButton 的 imageView 的另一种解决方案。

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)
于 2019-07-16T07:38:09.020 回答
24

您可以使用imageEdgeInsets属性按钮图像周围矩形的内边距或外边距。

 [self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];

正值会缩小或插入该边缘——移动。负值扩展或开始该边缘。

于 2013-08-16T19:18:38.363 回答
16

这是 Swift 版本:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
于 2015-11-07T08:25:43.717 回答
9

斯威夫特 4

您将需要按此特定顺序使用这两行代码。您只需要更改边缘插图的顶部和底部值。

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
于 2018-03-13T17:51:57.813 回答
7

在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
            )
        }
    }

}

使用它,如果您想将 a 的框架设置UIButtonCGRectMake(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
)
于 2015-12-09T04:35:45.473 回答
7

使用 更改图标大小时 UIEdgeInsetsMake(top, left, bottom, right),请记住按钮尺寸和 UIEdgeInsetsMake 处理负值的能力,就好像它们是正值一样。

示例:两个高度为 100 且纵横比为 1:1 的按钮。

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)

在此处输入图像描述

示例 1 和示例 3 相同,因为 ABS(100 - (40 + 40)) = ABS(100 - (60 + 60))

于 2018-05-04T22:28:51.547 回答
5

为 Swift > 5 更新

设置大小:

button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

设置边距:

button.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
于 2020-03-08T07:55:49.140 回答
3

一种方法是在代码中调整 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!
}
于 2018-03-27T19:48:49.743 回答
2

斯威夫特 3

我将 myButton 的宽度和高度设置为 40,EdgeInsetsMake 的边距设置为 15。我建议为您的按钮添加背景颜色以查看实际的填充。

myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)
于 2017-09-08T19:20:29.697 回答
2

如果您为按钮使用符号图像,则此解决方案更好:

button.setPreferredSymbolConfiguration(UIImage.SymbolConfiguration(pointSize: 48), forImageIn: .normal)
于 2021-10-13T11:13:58.187 回答
2

插入图像对我有用,但我还需要将按钮类型设置为自定义,并将按钮样式设置为默认值。Xcode 13 中添加的按钮的默认值是 System for Type 和 Plain for Style。

self.imageEdgeInsets = UIEdgeInsets(top: 3.0, left: 3.0, bottom: 3.0, right: 3.0)

在此处输入图像描述

于 2021-12-02T16:19:41.780 回答
1

为 Swift 3 更新

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
于 2017-08-19T05:27:07.787 回答
-6

我认为,您的图像大小也与按钮大小相同,然后您将图像放在按钮的背景中,例如:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

你桅杆有相同大小的图像和按钮。我希望你明白我的意思。

于 2012-05-14T05:51:32.183 回答