UIBarButtonItems сдвигает позицию, когда UINavigationController представляется модально

Я представляю UINavigationController модально, из расширения приложения iOS:

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];       
nav.modalPresentationStyle = UIModalPresentationFormSheet;
nav.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:nav animated:YES completion:nil];

Когда появится контроллер навигации, его контроллер корневого представления UIBarButtonItems положение перехода:

Jumping buttons

Я создаю и добавляю кнопки в viewDidLoad. Это обычные элементы панели инструментов:

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done)];

Я не переопределяю viewDidAppear (который, как представляется, является точкой, где переключаются кнопки).

Представление этого же контроллера навигации/контроллера корневого каталога из моего приложения вместо расширения приложения не дает мне этой же проблемы. Любые идеи?

Ответ 1

Я надеюсь, что кто-то найдет лучший способ сделать это, но мое текущее решение - создать автономные кнопки, а затем использовать [[UIBarButtonItem alloc] initWithCustomView:] с помощью кнопки. Не идеально, и отступление все еще есть, но странный прыжок больше не случается.

Если отступы вас беспокоят, вы также можете установить отрицательные фиксированные пространства на внешних сторонах кнопок, чтобы сместить их ближе к краям.

Здесь пример, содержащий разделитель:

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
<other button config here, set targets, whatever>
[button sizeToFit];
UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:button];
UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[fixedSpace setWidth:-8.0f];

self.navigationItem.leftBarButtonItems = @[fixedSpace, leftBarButton];

Это происходит только со мной в моем расширении share, и у меня нет никаких проблем, связанных с представлением от отдельного контроллера или чего-то подобного.

Ответ 2

Как упоминалось в @Stonz2, это, по-видимому, является характеристикой представления модальности от отдельного контроллера представления. У меня была такая же проблема, и я исправил ее, переустановив мое приложение, чтобы оно не представлялось от отдельного контроллера.

Вы узнаете, если вы представляете отсоединенный контроллер, если появляется следующее сообщение об ошибке:

Представление контроллеров представлений на отдельных контроллерах просмотра не рекомендуется

Ответ 3

Я представлял из отдельного viewController. Я не получил предупреждения. Но я попытался внедрить этот независимый viewController в NavigationController, и проблема исчезла.