UIButton 的 backgroundImage 的内容模式不受尊重

Posted

技术标签:

【中文标题】UIButton 的 backgroundImage 的内容模式不受尊重【英文标题】:UIButton's backgroundImage's content mode not respected 【发布时间】:2016-10-25 17:43:13 【问题描述】:

我正在对即将发布的应用程序进行最后润色,但我发现很难让UIButton 的背景图像中的contentMode 得到尊重。无论我指定的 contentMode 是什么,图像都会在背景中弹出,而与 contentMode 设置无关。

我查看了涵盖此主题的 post,但在我的情况下它似乎没有任何作用。

这是从viewDidLoad调用的:

// I tried putting the contentMode lines here...
myButton.imageView!.contentMode = .scaleAspectFit
myButton.contentMode = .scaleAspectFit
myButton.setBackgroundImage(UIImage(named: "myImage.png"), for: .normal)

// ...and here
// myButton.imageView!.contentMode = .scaleAspectFit
// myButton.contentMode = .scaleAspectFit

// I threw this in for S's & G's to see if it would work...it didn't
myButton.translatesAutoresizingMaskIntoConstraints = false
myButton.imageView?.translatesAutoresizingMaskIntoConstraints = true

我不确定我错过了什么,但我确信这对我来说将是一件非常愚蠢的事情。我欢迎有关如何让UIButton 的背景图像的contentMode 受到尊重的建议。感谢您的阅读。

更新

该按钮被键入为自定义按钮,而不是系统按钮。

【问题讨论】:

【参考方案1】:

问题是您使用setBackgroundImage() 方法添加图像。这会将您的图像添加到一些您无法直接访问的私人UIImageView,例如myButton.imageView!。在您的代码中,您正在为您的按钮应用contentType,而不是其背景图像。

如果你想达到这个背景UIImageView你需要使用subviews数组。但是如果您尝试在您的viewDidLoad() 方法中执行此操作,您会发现尚未添加背景UIImageView,因为您的按钮layout 方法未被调用。有两种方法可以解决这个问题。

解决方案 1 – 显式调用 layoutIfNeeded

override func viewDidLoad() 
    super.viewDidLoad()

    myButton.setBackgroundImage(UIImage(named: "myImage"), for: .normal)
    myButton.layoutIfNeeded()
    myButton.subviews.first?.contentMode = .scaleAspectFit

解决方案 2 – 将 contentMode 设置移动到 viewDidAppear 方法。

override func viewDidLoad() 
    super.viewDidLoad()

    myButton.setBackgroundImage(UIImage(named: "myImage"), for: .normal)
    myButton.setTitle("Some title", for: .normal)


override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)

    myButton.subviews.first?.contentMode = .scaleAspectFit

希望对你有帮助。

【讨论】:

【参考方案2】:

为了简化接受的答案,您需要做的就是布局子视图,您的设置代码可以在一个地方完成。

override func viewDidLoad() 
    super.viewDidLoad()

    myButton.setBackgroundImage(UIImage(named: "myImage.png"), for: .normal)
    myButton.layoutIfNeeded()
    myButton.subviews.first?.contentMode = .scaleAspectFill

【讨论】:

【参考方案3】:

按钮的 imageView 属性和 backgroundImage 属性是两个不同的东西。

与接受的答案不同,您可以改用 imageView 属性。

override func viewDidLoad() 
   super.viewDidLoad()

   myButton.setImage(UIImage(named: "myImage.png"), for: .normal)
   myButton.imageView?.contentMode = .scaleAspectFill

【讨论】:

这行得通。谢谢。

以上是关于UIButton 的 backgroundImage 的内容模式不受尊重的主要内容,如果未能解决你的问题,请参考以下文章

我将如何比较 UIButton backgroundImage 标题?

设置 UIButton 的 backgroundImage 时不调整大小,但定位

iOS 8.0.2 和 iPhone plus 当我在 XIB 中设置 UIButton backgroundImage 时,UIButton 变得更大,尽管这个按钮具有高度和重量的自动布局

iOS5 上奇怪的 UIButton 行为

带有背景图像和标题的 UIButton 使用自动布局

UIButton 背景图像水平缩放以填充同时保持纵横比