Erstellen einer Schaltfläche mit dem Pfeil nach links (wie der "Zurück" -Stil von UINavigationBar) in einer UIToolbar

290

Ich würde gerne einen "Zurück" -Button mit der linken Pfeilblende in a erstellen UIToolbar.

Soweit ich das beurteilen kann, besteht die einzige Möglichkeit, eine davon zu erhalten, darin, die UINavigationControllerStandardeinstellungen beizubehalten, und es wird eine für das Element der linken Leiste verwendet. Aber es gibt keine Möglichkeit, eine als zu erstellen UIBarButtonItem, daher kann ich keine in einem Standard erstellen UIToolbar, obwohl sie UINavigationBars sehr ähnlich sind .

Ich könnte es manuell mit Schaltflächenbildern erstellen, aber ich kann die Quellbilder nirgendwo finden. Sie haben Alpha-Kanal-Kanten, sodass Screenshots und Schnitte keine sehr vielseitigen Ergebnisse liefern.

Irgendwelche Ideen jenseits von Screenshots für jede Größe und jedes Farbschema, die ich verwenden möchte?

Update: BITTE HÖREN SIE AUF, der Frage auszuweichen und schlagen vor, dass ich dies nicht stellen und verwenden sollte UINavigationBar. Meine App ist Instapaper Pro. Es wird nur eine untere Symbolleiste angezeigt (um Platz zu sparen und den lesbaren Inhaltsbereich zu maximieren), und ich möchte eine linkspfeilförmige Schaltfläche "Zurück" unten einfügen.

Mir zu sagen, dass ich das nicht tun muss, ist keine Antwort und verdient auf keinen Fall ein Kopfgeld.

Marco
quelle

Antworten:

130

Ich habe die folgende PSD verwendet, die ich von http://www.teehanlax.com/blog/?p=447 abgeleitet habe

http://www.chrisandtennille.com/pictures/backbutton.psd

Ich habe dann gerade eine benutzerdefinierte UIView erstellt, die ich in der customView-Eigenschaft des Symbolleistenelements verwende.

Funktioniert gut für mich.


Bearbeiten: Wie von PrairieHippo hervorgehoben , stellte maralbjo fest, dass die Verwendung des folgenden einfachen Codes den Trick (erfordert ein benutzerdefiniertes Bild im Bundle) mit dieser Antwort kombiniert werden sollte. Also hier ist zusätzlicher Code:

// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backAction)];

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];
PyjamaSam
quelle
1
Die PSD, die ich hochgeladen habe, ist für eine schwarze Symbolleiste. Ich habe nicht viel mit den blauen versucht, da meine App das nicht verwendet. Soweit ich weiß, wird die Symbolleiste sie jedoch nicht nach Bedarf neu einfärben. chris.
PyjamaSam
1
Sie benötigen kein spezielles Werkzeug, um es neu einzufärben. Ich habe es mit der Option "Farbe anpassen" von Mac Preview durchgeführt.
Sushant
1
Kann diese Lösung etwas formuliert werden?
Cannyboy
4
Diese PSD ist nur für eine Bildschirmskala von 1.0f nützlich. Auf einem Retina-Display wird es schrecklich aussehen.
Daniel Wood
3
Verwenden Sie hierfür keine Bilder, sondern machen Sie es einfach richtig (siehe Antwort für stackoverflow.com/questions/4260238 ).
Ingh.am
45

Die Unicode-Methode

Ich denke, es ist viel einfacher, nur ein Unicode-Zeichen zu verwenden, um die Arbeit zu erledigen. Sie können durch Pfeile schauen, indem Sie entweder Unicode-Dreiecke oder Unicode-Pfeile googeln . Ab iOS6 hat Apple das Zeichen in ein Emoji-Zeichen mit Rahmen geändert. Um den Rand zu deaktivieren, füge ich den 0xFE0E Unicode Variation Selector hinzu .

NSString *backArrowString = @"\U000025C0\U0000FE0E"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.leftButtonItem = backBarButtonItem;

