12

Wenn eine neue Ansicht mit einer UIBarButtonSystemItemCompose-Schaltfläche in der Navigationsleiste angezeigt wird, ist die Position leicht aus und wird angepasst, nachdem die Ansicht angezeigt wurde.Compose UIBarButtonItem ändert die Position beim Anzeigen der Position leicht

Compose button changes position slightly when coming into view

Ich denke, dies ein Fehler in iOS (Version 8.3) verwendet. Es tritt nur auf, wenn das UIBarButtonSystemItemCompose verwendet. Bei anderen Arten von Schaltflächen (System, Text oder Benutzerdefiniert) ist dies nicht der Fall.

Der einzige Code benötigt, um diesen Fehler zu replizieren, ist dieses Viewcontroller-Code mit der Ansicht zu verwenden, die in den Blick kommen:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view, typically from a nib. 

    UIBarButtonItem* composeBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera 
             target:nil 
             action:nil]; 

    [self.navigationItem setRightBarButtonItem:composeBarButtonItem animated:YES]; 
} 

@end 

ich ein Repository auf GitHub mit Nötigste Code erstellt haben, um das Problem zu reproduzieren: https://github.com/jvdvleuten/iOSComposeBarButtonItemBug

Sieht im Zusammenhang damit: UIBarButtonItems shift position when UINavigationController is presented modally, außer mein Fehler erscheint nur bei Verwendung der UIBarButtonSystemItemCompose.

Irgendwelche Ideen?

+1

ya..it einen Fehler, wenn Sie als Stil zu verfassen ... aber ich denke, Sie sollten 'viewDiidAppear' für diesen Code verwenden ... –

+0

Nein, wenn Sie den Code in ViewDidApear verwenden, kommt die Ansicht in Aussicht ohne ohne den Knopf. Das ist kein Standard. –

+0

ya ich weiß ... aber es ist eine Lösung für jetzt ... anstatt dieser irritierenden Ansicht .... das ist die bessere Lösung ... oder verwenden Sie Sergey Kuryanov als Lösung antworten –

Antwort

3

I Sergey Antwort verwendet, aber einen leeren Raum rechts von meiner Taste gehalten.Ich reparierte dies mit einem negativen Abstandshalter, die jetzt schön funktioniert:

UIBarButtonItem* composeBarButtonItem = 
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
               target:nil 
               action:nil]; 

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
             initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
             target:nil action:nil]; 
negativeSpacer.width = -6; 

UIBarButtonItem *dumbBarButtonItem = [UIBarButtonItem new]; 

self.navigationItem.rightBarButtonItems = @[dumbBarButtonItem, negativeSpacer, self.composeBarButtonItem]; 
+0

Hm .. Ich habe auch Spacer benutzt, aber es hat nicht funktioniert. Vielleicht, weil ich nur Spacer und Original-Taste verwendet habe. Guter Fang. –

+0

Ich weiß auch nicht ob -6 die richtige Menge ist, aber es fühlt sich richtig an;) –

-4

kann es passieren, dass Animation

versuchen Sie diese. [self.navigationItem setRightBarButtonItem: composeBarButtonItem animiert: NO];

hoffentlich geholfen :)

+0

Versucht es, hat das gleiche Ergebnis. –

-2

Ja, das ist IOS8 Bug.

Es passiert, weil Springen nicht eine Navigationsleiste Artikelposition, seine Sprungbildposition in Artikel verfassen. Dieser Item-Typ hat keine Übersteuerung für Push-Animationen oder ähnliches, wie zum Beispiel die Zurück-Schaltfläche.

Ich denke, Sie sollten Bug auf Radar erstellen und für die Behebung Ihres aktuellen Problems, erstellen Sie einfach benutzerdefinierte UIBarButtonItem mit dem gleichen Bild.

+0

Warum ist es nicht abgestimmt? –

+0

Ich schlage nur verwandte Dinge vor und bestätige den Fehler, indem ich meine Zeit für die Untersuchung aufbrauche. Das werde ich nächstes Mal nicht tun. –

+0

Ich habe einen Fehlerbericht mit Apple hinzugefügt. Danke für die Hilfe. –

2

Dies ist definitiv ein Fehler in iOS 8.0. Dieser 'Sprung' tritt vor viewDidAppear auf. Hier Abhilfe für dieses - Einen weiteren hinzufügen ‚stumm‘/leer Artikel:

UIBarButtonItem* composeBarButtonItem = 
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
               target:nil 
               action:nil]; 
UIBarButtonItem *dumbBarButtonItem = [UIBarButtonItem new]; 
self.navigationItem.rightBarButtonItems = @[dumbBarButtonItem, composeBarButtonItem]; 
+0

Ich behalte tatsächlich einen leeren Platz rechts von meinem Komponieren-Knopf und kann es nicht mit einer leeren Sicht loswerden? –

-1

Ich denke, das Problem der UIBarButtonSystemItemCompose ist. Ich brauche etwas Korrektur von Apple Entwickler-Team. Bis Apple diesen Fehler nicht lösen. Sie können Ihre benutzerdefinierte Schaltfläche erstellen und sie mit folgendem Code auf rightBarButtonItem setzen.

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:[UIImage imageNamed:@"compose.png"] forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(buttonAction:)forControlEvents:UIControlEventTouchUpInside]; 
    [button setFrame:CGRectMake(0, 0, 53, 31)]; 

    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.rightBarButtonItem = barButton; 

-(void)buttonAction:(id)sender{ 
    NSLog(@"Click"); 
} 

Hoffe, dass diese Ihnen helfen.

+1

Kann jemand unten meine Antwort abstimmen. Ich denke, dass Sie für dasselbe Problem besser antworten müssen. Bitte posten Sie Ihre Antwort anders als unten. Es kann uns in Zukunft helfen. –

-1

Schöne Beobachtung, Dieses Problem gelöst in viewDidAppear. Können Sie bitte dies überprüfen ..

- (void)viewDidAppear:(BOOL)animated{  
     [super viewDidAppear:animated]; 

     UIBarButtonItem* composeBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil];  
     [self.navigationItem setRightBarButtonItem:composeBarButtonItem animated:YES];  
} 

Dies könnte Ihnen helfen :)

+1

Das wird meinen Knopf zu spät animieren. –

0

Eine einfache Abhilfe:

let composeButton = UIBarButtonItem(image: UIImage(named: "UIButtonBarCompose"), style: .Plain, target: self, action: "compose:") 
self.navigationItem.rightBarButtonItem = composeButton 

Wir können das Bild bekommen ‚UIButtonBarCompose‘ mit iOS-Artwork-Extractor.