Для чего используется метод "backgroundRect (forBounds :)" UIButton? - PullRequest
0 голосов
/ 07 июня 2018

Я обнаружил, что UIButton имеет функцию backgroundRect(forBounds:), но я не могу понять, где и как я могу ее использовать.

Я также не могу понять, как я могу использовать contentRect(forBounds:), titleRect(forContentRect:) и imageRect(forContentRect:) методы.Пожалуйста, объясните мне.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Но все равно я не могу представить ситуацию, в которой мне нужно будет обратиться к этой функции

Тогда представьте себе следующее: кнопка, которая кажется немного сужающейся в ответ на то, чтобы бытьнажмите в качестве обратной связи с пользователем, чтобы вернуться к своему нормальному размеру, когда палец пользователя больше не находится на кнопке.Как бы вы это сделали?Вот элегантный способ:

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

Эффект тонкий, но живой и четкий.Вот кнопка в ее нормальном состоянии и в ее выделенном состоянии.

enter image description here enter image description here

0 голосов
/ 07 июня 2018

По умолчанию backgroundRect(forBounds:) возвращает то же значение , что и bounds.Однако вы можете переопределить его в подклассе, чтобы предотвратить рисование поверх пользовательского содержимого.

Из Документация разработчика Apple :

Реализация по умолчанию этого метода возвращаетзначение в параметре границ.Этот прямоугольник представляет область, в которой кнопка рисует свой стандартный фоновый контент.Подклассы, предоставляющие пользовательские фоновые украшения, могут переопределить этот метод и вернуть измененный прямоугольник границ, чтобы кнопка не рисовала поверх любого пользовательского содержимого.

contentRect(forBounds:) возвращает область, которая используется для отображения заголовка иизображение кнопки.

titleRect(forContentRect:) и imageRect(forContentRect:) возвращают прямоугольник заголовка / изображения.

Вот некоторая визуальная помощь для возвращаемого значения всех четырех из этих методов длястандартная кнопка без переопределения:

visual representation of the return value of the methods mentioned above

...