Der Codeblock ist nur für die Demo. Es würde in jeder Schaltfläche funktionieren, die einen NSString akzeptiert.

Für eine vollständige Liste der Zeichen suchen Sie bei Google nach Unicode-Zeichen und Ihren Wünschen. Hier ist der Eintrag für Black Left-Pointing Triangle .

Ergebnis

Das Ergebnis

Cameron Lowell Palmer
quelle
37

WARNUNG: Es gibt Berichte, dass dies unter iOS 6 nicht funktioniert. Dies funktioniert möglicherweise nur unter älteren Versionen des Betriebssystems. Offensichtlich hat mindestens ein Entwickler seine App für die Verwendung dieses Tricks abgelehnt (siehe Kommentare). Benutzung auf eigene Gefahr. Die Verwendung eines Bildes (siehe Antwort oben) ist möglicherweise eine sicherere Lösung.

Dies kann ohne Hinzufügen eigener Bilddateien mit der sekr1t-Schaltfläche Typ 101 erfolgen, um die richtige Form zu erhalten. Für mich bestand der Trick darin, herauszufinden, mit welchem ​​ich das initWithCustomViewerstellen konnte BarButtonItem. Ich persönlich brauchte dies eher für eine dynamische Navigationsleiste als für eine toolbar, aber ich habe es mit einer Symbolleiste getestet und der Code ist fast der gleiche:

// create button
UIButton* backButton = [UIButton buttonWithType:101]; // left-pointing shape!
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];

// create button item -- possible because UIButton subclasses UIView!
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

// add to toolbar, or to a navbar (you should only have one of these!)
[toolbar setItems:[NSArray arrayWithObject:backItem]];
navItem.leftBarButtonItem = backItem;

Wenn Sie dies in einer Symbolleiste tun, müssen Sie die Einstellung der Elemente anpassen. Dies hängt jedoch vom Rest Ihres Codes ab, und ich überlasse dies dem Leser als Übung. : P Dieses Beispiel hat bei mir funktioniert (kompiliert und ausgeführt).

Blah blah, lies das HIG, benutze keine undokumentierten Funktionen und all das. Es gibt nur sechs unterstützte Schaltflächentypen und dies ist keiner von ihnen.

AndrewS
quelle
1
Der Schaltflächentyp 101 scheint mir keine nach links zeigende Form zu geben ... nur ein Rechteck.
Elsurudo
10
Tun Sie dies nicht - Ihre App wird abgelehnt. Stimmen Sie diese Antwort ab.
Thefaj
4
Ich neige dazu zu glauben, dass er sich nicht sicher ist; Er sagt "benutze keine undokumentierte API", aber nicht, dass seine App abgelehnt wurde. Und es ist keine undokumentierte API - es ist ein undokumentierter Wert. Wenn jemand hat ihren App abgelehnt hat, bitte posten. Ich habe weiterhin Apps mit diesem Wert genehmigt.
AndrewS
1
@thefaj Ich habe eine App mit diesem Code eingereicht und sie wurde genehmigt.
Aaron
1
Dies ist ein sehr schlechter Codierungsstil. Sie haben Glück, sollten aber nur die dokumentierte API verwenden (keine magischen / unveröffentlichten Zahlen).
Thefaj
36

Geben Sie hier die Bildbeschreibung ein

Zunächst müssen Sie ein Bild des Zurück-Buttons finden. Ich habe eine nette App namens Extractor verwendet , die alle Grafiken vom iPhone extrahiert. In iOS7 konnte ich das aufgerufene Bild abrufen UINavigationBarBackIndicatorDefaultund es war in schwarzer Farbe, da ich einen roten Farbton benötigte, ändere ich die Farbe mit Gimp in rot.

BEARBEITEN:

Wie von btate in seinem Kommentar erwähnt, muss die Farbe nicht mit dem Bildeditor geändert werden. Der folgende Code sollte den Trick machen:

