
Xcode предоставляет множество кнопок для использования при разработке приложений для macOS. Однако ни один из предопределенных стилей кнопок не оставляет возможности для настройки. По этой причине в этом коротком посте я собираюсь показать, как настроить цвета и радиус угла NSButton; включая фон, текст и цвета выделения.
Как вы вскоре увидите, все настраиваемые свойства, которые я представлю далее, также станут доступны в Interface Builder. Таким образом, можно будет графически настраивать кнопки прямо в раскадровке или файле XIB; нет необходимости в дальнейшей настройке в коде.
Сказав все вышесказанное, давайте посмотрим на код. Мы начнем с подкласса класса NSButton, как показано ниже:
Сначала мы объявим свойства, которые хотим настроить, и присвоим им некоторые начальные значения. Мы пометим их все атрибутом @IBInspectable, чтобы они также стали доступны в Interface Builder.
Далее мы реализуем пользовательский метод, который будет делать три вещи:
- Это будет установка цвета фона кнопки. Обратите внимание, что мы сделаем это условно; если кнопка выделена, то мы применим
highlightColor, который мы объявили выше. В противном случае мы будем использоватьbgColor. - Он будет указывать цвет текста. Это не так просто, как кажется; необходимо создать строку с атрибутами, которая будет использовать предоставленный цвет текста, и иметь кнопку для использования ее в качестве заголовка.
- Это будет установка углового радиуса кнопки.
К слою кнопки будут применены как цвет фона, так и радиус угла. Обратите внимание, что в NSButton по умолчанию включен поддерживающий слой, поэтому нет необходимости начинать с оператора wantsLayer = true.
Вот этот новый метод:
Наконец, давайте переопределим метод draw(_:) класса NSButton:
Это был единственный код, который нам нужно было написать! Чтобы использовать вышеперечисленное, откройте раскадровку или файл XIB и добавьте кнопку в представление. Желательно добавить кнопку градиента, чтобы вы могли также установить ее высоту, если хотите.
Выбрав кнопку, откройте инспектор удостоверений и установите RoundedColoredButton в качестве пользовательского класса.
Затем переключитесь в инспектор атрибутов, где вы найдете пользовательские свойства, которые мы указали как @IBInspectable в классе.
Выберите и установите любые значения, которые вы хотите, и, наконец, запустите приложение. Любые кнопки, которые вы настроили с помощью новых свойств, показанных выше, будут лежать там, готовые опробовать их.
Примечание. Если вам интересно, почему в Interface Builder нет динамического рендеринга, это потому, что класс RoundedColoredButton не помечен тегом @IBDesignable атрибут. Я намеренно избегал этого по одной причине; NSButton не отображается в реальном времени, как это делают другие представления, и в настоящее время для этого не существует решения или обходного пути. Тем не менее, это не так важно, так как мы хотим, чтобы пользовательские кнопки правильно выглядели во время выполнения. Красивое представление их в IB — это удобство, которого нам просто не хватает.
Я надеюсь, что вы нашли этот короткий пост ценным! Если вы хотите, добавьте больше настраиваемых свойств в реализацию пользовательской кнопки, как показано в этом посте, и заставьте ее работать в соответствии с вашими потребностями. Вы также можете найти этот пост на моем веб-сайте SerialCoder.dev вместе с другим контентом. Спасибо за чтение и берегите себя!
Первоначально опубликовано на https://serialcoder.dev 20 октября 2020 г.