Frage Anpassen von UIBarButtonItem "Done" -Stil und "Plain" -Stil getrennt mit UIAppearance


Ich kann anpassen UIBarButtonItem verwenden -setBackgroundImage: forState: barMetrics:, aber ich würde gerne verschiedene Bilder für verwenden UIBarButtonItemStyleDone und UIBarButtonItemStylePlain.

Gibt es einen Weg, dies zu erreichen mit dem UIAppearance Protokoll? Oder muss ich das Bild jedes Mal neu einstellen, wenn ich eine "Fertig" -Stil-Schaltfläche möchte?

(Ich habe versucht, Code wie den folgenden zu verwenden:

[[UIBarButtonItem appearance] setBackgroundImage:image forState:UIControlStateNormal barMetrics:UIBarButtonItemStyleDone];

Aber das setzt nur jeden Balken mit dem "Fertig" -Bild.

Vielen Dank!


14
2017-09-25 13:03


Ursprung


Antworten:


Im iOS 6 Sie können die neue Methode der UIBarButtonItem-Klasse verwenden:

- (void)setBackgroundImage:(UIImage *)backgroundImage
                  forState:(UIControlState)state
                     style:(UIBarButtonItemStyle)style
                barMetrics:(UIBarMetrics)barMetrics

Er legt das Hintergrundbild für den angegebenen Status, Stil und Messwerte fest. Weitere Details sind verfügbar in der Apple-Dokumentation

Um das Erscheinungsbild aller UIBarButtonItems zu ändern, können Sie Folgendes verwenden:

UIImage *doneBackgroundImage = [[UIImage imageNamed:@"button_done.png"]
   resizableImageWithCapInsets:UIEdgeInsetsMake(0, 4, 0, 4)];

[[UIBarButtonItem appearance] setBackgroundImage:doneBackgroundImage
                                            forState:UIControlStateNormal
                                               style:UIBarButtonItemStyleDone
                                          barMetrics:UIBarMetricsDefault];

13
2017-12-03 10:49



für IOS5 *

Die einzige Möglichkeit, die ich gefunden habe, ist die Verwendung einer UIBarButtonItem-Kategorie:

UIBarButtonItem + Appearance.h

#import <Foundation/Foundation.h>

@interface UIBarButtonItem (Appearance)

+ (void) setupAppearance;

@end

UIBarButtonItem + Aussehen.m

#import "UIBarButtonItem+Appearance.h"
#import <objc/runtime.h>

@implementation UIBarButtonItem (Appearance)

+ (void) setupAppearance {
    [[UIBarButtonItem appearance]  setBackgroundImage: [[UIImage imageNamed:@"customButton"]
                                                                  resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)]
                                                       forState: UIControlStateNormal
                                                     barMetrics: UIBarMetricsDefault];

    [[UIBarButtonItem appearance]  setBackgroundImage: [[UIImage imageNamed:@"customButtonHiglhighted"]
                                                                  resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)]
                                                       forState: UIControlStateHighlighted
                                                     barMetrics: UIBarMetricsDefault];



    Class klass = objc_getClass("UIBarButtonItem");
    Method targetMethod = class_getInstanceMethod(klass, @selector(setStyle:));
    Method newMethod = class_getInstanceMethod(klass, @selector(__setStyle:));
    method_exchangeImplementations(targetMethod, newMethod);
}

- (void) __setStyle:(UIBarButtonItemStyle)style {
    [self __setStyle:style];

    if(style == UIBarButtonItemStyleDone) {
        [self setBackgroundImage:[[UIImage imageNamed:@"customDoneButton"] resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)]
                        forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:[UIImage imageNamed:@"customDoneButtonClicked"]
                        forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
    } else {
        [self setBackgroundImage:[[UIImage imageNamed:@"customButton"] resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)]
                        forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:[UIImage imageNamed:@"customButtonHighlighted"]
                        forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
    }
}

@end

Hoffe, das ist was du suchst. Kredit für diese Lösung geht an https://gist.github.com/2633081


10
2017-10-09 12:17