如何将图像置于UIButton内部而不在Swift中双向拉伸?

时间:2016-08-01 10:55:31

标签: ios swift uibutton uiimage

我正在制作一个自定义键盘,我需要将移位图标的图像置于移位按钮内。图像为100px x 100px。

但是,纵向中的按钮框为36pt x 38pt,横向上的按钮框为68pt x 32pt。我尝试使用按钮图像插入属性来居中图像。但是,它没有这样做。

我尝试了自己并将图像边缘插入设置为(25,25,25,25),图像以两种尺寸居中。但是,图标变得太小而无法看到。

shiftButton.setImage(UIImage(named: "shift"), forState: .Normal)

shiftButton.imageEdgeInsets = UIEdgeInsetsMake(0,0,0,0)

我以编程方式创建按钮。并且,我需要按钮来保持其纵横比,即1:1。它的最大宽度或高度始终与按钮的高度本身相关联。图像宽度/高度应该是按钮高度的最大值。并且,它不应该以任何方式扭曲图标。但是,按钮本身可以伸展。

我需要根据按钮帧缩放图像,但要保持其宽高比。并且,它可以缩小或缩放,但应始终保持1:1的宽高比。

有任何解决此问题的建议吗?

6 个答案:

答案 0 :(得分:24)

最后一个解决方案来了。您必须在UIButton中为图像设置内容模式。

当您在按钮内使用前景图片以及contentMode的{​​{1}}时,解决方案是更新Image的{​​{1}}。

contentMode

答案 1 :(得分:9)

  • 将用户定义的运行时属性添加到按钮中。

在下面的屏幕截图中,值1等于scaleAspectFit

imageView.ContentMode = scaleAspectFit

enter image description here enter image description here

答案 2 :(得分:4)

将按钮的内容模式设置为Center

shiftButton.contentMode = .Center

答案 3 :(得分:3)

如果使用情节提要,请仔细检查按钮标题没有设置任何内容。

答案 4 :(得分:2)

我可以使用故事板上的尺寸检查器将内容插入设置为0来居中图像:

enter image description here

答案 5 :(得分:0)

使用图像处理 UIButton 是一件棘手的事情。我认为以下两行可以解决您的问题。

还有一个好帖子Aligning text and image on UIButton

// Keep button's image to its original ratio.
button.imageView?.contentMode = .scaleAspectFit
// Give button image a little space from all the four edges.
button.imageEdgeInsets = UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)

我项目中的一个按钮

    lazy var downloadButton: TransitionButton = {
        let button = TransitionButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        let config = UIImage.SymbolConfiguration(pointSize: 26, weight: .bold, scale: .default)
        let image = UIImage(systemName: "arrow.down", withConfiguration: config)?.withTintColor(.white, renderingMode: .alwaysOriginal)
        button.setImage(image, for: .normal)
        button.imageView?.contentMode = .scaleAspectFit
        button.imageEdgeInsets = UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)
        button.backgroundColor = .systemPink
        button.layer.cornerRadius = 12
        button.addTarget(self, action: #selector(downloadButtonTapped(_:)), for: .touchUpInside)
        button.spinnerColor = .white
        return button
    }()