/ / Festlegen eines benutzerdefinierten Bilds für eine Zurück-Schaltfläche in der UINavigationBar - iPhone, Objective-C, X-Code, Uinavigation-Controller, Uibutton

Festlegen eines benutzerdefinierten Bilds für eine Zurück-Schaltfläche in der UINavigationBar - iPhone, Objective-C, X-Code, Uinavigation-Controller, Uibutton

Ich versuche, ein benutzerdefiniertes Bild für die Schaltfläche "Zurück" festzulegen, das automatisch in eine Navigationsleiste eingefügt wird, wenn eine neue Ansicht auf den Stapel verschoben wird.

Ich habe versucht, Folgendes in viewDidLoad des übergeordneten viewController hinzuzufügen:

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Ich habe auch folgendes versucht:

UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"BackButton.png"] style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = btn;

Die Verwendung von UIAppearance führt zu ziemlich seltsamen Ergebnissen: Das BackButton-Bild scheint unter dem Originaltitel platziert zu sein

Antworten:

35 für die Antwort № 1

Probieren Sie diesen Code aus

UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *backBtnImage = [UIImage imageNamed:@"BackBtn.png"]  ;
[backBtn setBackgroundImage:backBtnImage forState:UIControlStateNormal];
[backBtn addTarget:self action:@selector(goback) forControlEvents:UIControlEventTouchUpInside];
backBtn.frame = CGRectMake(0, 0, 54, 30);
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backBtn] ;
self.navigationItem.leftBarButtonItem = backButton;

Definieren Sie dann die Goback-Methode wie folgt

- (void)goback
{
[self.navigationController popViewControllerAnimated:YES];
}

26 für die Antwort № 2

Seit iOS 7.0 gibt es eine neue Methode in der API backIndicatorImage. Sie können es anstelle von verwenden setBackButtonBackgroundImage Wenn Sie nicht möchten, dass das Bild so gestreckt wird, dass es zum Text passt (z. B. wenn Sie einen benutzerdefinierten Zurückpfeil mit fester Größe möchten). Hier ein Beispiel in Kürze:

let image = UIImage(named: "back_button")

UINavigationBar.appearance().backIndicatorImage = image
UINavigationBar.appearance().backIndicatorTransitionMaskImage = image

Mit diesem Trick können Sie den Text vor der Schaltfläche ausblenden:

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -66), for: .default)

19 für die Antwort № 3

Dies ist der Code, den ich verwende und der perfekt in meiner eigenen iOS 5-App funktioniert. Dieser Code stammt von application:didFinishLaunchingWithOptions: im App-Delegaten:

UIImage * backButtonImage = [UIImage imageNamed: @"back-button-image"];
backButtonImage = [backButtonImage stretchableImageWithLeftCapWidth: 15.0 topCapHeight: 30.0];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage: backButtonImage forState: UIControlStateNormal barMetrics: UIBarMetricsDefault];

Möglicherweise müssen Sie ein dehnbares Bild verwenden, wobei der nach links gerichtete "Punkt" der ist linke Kappe


oder in Swift

let backButtonImage = UIImage(named: "back-button-image")
backButtonImage = backButtonImage?.stretchableImageWithLeftCapWidth(15, topCapHeight: 30)
UIBarButtonItem.appearance().setBackButtonBackgroundImage(backButtonImage, forState: .Normal, barMetrics: .Default)

4 für die Antwort № 4

iOS 8+ Swift-Version (kann in ObjC konvertiert werdenmit wenig Aufwand). Diese Methode bewahrt alle Vorteile und das Verhalten der Navigationsleiste in Bezug auf die Standard-Zurück-Schaltfläche (Animation beim Drücken / Poppen, interaktive Pop-Geste usw.).

// Call the code ONE TIME somewhere on app launch to setup custom back button appearance
UINavigationBar.appearance().tintColor = UIColor.blackColor()
// If you need custom positioning for your back button, in this example button will be 1 px up compared to default one
// Also only vertical positioning works, for horizontal add offsets directly to the image
let backImageInsets = UIEdgeInsetsMake(0, 0, -1, 0)
// Get image, change of rendering (so it preserves offsets made in file), applying offsets
let backImage = UIImage(named: "YourButtonImageAssetFileName")?.imageWithRenderingMode(.AlwaysOriginal).imageWithAlignmentRectInsets(backImageInsets)
// Setting images
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage

// Call EACH TIME BEFORE pushing view controller if you don"t need title near your back button arrow
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
// Push controller
self.navigationController?.pushViewController(vc, animated: true)

2 für die Antwort № 5

Versuchen Sie den folgenden Code, es funktioniert für mich:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back-button-image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back-button-image"]];

0 für die Antwort № 6

Das hat für mich funktioniert:

let button1 = UIBarButtonItem(
image: #imageLiteral(resourceName: "back_arrow"),
style: .plain,
target: self,
action: #selector(self.backBtnTapped(_:))
)
self.navigationItem.leftBarButtonItem  = button1

0 für die Antwort № 7

Dieser Code hat funktioniert Schnell 4 und XCode 9.4 :

Fügen Sie diesen Code zu AppDelegate hinzu func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool So wenden Sie sich auf alle Ihre View Controller an:

//Custom back button
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .highlighted)
let backImg: UIImage = UIImage(named: "back")!
barButtonItemAppearance.setBackButtonBackgroundImage(backImg, for: .normal, barMetrics: .default)

let image = UIImage()

UINavigationBar.appearance().backIndicatorImage = image
UINavigationBar.appearance().backIndicatorTransitionMaskImage = image