J'ai créé un bouton de navigation dans mon UINavigationController. Je le mets en surbrillance quand on le touche:
[someButton setShowsTouchWhenHighlighted:YES];
Y a-t-il un moyen de changer la couleur en surbrillance en autre chose que le blanc par défaut?
Essayez de remplacer l'UIButton avec la méthode suivante .. et changez simplement la couleur d'arrière-plan du bouton lorsqu'il est en surbrillance.
- (void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
if (highlighted) {
self.backgroundColor = [UIColor Your Customcolor];
}
else{
self.backgroundColor = [UIColor Your DefaultColor];
}
}
Essayez-le .. j'espère que ça aide
Vous pouvez utiliser setBackgroundImage:forState:
pour définir l'image d'arrière-plan du bouton lorsqu'elle est en surbrillance.
ex:
Comme suggéré par Tim dans leur réponse ici , vous pouvez créer un UIImage
à partir de 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;
}
Définissez ensuite l'image comme image d'arrière-plan du bouton lorsqu'elle est en surbrillance
[button setBackgroundImage:[self imageWithColor:[UIColor blueColor]] forState:UIControlStateHighlighted];
Dans 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()
}
}
}
}
Je fournirai une réponse Swift, qui peut être utilisée sans aucune personnalisation, si vous souhaitez que la couleur en surbrillance soit une version assombrie de la couleur d'arrière-plan d'origine. Si vous souhaitez par contre une couleur d'arrière-plan mise en surbrillance complètement différente, vous pouvez la fournir à la propriété en surbrillance BackgroundColor au format UIColor.
Voici le moyen le plus simple et le plus efficace de mettre en œuvre une telle fonctionnalité dans Swift. Il est également générique, ce qui signifie qu'il peut être utilisé pour un grand nombre de boutons de couleurs différentes.
Voici le code:
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
}
}
}
}
}
Traitez le bouton comme un bouton UIB normal, avec l’ajout de la propriété facultative en surbrillanceBackgroundColor:
let highlightedColorButton = HighlightedColorButton.buttonWithType(.Custom) as HighlightedColorButton
highlightedColorButton.backgroundColor = UIColor.redColor()
highlightedColorButton.highlightedBackgroundColor = UIColor.blueColor()
Utilisez cette instruction pour définir la couleur en surbrillance de l'UIButton:
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
Dans Swift, si vous souhaitez utiliser une image pour l’état mis en surbrillance, vous pouvez le faire avec UIButton
:
if enabled {
//highlighted state
enableMicrophone.setImage(UIImage(named: "mic_on"), forState: .Highlighted)
} else {
//normal state
enableMicrophone.setImage(UIImage(named: "mic_off"), forState: .Normal)
}
Je réussis en utilisant un vieux truc Web.
J'ai créé quelques ressources d'image dans images.xcassets
, Fichiers PNG, les deux 1px par 1px. L'un est la couleur normale, l'autre est la couleur de fond.
Je vais du noir pur au blanc pur, alors:
Dans le storyboard, je sélectionne le bouton. Dans "Inspecteur d'attributs" (panneau de droite, 4ème icône en face), je change le type en "personnalisé", modifie la "configuration d'état" en "surbrillance", puis "en arrière-plan" en "whitePixel" (ou ce que vous avez appelé ) et 'Couleur du texte' à 'Couleur noire'.
Maintenant, je change la "configuration d'état" en "Par défaut", le "fond" en "blackPixel" (ou autre) et la "Couleur du texte" en "couleur blanche".
Je suppose que vous pouvez utiliser ces pixels chaque fois que vous devez appliquer une couleur lorsque vous n’avez accès qu’aux images dans l’éditeur Storyboard.
Cela augmente le nombre d'actifs d'image, mais réduit considérablement le code requis. Ce qui me plait.