imageView.tint = [UIColor redColor];
imageView.image = [[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Dann habe ich eine Ansicht erstellt, die eine Bildansicht mit diesem Pfeil, eine Beschriftung mit dem benutzerdefinierten Text enthält, und über der Ansicht habe ich eine Schaltfläche mit einer Aktion. Dann habe ich eine einfache Animation hinzugefügt (Fading und Übersetzung).

Der folgende Code simuliert das Verhalten der Zurück-Schaltfläche einschließlich der Animation.

-(void)viewWillAppear:(BOOL)animated{
        UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"]];
        [imageView setTintColor:[UIColor redColor]];
        UILabel *label=[[UILabel alloc] init];
        [label setTextColor:[UIColor redColor]];
        [label setText:@"Blog"];
        [label sizeToFit];

        int space=6;
        label.frame=CGRectMake(imageView.frame.origin.x+imageView.frame.size.width+space, label.frame.origin.y, label.frame.size.width, label.frame.size.height);
        UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, label.frame.size.width+imageView.frame.size.width+space, imageView.frame.size.height)];

        view.bounds=CGRectMake(view.bounds.origin.x+8, view.bounds.origin.y-1, view.bounds.size.width, view.bounds.size.height);
        [view addSubview:imageView];
        [view addSubview:label];

        UIButton *button=[[UIButton alloc] initWithFrame:view.frame];
        [button addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
        [view addSubview:button];

        [UIView animateWithDuration:0.33 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
            label.alpha = 0.0;
            CGRect orig=label.frame;
            label.frame=CGRectMake(label.frame.origin.x+25, label.frame.origin.y, label.frame.size.width, label.frame.size.height);
            label.alpha = 1.0;
            label.frame=orig;
        } completion:nil];

        UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:view];
}

- (void) handleBack:(id)sender{
}

BEARBEITEN:

Anstatt die Schaltfläche hinzuzufügen, ist es meiner Meinung nach besser, einen Gestenerkenner zu verwenden.

UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBack:)];
[view addGestureRecognizer:tap];
[view setUserInteractionEnabled:YES];
Alexey
quelle
1
Hallo Alex, Danke für die Lösung. Ein Problem, mit dem ich bei dieser implementierten Lösung konfrontiert bin, ist: Der Trefferbereich ist weniger, wenn ich auf den Pfeil klicke, wird das handleBack nicht angerufen, aber wenn ich auf den Text klicke, wird handleBack abgerufen. Bitte schlagen Sie dies vor. Vielen Dank
Yogesh Lolusare
Versuchen Sie, UITapGestureRecognizer zu verwenden. Ich habe die Frage bearbeitet
Alexey
Wahrscheinlich können Sie auch versuchen, die Ansicht zu vergrößern.
Alexey
2
Die schwarze Farbe auf dieser Schaltfläche macht es zu einer Vorlage. Sie müssen Gimp nicht verwenden, um es zu ändern. Verwenden Sie einfach den Farbton- imageView.tint = [UIColor redColor]und Vorlagen-Rendering-Modus für das Bild. imageView.image = [yourImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Smokingoyster
18

Ich bin nicht sicher, ob dies funktionieren würde, aber Sie könnten versuchen, eine UINavigationControllermit den Standardeinstellungen zu erstellen, um die Schaltfläche zu erstellen, die Schaltfläche in der Unteransichtshierarchie des Navigationscontrollers zu finden, sie aufzurufen removeFromSuperview, den Navigationscontroller zu zerstören und dann die Schaltfläche als hinzuzufügen eine Unteransicht Ihrer Symbolleiste. Möglicherweise müssen Sie auch retaindie Schaltfläche und die Schaltfläche vor dem Aufruf removeFromSuperview(und dann releasenach dem Hinzufügen als Unteransicht Ihrer Symbolleiste) verwenden, um zu vermeiden, dass sie während des Vorgangs freigegeben wird.

Adam Rosenfield
quelle
14

So erstellen Sie einen UIButton mit einem Pfeil ziemlich nahe (ich bin kein Designer;) am hinteren Pfeil des iOS 7-Systems:

Standard:

Zurück Pfeil des Standardsystems

Apple SD Gothic Neo

Apple SD Gothic Neo <Charakter

In Xcode:

  • Konzentrieren Sie sich auf das Titelwertfeld der Schaltfläche (oder auf eine andere Ansicht / Steuerung mit Textinhalt).
  • Öffnen Sie Bearbeiten -> Sonderzeichen
  • Wählen Sie die Gruppe Klammern aus und doppelklicken Sie auf das Zeichen '<'
  • Ändern Sie die Schriftart in: Apple SD Gothic Neo, Normal mit der gewünschten Größe (z. B. 20)
  • Ändern Sie die Farbe nach Belieben

Ref @ staticVoidMans Antwort auf den rückseitigen Pfeil unter iOS 7

Bjørn Egil
quelle
8

Pfeil nach hinten

Wenn Sie sich nicht mit Bilddateien beschäftigen möchten, kann die Pfeilform in einer UIView-Unterklasse mit dem folgenden Code gezeichnet werden:

- (void)drawRect:(CGRect)rect {
    float width = rect.size.width;
    float height = rect.size.height;
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, width * 5.0/6.0, height * 0.0/10.0);
    CGContextAddLineToPoint(context, width * 0.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 5.0/6.0, height * 10.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 9.0/10.0);
    CGContextAddLineToPoint(context, width * 2.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 1.0/10.0);
    CGContextClosePath(context);

    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextFillPath(context);
}

