简体   繁体   中英

Compose UIBarButtonItem changes position slightly when coming into view

When presenting a new view with a UIBarButtonSystemItemCompose button in the navigation bar, the position is slightly off and adjusts after the view has come into view.

进入视图时,撰写按钮会稍微改变位置

I think this is a bug in iOS (version 8.3 used). It only happens when using the UIBarButtonSystemItemCompose. It does not happen with other types of Buttons (system, text or custom).

The only code needed to replicate this bug is to use this ViewController code with the view that will come into view:

#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

I have created a repository on GitHub with bare minimum code to reproduce the problem: https://github.com/jvdvleuten/iOSComposeBarButtonItemBug

Looks related to this: UIBarButtonItems shift position when UINavigationController is presented modally , except my bug only appears when using the UIBarButtonSystemItemCompose.

Any ideas?

I used Sergey's answer, but kept an empty space right of my button. I fixed this with a negative spacer, which now works beautifully:

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];

This is definitely a bug in iOS 8.0. This 'jump' occurs before viewDidAppear . Here is workaround for this - add another 'dumb'/empty item:

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

A simple workaround:

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

We can get the image 'UIButtonBarCompose' with iOS-Artwork-Extractor .

I think this is problem of UIBarButtonSystemItemCompose . need some correction from apple developer team. Untill apple don't get resolve this bug. you can create your custom button and set it to rightBarButtonItem using following code.

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");
}

Hope this help you.

Nice observation , This problem solved in viewDidAppear . Can you please check this..

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

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

This might help you :)

Yes, this is IOS8 bug.

It happens because jumping not a navigation bar item position, its jumping image position inside compose item. This item type seems hasn't override for push animation or something similar, as for example back button.

I think you should create bug on radar and for fix your current trouble, just create custom UIBarButtonItem with the same image.

it might happen of animation

try this one. [self.navigationItem setRightBarButtonItem:composeBarButtonItem animated:NO];

hopefully helped :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM