Swift 方法是什么;backgroundRect(forBounds:)”等;这个按钮是用来做什么的?

Swift 方法是什么;backgroundRect(forBounds:)”等;这个按钮是用来做什么的?,swift,uibutton,cgrect,Swift,Uibutton,Cgrect,我发现UIButton有一个backgroundRect(forBounds:)函数,但我不知道在哪里以及如何使用它 我也不明白如何使用contentRect(forBounds:)、titleRect(forContentRect:)和imageRect(forContentRect:)方法。请解释一下。默认情况下,backgroundRect(forBounds:)返回与bounds相同的值。但是,可以在子类中重写它,以防止在自定义内容上绘制 发件人: 此方法的默认实现返回bounds参数中

我发现
UIButton
有一个
backgroundRect(forBounds:)
函数,但我不知道在哪里以及如何使用它


我也不明白如何使用
contentRect(forBounds:)
titleRect(forContentRect:)
imageRect(forContentRect:)
方法。请解释一下。

默认情况下,
backgroundRect(forBounds:)
返回与
bounds
相同的值。但是,可以在子类中重写它,以防止在自定义内容上绘制

发件人:

此方法的默认实现返回bounds参数中的值。此矩形表示按钮绘制其标准背景内容的区域。提供自定义背景装饰的子类可以重写此方法并返回修改的边界矩形,以防止按钮在任何自定义内容上绘制

contentRect(forBounds:)
返回用于显示按钮标题和图像的区域

titleRect(forContentRect:)
imageRect(forContentRect:)
返回标题/图像的矩形

以下是有关非重写标准按钮的所有四种方法的返回值的一些直观帮助:

但是,我仍然无法想象在什么情况下我需要处理这个功能

然后想象一下:当用户的手指不再放在按钮上时,作为对用户的反馈,一个按钮在被点击时会收缩一点,恢复到正常大小。你会怎么做?这里有一个优雅的方式:

extension CGSize {
    func sizeByDelta(dw:CGFloat, dh:CGFloat) -> CGSize {
        return CGSize(width:self.width + dw, height:self.height + dh)
    }
}
class MyShrinkingButton: UIButton {
    override func backgroundRect(forBounds bounds: CGRect) -> CGRect {
        var result = super.backgroundRect(forBounds:bounds)
        if self.isHighlighted {
            result = result.insetBy(dx: 3, dy: 3)
        }
        return result
    }
    override var intrinsicContentSize : CGSize {
        return super.intrinsicContentSize.sizeByDelta(dw:25, dh: 20)
    }
}
效果微妙但生动清晰。这是处于正常状态和突出显示状态的按钮


看起来像boundsApple说的
返回接收器绘制背景的矩形。
我阅读了文档。但我仍然无法想象在什么情况下我需要处理这个函数。那太好了!但不幸的是,我没有成功地应用此代码。Xcode在第三行返回错误:参数标签“(:,:)”与任何可用的重载标记不匹配。固定的!现在应该编译了,已经编译了。但我看不到视觉效果。我创建了一个myshrinkbutton类型的按钮。当我在模拟器中点击它时,什么也没发生。显然我不知道你在做什么。下面是一个实际的可下载示例,它与广告一样有效:我发现了问题所在:backgroundRect只有在使用backgroundImage时才有效,但我的按钮只有backgroundColor。因此,似乎应该将该方法称为backgroundImageRect,而不是backgroundRect。不管怎样,现在一切都很好。谢谢你的好主意。