Dabei ist die Pfeilansicht proportional zu einer Breite von 6,0 und einer Höhe von 10,0

Machoota
quelle
7
    self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

Funktioniert bei mir. Ich habe dies verwendet, wenn ich mehr Registerkarten hatte, als in die Registerkartenleiste passen konnten, und ein Ansichts-Controller, der von "Mehr" gedrückt wurde, das leftBarButtonItem in seiner viewDidLoad überschrieb.

Quantumpotato
quelle
4

Sie finden die Quellbilder, indem Sie sie aus Other.artwork in UIKit $ {SDKROOT} /System/Library/Frameworks/UIKit.framework/Other.artwork extrahieren. Die Modding - Community hat einige Werkzeuge für sie zu extrahieren, hier . Sobald Sie das Bild extrahiert haben, können Sie Code schreiben, um es nach Bedarf neu einzufärben und als Schaltflächenbild festzulegen. Ob Sie so etwas tatsächlich versenden können oder nicht (da Sie abgeleitete Kunstwerke einbetten), ist möglicherweise ein wenig schwierig. Vielleicht möchten Sie mit einem Anwalt sprechen.

Louis Gerbarg
quelle
4

Die Three20-Bibliothek bietet folgende Möglichkeiten:

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Title" style:UIBarButtonItemStylePlain 
                                                                target:self action:@selector(foo)];

  UIColor* darkBlue = RGBCOLOR(109, 132, 162);

  TTShapeStyle* style = [TTShapeStyle styleWithShape:[TTRoundedLeftArrowShape shapeWithRadius:4.5] next:
    [TTShadowStyle styleWithColor:RGBCOLOR(255,255,255) blur:1 offset:CGSizeMake(0, 1) next:
    [TTReflectiveFillStyle styleWithColor:darkBlue next:
    [TTBevelBorderStyle styleWithHighlight:[darkBlue shadow]
                                     shadow:[darkBlue multiplyHue:1 saturation:0.5 value:0.5]
                                      width:1 lightSource:270 next:
    [TTInsetStyle styleWithInset:UIEdgeInsetsMake(0, -1, 0, -1) next:
    [TTBevelBorderStyle styleWithHighlight:nil shadow:RGBACOLOR(0,0,0,0.15)
                                        width:1 lightSource:270 next:nil]]]]]];

  TTView* view = [[[TTView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)] autorelease];
  view.backgroundColor = [UIColor clearColor];
  view.style = style;
  backButton.customView = view;


  self.navigationItem.leftBarButtonItem = backButton;
Andrew Arrow
quelle
Können Sie einen Screenshot des Endergebnisses veröffentlichen?
jm.
1
es sah schrecklich aus. Ich habe nie den linken Pfeil zurück gedrückt, um ganz richtig auszusehen. Ich gab auf und benutzte einen richtigen Zurück-Knopf mit dem Three20-Navigator.
Andrew Arrow
4

