2013-11-30 3 views
34

Я создал навигационную кнопку в своем UINavigationController. я поставил его подсвечиваются при прикосновении:Как изменить выделенный цвет UIButton?

[someButton setShowsTouchWhenHighlighted:YES]; 

Есть ли способ изменить цвет выделенного на что-то иное, чем белый по умолчанию?

+1

Вы хотите изменить цвет фона или цвет текста? – Greg

+0

Заменить цвет фона при подсвечивании ... –

ответ

48

Try, чтобы переопределить UIButton со следующим методом .. и просто изменить Backgroud цвет кнопки, когда его в особо состояние.

- (void)setHighlighted:(BOOL)highlighted { 
    [super setHighlighted:highlighted]; 

    if (highlighted) { 
     self.backgroundColor = [UIColor Your Customcolor]; 
    } 

} 

Попробуйте it..hope это помогает

+1

Это хорошо, но я рекомендую также сбросить цвет фона, когда кнопка не подсвечена. –

+4

Пример: self.backgroundColor = выделено? [UIColor darkGrayColor]: [UIColor blueColor]; –

3

Используйте это заявление, чтобы установить выделенный цвет UIButton:

[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; 
42

Вы можете использовать setBackgroundImage:forState:, чтобы установить фоновое изображение для кнопки при выделении.

например:

По предложению Тима their answer here, вы можете создать UIImage из UIColor:

- (UIImage *)imageWithColor:(UIColor *)color { 
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

Затем установить изображение в качестве фонового изображения кнопки, когда выделены

[button setBackgroundImage:[self imageWithColor:[UIColor blueColor]] forState:UIControlStateHighlighted];

+1

Ya, это действительно единственный способ изменить выделенный цвет фона без переопределения элемента управления. –

+0

http://stackoverflow.com/a/14525049/1292441 –

+0

Кажется, вы скопировали его из ссылки @ClementPrem ... этот вопрос должен быть отмечен как дублированный, но в худшем случае не помешает отдать должное владельцу. –

21

В Swift:

import UIKit 

class CustomUIButtonForUIToolbar: UIButton { 

    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) { 
     // Drawing code 
     super.drawRect(rect) 

     self.layer.borderColor = UIColor.blueColor().CGColor 
     self.layer.borderWidth = 1.0 
     self.layer.cornerRadius = 5.0 
     self.clipsToBounds = true 
     self.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal) 

     self.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Highlighted) 
    } 

    override var highlighted: Bool { 
     didSet { 

      if (highlighted) { 
       self.backgroundColor = UIColor.blueColor() 
      } 
      else { 
       self.backgroundColor = UIColor.clearColor() 
      } 

     } 
    } 

} 
+1

FYI ни один из этих кодов не должен находиться в 'drawRect'. 'drawRect' предназначен для рисования в графическом контексте. Я лично поместил их в 'awakeFromNib', но' init? (Coder:) 'также работает. –

4

Я обеспечить Swift ответа, который может быть использован без какой-либо настройки, если вы хотите подсвеченный цвета, чтобы быть затемнена версией оригинального цвета фона. Если вы, с другой стороны, хотите совершенно другой выделенный цвет фона, вы можете предоставить это свойство highlightBackgroundColor как UIColor.

Ниже приведен самый эффективный и простой способ реализовать такую ​​функциональность в Swift. Он также является общим, что означает, что он может использоваться для множества разных кнопок с разными цветами.

Вот код:

import UIKit 

class HighlightedColorButton: UIButton { 

    // A new highlightedBackgroundColor, which shows on tap 
    var highlightedBackgroundColor: UIColor? 
    // A temporary background color property, which stores the original color while the button is highlighted 
    var temporaryBackgroundColor: UIColor? 


    // Darken a color 
    func darkenColor(color: UIColor) -> UIColor { 

     var red = CGFloat(), green = CGFloat(), blue = CGFloat(), alpha = CGFloat() 

     color.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 

     red = max(red - 0.5, 0.0) 
     green = max(green - 0.5, 0.0) 
     blue = max(blue - 0.5, 0.0) 

     return UIColor(red: red, green: green, blue: blue, alpha: alpha) 
    } 


    // Set up a property observer for the highlighted property, so the color can be changed 
    @objc override var highlighted: Bool { 
     didSet { 
      if highlighted { 
       if temporaryBackgroundColor == nil { 
        if backgroundColor != nil { 
         if let highlightedColor = highlightedBackgroundColor { 
          temporaryBackgroundColor = backgroundColor 
          backgroundColor = highlightedColor 
         } else { 
          temporaryBackgroundColor = backgroundColor 
          backgroundColor = darkenColor(temporaryBackgroundColor!) 
         } 
        } 
       } 
      } else { 
       if let temporaryColor = temporaryBackgroundColor { 
        backgroundColor = temporaryColor 
        temporaryBackgroundColor = nil 
       } 
      } 
     } 
    } 
} 

Лечить кнопку как обычный UIButton, с добавлением дополнительного highlightedBackgroundColor собственности:

let highlightedColorButton = HighlightedColorButton.buttonWithType(.Custom) as HighlightedColorButton 
highlightedColorButton.backgroundColor = UIColor.redColor() 
highlightedColorButton.highlightedBackgroundColor = UIColor.blueColor() 
0

Я получаю некоторый успех, используя старый, старый веб-трюк.

Я создал пару изображений в файлах images.xcassets, PNG, как 1px на 1px. Один - это обычный цвет, другой - цвет фона.

Я буду от чистого черного до чисто белого, так:

В раскадровке я выбираю кнопку.В «Инспекторе атрибутов» (правая панель, четвертый значок в поперечнике) я меняю тип на «custom», меняю «конфигурацию состояния» на «выделить», затем «фон» на «whitePixel» (или как вы его называли)) и «Цвет текста» на «черный цвет».

Теперь я меняю «конфигурацию состояния» на «по умолчанию», «фон» на «черный пиксель» (или что-то еще) и «цвет текста» на «белый цвет».

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

Это увеличивает количество объектов изображения, но значительно снижает требуемый код. Что меня радует.

1

В Swift, если вы хотите использовать изображение для подсвеченного состояния, вы можете сделать это с UIButton:

if enabled { 
//highlighted state 
    enableMicrophone.setImage(UIImage(named: "mic_on"), forState: .Highlighted) 
} else { 
//normal state 
    enableMicrophone.setImage(UIImage(named: "mic_off"), forState: .Normal)  
} 
0

Для Swift

import UIKit 

extension UIImage { 

func imageWithAlphaComponent(alpha: CGFloat) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(self.size, false, 0) 

    let ctx = UIGraphicsGetCurrentContext() 
    let area = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) 

    CGContextScaleCTM(ctx, 1, -1) 
    CGContextTranslateCTM(ctx, 0, -area.size.height) 

    CGContextSetBlendMode(ctx, CGBlendMode.Multiply) 

    CGContextSetAlpha(ctx, alpha) 

    CGContextDrawImage(ctx, area, self.CGImage) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 

    return newImage 
} 
} 

Написать

button.setImage(image.imageWithAlphaComponent(0.65), forState: .Highlighted) 

https://gist.github.com/yukitoto/e8aa420e20be7ab5d64b71e96ecd61f1

Смежные вопросы