Составление 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];
надеюсь, помогло:)