Ich fand, dass die Verwendung des folgenden einfachen Codes den Trick machte (erfordert ein benutzerdefiniertes Bild im Bundle):

// Creates a back button instead of default behaviour (displaying title of previous screen)
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(backAction)];

    tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
    [backButton release];
Maralbjo
quelle
2
Wenn Sie auf diese Seite kommen, kombinieren Sie diese Antwort mit der Antwort von @ PyjamaSam.
PrairieHippo
@ PrairieHippo: Wurde jetzt gemacht. Sollte wahrscheinlich an erster Stelle bearbeitet worden sein. Ideal -1, um das überhaupt nicht zu tun und die Arbeit anderen zu überlassen.
hakre
4

Folgendes habe ich getan, nachdem ich all diese und andere Lösungen durchsucht hatte. Es werden dehnbare PNGs verwendet, die aus den UIKit-Archivbildern extrahiert wurden. Auf diese Weise können Sie den Text auf das einstellen, was Sie möchten

// Generate the background images
UIImage *stretchableBackButton = [[UIImage imageNamed:@"UINavigationBarDefaultBack.png"] stretchableImageWithLeftCapWidth:14 topCapHeight:0];
UIImage *stretchableBackButtonPressed = [[UIImage imageNamed:@"UINavigationBarDefaultBackPressed.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
// Setup the UIButton
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setBackgroundImage:stretchableBackButton forState:UIControlStateNormal];
[backButton setBackgroundImage:stretchableBackButtonPressed forState:UIControlStateSelected];
NSString *buttonTitle = NSLocalizedString(@"Back", @"Back");
[backButton setTitle:buttonTitle forState:UIControlStateNormal];
[backButton setTitle:buttonTitle forState:UIControlStateSelected];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 2, 1); // Tweak the text position
NSInteger width = ([backButton.titleLabel.text sizeWithFont:backButton.titleLabel.font].width + backButton.titleEdgeInsets.right +backButton.titleEdgeInsets.left);
[backButton setFrame:CGRectMake(0, 0, width, 29)];
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:13.0f];
[backButton addTarget:self action:@selector(yourSelector:) forControlEvents:UIControlEventTouchDown];
// Now add the button as a custom UIBarButtonItem
UIBarButtonItem *backButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
self.navigationItem.leftBarButtonItem = backButtonItem;
Steve
quelle
2
Sollte UIControlStateHighlighted verwendet werden, nicht UIControlStateSelected, da sonst das Bild beim Berühren der Schaltfläche ausgetauscht wird.
Jim
4

Mit Interface Builder in Xcode 5.x ist das ganz einfach

Ergebnis

  • Verwenden Sie die Symbolleiste und das Balkenschaltflächenelement aus der Objektbibliothek

    Komponenten

  • Bearbeiten Sie im Attributinspektor der Schaltfläche den Abschnitt Bild mit Ihrem Bild der hinteren Schaltfläche

    Attributinspektor

Getan!

Anton Gaenko
quelle
2

Ich habe versucht, dasselbe zu tun, aber ich wollte, dass sich die Zurück-Schaltfläche in der Navigationsleiste befindet. (Ich brauchte tatsächlich eine Zurück-Schaltfläche, die mehr als nur das Zurückgehen bedeutet, also musste ich die Eigenschaft leftBarButtonItem verwenden). Ich habe versucht, was AndrewS vorgeschlagen hat, aber in der Navigationsleiste würde es nicht so aussehen, wie es sollte, da der UIButton in ein UIBarButtonItem umgewandelt wurde.

Aber ich habe einen Weg gefunden, dies zu umgehen. Ich habe gerade eine UIView unter den UIButton gestellt und die customView für das UIBarButtonItem festgelegt. Hier ist der Code, wenn jemand ihn braucht:

// initialize button and button view
UIButton *backButton = [UIButton buttonWithType:101];
UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backButton.frame.size.width, backButton.frame.size.height)];

