Составление UIBarButtonItem слегка меняет позицию при вводе в поле зрения

При представлении нового представления с помощью кнопки UIBarButtonSystemItemCompose в навигационной панели позиция немного выключена и настраивается после того, как представление появилось.

Compose button changes position slightly when coming into view

Я думаю, что это ошибка в iOS (используется версия 8.3). Это происходит только при использовании UIBarButtonSystemItemCompose. Это не происходит с другими типами кнопок (системный, текстовый или пользовательский).

Единственным кодом, необходимым для репликации этой ошибки, является использование этого кода ViewController с представлением, которое будет отображаться:

#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

Я создал репозиторий на GitHub с минимальным минимальным кодом, чтобы воспроизвести проблему: https://github.com/jvdvleuten/iOSComposeBarButtonItemBug

Выражения, связанные с этим: UIBarButtonItems сдвигает позицию, когда UINavigationController представлен в формате, за исключением того, что моя ошибка появляется только при использовании UIBarButtonSystemItemCompose.

Любые идеи?

Ответ 1

Я использовал ответ Сергея, но оставил пустое пространство справа от моей кнопки. Я исправил это с помощью отрицательной проставки, которая теперь прекрасно работает:

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

Ответ 2

Это определенно ошибка в iOS 8.0. Этот "переход" происходит до viewDidAppear. Вот обходной путь для этого - добавьте еще один "немой" /пустой элемент:

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

Ответ 3

Простейшее обходное решение:

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

Мы можем получить изображение 'UIButtonBarCompose' с iOS-Artwork-Extractor.

Ответ 4

Я думаю, что это проблема UIBarButtonSystemItemCompose. нужна некоторая коррекция от команды разработчиков Apple. Пока яблоко не решит эту ошибку. вы можете создать свою настраиваемую кнопку и установить ее на rightBarButtonItem, используя следующий код.

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

Надеюсь, что это поможет вам.

Ответ 5

Хорошее наблюдение. Эта проблема решена в viewDidAppear. Можете ли вы проверить это.

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

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

Это может вам помочь:)

Ответ 6

Да, это ошибка IOS8.

Это происходит потому, что прыгает не позиция позиции навигационной панели, ее позиция перехода по контуру в составной элемент. Этот тип элемента, похоже, не отменяет анимацию push или что-то подобное, например, кнопку возврата.

Я думаю, вы должны создать ошибку на радаре и исправить свои текущие проблемы, просто создайте пользовательский UIBarButtonItem с тем же изображением.

Ответ 7

может случиться, что анимация

попробуйте этот. [self.navigationItem setRightBarButtonItem: composeBarButtonItem animated: NO];

надеюсь, помогло:)