2013-04-12 6 views
28

У меня есть пользовательский UIButton который представляет собой облако, прозрачный черно-белый файл .png, без состояния вниз, только одно изображение. При нажатии и удержании пальца он становится темно-серым. Я пытаюсь изменить этот темно-серый цвет на нечто менее репрессивное. Кнопка находится в открытом виде, а не в панели вкладок, панели инструментов или навигационном контроллере.Изменить цвет темного оттенка серого, удерживая пользовательский UIButton?

Я уже пробовал установить tintColor (который документально сообщает мне, подходит только для «некоторых» типов кнопок, в которых нет указаний на которые).

Я также попытался изменить все, что я могу найти в интерфейсе Builder, относящемся к цветам выделения, состояниям по умолчанию и т. Д. Ничего не изменило вообще.

Я даже попытался установить собственное изображение кнопки для своего состояния UIControlStateHighlighted, но даже это вызывает появление темно-серого наложения, когда я держу палец над ним.

Как я могу изменить этот цвет? Я рассмотрел множество других вопросов здесь, на SO и не смог найти решение, которое работает для меня. Любая помощь будет принята с благодарностью!

EDIT: Я решил проблему, используя категорию UIImage, который добавляет метод, который использует CoreGraphics применить оттенок предоставленного UIImage. Затем я устанавливаю THAT-образ в качестве подсветки, и все хорошо. Кажется, много обручей-ля меняет цвет, который Apple должна была изменить, но c'est la vie.

ответ

55

Вы сказали, что настроили собственное изображение для состояния UIControlStateHighlighted. Этот должен отключить поведение по умолчанию.

Если у вас все еще есть проблемы, вы можете отключить этот эффект, установив для свойства adjustsImageWhenHighlighted значение NO и используйте любой настраиваемый эффект.

+0

Спасибо. Примут через 10 минут, когда это позволит мне .. – Luke

+0

Я только что редактировал: настройка пользовательского образа для 'UIControlStateHighlighted' действительно должна работать. Я попробую еще раз и обязательно сделаю ошибку. –

+0

Я думаю, что он устанавливает его, но не растягивает его должным образом. Я делаю некоторые вещи с изменением размера изображения на основе текста внутри него. Он показывает середину белого цвета, но темно-серый вокруг сторон, поэтому угадывание изображения не заполняет пространство оригинала. Что странно, так как я настраиваю его на себя. – Luke

1

У меня была аналогичная проблема с пользовательским UIButton, когда кнопка выделялась серым при каждом нажатии. Я решил эту проблему путем создание подклассов UIButton и в реализации Я отменяю один метод (аннулируется) setHighlighted: метод и держал его пустым:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    // Leave empty to prevent super from doing whatever 
    // that it is doing to show the grey highlight. 
} 

Это остановило любой тип подсветки как я ничего не делал в методе , Это лучший подход, если все, что вы пытаетесь сделать, - удалить любой эффект выделения.

Итак, в вашем коде создайте подкласс UIButton, переопределите метод setHighlighted, а затем сделайте свою пользовательскую кнопку подклассом этого настраиваемого класса.

+0

Возможно, супер также делает больше, чем просто возиться с изменением цвета. Было бы осторожно делать это. – Yavin4

29

Если adjustsImageWhenHighlighted = NO не работает, set Button-Type to Custom (IB или программно).

Default Button-Type: System, изменяет поведение выделенной кнопки.

+0

Не знаю, как я это пропустил. Благодарю. –

+0

Ты спас мне жизнь. Тип интерфейса по умолчанию для UIButton - 'system'. Действительно странно, мм? –

3

Swift 3:

myButton.adjustsImageWhenHighlighted = false 
0

Вы можете написать пользовательскую кнопку, которая делает его

class ActionButton: UIButton { 

    var originalBackgroundColor: UIColor! 

    override var backgroundColor: UIColor? { 
    didSet { 
     if originalBackgroundColor == nil { 
     originalBackgroundColor = backgroundColor 
     } 
    } 
    } 

    override var isHighlighted: Bool { 
    didSet { 
     guard let originalBackgroundColor = originalBackgroundColor else { 
     return 
     } 

     backgroundColor = isHighlighted ? originalBackgroundColor.darken() : originalBackgroundColor 
    } 
    }