[backButton addTarget:self action:@selector(backButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButtonView addSubview:backButton];

// set buttonview as custom view for bar button item
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButtonItem;

// push item to navigationbar items
[self.navigationController.navigationBar setItems:[NSArray arrayWithObject:backButtonItem]];
marikaner
quelle
1

Um ein Bild für die UIToolbar zu erstellen, erstellen Sie in Photoshop ein PNG. Wenn eine Farbe vorhanden ist, wird es weiß angezeigt. Wenn Alpha = 0 ist, wird es in Ruhe gelassen.

Das SDK setzt den Rand um das von Ihnen erstellte Symbol und färbt es weiß, ohne dass Sie etwas tun müssen.

Sehen Sie, das habe ich in Photoshop für meine Vorwärtsschaltfläche gemacht (tauschen Sie es offensichtlich gegen die Zurückschaltfläche aus):

http://twitpic.com/1oanv

und so sah es in Interface Builder aus

http://twitpic.com/1oaoa

Domness
quelle
1

Lösung OHNE Verwendung eines PNG. Basierend auf dieser SO-Antwort: Hinzufügen des kleinen Pfeils auf der rechten Seite einer Zelle in einer iPhone TableView-Zelle

Einfach die UITableViewCell horizontal drehen!

UIButton *btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 5, 70, 20)];

// Add the disclosure
CGRect frm;
UITableViewCell *disclosure = [[UITableViewCell alloc] init];
disclosure.transform = CGAffineTransformScale(CGAffineTransformIdentity, -1, 1);
frm = self.btnBack.bounds;
disclosure.frame = CGRectMake(frm.origin.x, frm.origin.y, frm.size.width-25, frm.size.height);
disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
disclosure.userInteractionEnabled = NO;
[self.btnBack addSubview:disclosure];

// Add the label
UILabel *lbl = [[UILabel alloc] init];
frm = CGRectOffset(self.btnBack.bounds, 15, 0);
lbl.frame = frm;
lbl.textAlignment = NSTextAlignmentCenter;
lbl.text = @"BACK";
[self addSubview:lbl];
Gabriel Jensen
quelle
1

Swift 5.2 Xcode 11.4

Das Apple Symbol chevron.left ermöglicht jetzt eine elegantere Lösung, um eine benutzerdefinierte Schaltfläche zu erstellen . Ich habe die Größe und den Abstand so genau wie möglich angepasst.

Geben Sie hier die Bildbeschreibung ein

import UIKit

class CustomBackButton: UIBarButtonItem {

    convenience init(target: Any, selector: Selector) {

        // Create UIButton
        let button = UIButton(frame: .zero)

        // Customise Title
        button.setTitle("Back", for: .normal)
        button.setTitleColor(.systemBlue, for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 17)

        // Customise Image
        let config = UIImage.SymbolConfiguration(pointSize: 19.0, weight: .semibold, scale: .large)
        let image = UIImage(systemName: "chevron.left", withConfiguration: config)
        button.setImage(image, for: .normal)

        // Add Target
        button.addTarget(target, action: selector, for: .touchUpInside)

        // Customise Spacing to match system Back button
        button.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: -18.0, bottom: 0.0, right: 0.0)
        button.titleEdgeInsets = UIEdgeInsets(top: 0.0, left: -12.0, bottom: 0.0, right: 0.0)

        self.init(customView: button)
    }
}

Dies kann entweder als UIToolbarItemoder als implementiert werdenUINavigationItem

override func viewDidLoad() {
    super.viewDidLoad()

    // UIToolbar Item
    let barBackButton = CustomBackButton(target: self, selector: #selector(backButtonTapped))
    let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    navigationController?.setToolbarHidden(false, animated: false)
    toolbarItems = [barBackButton, flexSpace]

    // Navigation Item
    let navBackButton = CustomBackButton(target: self, selector: #selector(backButtonTapped))
    navigationItem.leftBarButtonItem = navBackButton
}

@objc func backButtonTapped() {
    print("Back tapped")
}

Wenn Sie die Schaltfläche umlegen möchten und der Pfeil nach rechts zeigt:

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie das Apple-Symbol mit dem Namen "chevron.right".

Fügen Sie der CustomBackButtonKlasse den folgenden Code hinzu :

    // Put the image of the right side of the button
    button.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
    button.titleLabel?.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
    button.imageView?.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
rbaldwin
quelle
0

Wenn Sie vermeiden möchten, es selbst zu zeichnen, können Sie die undokumentierte Klasse UINavigationButton mit Stil 1 verwenden. Dies kann natürlich verhindern, dass Ihre Anwendung genehmigt wird ... / John

John Lane
quelle
0

Nun, Sie müssen nicht für jede Größe eine andere Schaltfläche haben, die Sie verwenden können [UIImage stretchableImageWithLeftCapWidth:topCapHeight:], aber das einzige, was ich gefunden habe, sind benutzerdefinierte Bilder.

Ben Gottlieb
quelle
0

Ich hatte ein ähnliches Problem und kam aus einer Bibliothek PButton heraus . Das Beispiel ist die Schaltfläche für die Zurück-Navigationstaste, die wie eine benutzerdefinierte Schaltfläche überall verwendet werden kann.

Etwas wie das: Geben Sie hier die Bildbeschreibung ein

Shuo
quelle
0

Beispiel in Swift 3 mit einer vorherigen und einer nächsten Schaltfläche oben rechts.

let prevButtonItem = UIBarButtonItem(title: "\u{25C0}", style: .plain, target: self, action: #selector(prevButtonTapped))
let nextButtonItem = UIBarButtonItem(title: "\u{25B6}", style: .plain, target: self, action: #selector(nextButtonTapped))
self.navigationItem.rightBarButtonItems = [nextButtonItem, prevButtonItem]
Bart van Kuik
quelle
0

Schnell

// create button
    var backButton = UIButton(type: 101)

    // left-pointing shape!
    backButton.addTarget(self, action: #selector(self.backAction), for: .touchUpInside)
    backButton.setTitle("Back", for: .normal)

    // create button item -- possible because UIButton subclasses UIView!
    var backItem = UIBarButtonItem(customView: backButton)

    // add to toolbar, or to a navbar (you should only have one of these!)
    toolbar.items = [backItem]
    navItem.leftBarButtonItem = backItem

quelle
-5

Versuche dies. Ich bin sicher, dass Sie kein Bild mit der Schaltfläche "Zurück" benötigen, um ein solches zu erstellen.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(yourSelectorGoesHere:)];
self.navigationItem.backBarButtonItem = backButton;

Das ist alles was du tun musst :)

Mj.B.
quelle
-23

Warum tust du das? Wenn Sie etwas möchten, das wie eine Navigationsleiste aussieht, verwenden Sie UINavigationBar.

Symbolleisten haben einen bestimmten visuellen Stil. Die Richtlinien für die Benutzeroberfläche für den iPhone-Status:

Eine Symbolleiste wird am unteren Rand des Bildschirms angezeigt und enthält Schaltflächen, mit denen Aktionen ausgeführt werden, die sich auf Objekte in der aktuellen Ansicht beziehen.

Anschließend werden einige visuelle Beispiele für ungefähr quadratische Symbole ohne Text angezeigt. Ich möchte Sie dringend bitten, diesbezüglich dem HIG zu folgen.

Colin Barrett
quelle
8
Mir ist das bewusst, danke. Ich halte meinen Verwendungszweck jedoch für angemessen. Können Sie hilfreicher sein, vorausgesetzt, ich möchte wirklich das tun, worüber ich gefragt habe?
Marco
Wenn Sie es oben auf dem Bildschirm platzieren, wird es falsch verwendet. Vergleichen Sie die Farbverläufe und Ränder zwischen der UINavigationBar und der UIToolbar, und Sie werden feststellen, dass sie sich geringfügig unterscheiden. Sie möchten auf jeden Fall eine UINavigationBar am oberen Bildschirmrand verwenden.
NilObject
10
Ich lege es auf den Boden.
Marco