Как добавить вторую UILabel в UIButton, настраиваемую для UIControlState - PullRequest
4 голосов
/ 09 декабря 2011

Я хочу отобразить 2 строки (в разных положениях кнопки) с разными шрифтами и цветами (я использую кнопку setTitle для одного и мне нужна еще одна), и некоторые атрибуты должны быть изменены в зависимости оттекущая UIControlState (как цвет).

Итак, я ищу лучший способ добавить вторую метку к UIButton.Мне нужно, чтобы этикетка настраивалась для UIControlState (например, для UIControlStateNormal и UIControleStateHighlighted требуется другой цвет).

Я пробовал следующие варианты:

  • Подкласс UIButton и использование drawRect: хотя это и не рекомендуется (и теперь я понимаю, почему), я не думаю, что это даже возможно, похоже, что вызывается метод drawRect кнопки (и после того, как один измой подкласс), даже если я не вызываю super.
  • Создайте новый UILabel и добавьте его как subview к моей кнопке: это работает довольно хорошо, за исключением того, что я не знаю, какизмените цвет, когда UIControlState кнопки меняется
  • Создайте новый слой и используйте drawLayer: я не знаю, как заставить метод drawLayer вызываться каждый раз, когда состояние кнопкименяется (мой drawLayer вызывается только один раз, когда я использую setNeedsDisplay сразу после добавления моего слоя к кнопке)

Есть ли другой способ добиться того, что я пытаюсь сделать,или, может быть, одно из этих решений может работать (с несколькими изменениями)?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Хорошо, я думаю, что нашел рабочее решение (по крайней мере, для моей проблемы).

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

Я добавил UILabel в представление кнопки, чтобыотобразить вторую нужную строку, и во время titleRectForContentRect я вычисляю правильное местоположение frame для своей метки, я обновляю шрифт и цвет текста моей метки на основе состояния кнопки (self.state), и это все, что мне нужно.

2 голосов
/ 09 декабря 2011

Второй ваш подход работает нормально.Просто добавьте 2 цели: сначала обновите цель до «нормального состояния», используя «все сенсорные события».Второе обновление для «выделенного» с помощью события «touch down».

Если состояния не только изменяются касаниями и хотят обрабатывать это в более общем смысле, я рекомендую использовать многопоточность.Все, что вам действительно нужно, это вызвать executeSelectorInBackground при инициализации всех этих элементов (селектор обновляет метку в соответствии с состоянием кнопки), а затем снова вызвать тот же executeSelectorInBackground в конце метода «update label», создавая бесконечный цикл.

...