当 UINavigationController 模态呈现时 UIBarButtonItems 移动位置

Posted

技术标签:

【中文标题】当 UINavigationController 模态呈现时 UIBarButtonItems 移动位置【英文标题】:UIBarButtonItems shift position when UINavigationController is presented modally 【发布时间】:2014-08-20 22:47:05 【问题描述】:

我在 ios 应用扩展中以模态方式呈现 UINavigationController

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

导航控制器出现时,其根视图控制器的UIBarButtonItems跳转位置:

我正在viewDidLoad 中创建和添加按钮。它们只是标准的条形按钮项:

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

我没有覆盖viewDidAppear(这似乎是按钮跳转的地方)。

在我的应用程序中呈现相同的导航控制器/根视图控制器,而不是应用程序扩展,不会给我同样的问题。有什么想法吗?

【问题讨论】:

这里有同样的问题 - 认为使用所有 UIBarButtonItems 的默认外观的自定义字体是个问题,但我拿走了自定义字体,它一直在发生!我从DDMenuController 调用我的模态,并且这个问题肯定没有出现在iOS7 中。我什至没有设置modalPresentationStylemodalTransitionStyle 附带说明,每次我以模态方式呈现 VC 时,都会收到控制台消息“不鼓励在分离的视图控制器上呈现视图控制器 ”。我已经尝试从DDMenuController 及其根控制器进行演示,但无论哪种方式我都会收到消息。也许这就是不鼓励它的原因? @Stonz2 在viewWillAppear,尝试调用[self.view setNeedsLayout]; [self.view layoutIfNeeded]; @LeoNatan 不。演示时仍在变化。 也许你应该尝试预加载你的 modalView :***.com/questions/12782841/… 【参考方案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];

这只发生在我的共享扩展上,我没有任何与从分离的控制器或类似的东西呈现相关的问题。

【讨论】:

谢谢。由于这个解决方案,你让我的一天变得更好【参考方案2】:

正如@Stonz2 所提到的,这似乎是从分离的视图控制器中呈现模式的特征。我遇到了同样的问题,并通过重新组织我的应用程序来解决它,这样它就不会从分离的控制器中呈现出来。

如果您收到以下错误消息,您将知道您是否从分离的控制器进行演示:

不鼓励在分离的视图控制器上显示视图控制器

【讨论】:

我有问题,但我没有收到“不鼓励在分离的视图控制器上显示视图控制器”消息。【参考方案3】:

我是从一个分离的 viewController 进行演示的。我从来没有收到警告。但是我尝试将分离的 viewController 嵌入到 NavigationController 中,问题就消失了。

【讨论】:

以上是关于当 UINavigationController 模态呈现时 UIBarButtonItems 移动位置的主要内容,如果未能解决你的问题,请参考以下文章

当 rootViewController 不是 UINavigationController 时推送视图

当 UIViewController 模态显示时,UINavigationController(在 UITabBarController 选项卡内)丢失堆栈

UIRefreshControl - 当 UITableViewController 在 UINavigationController 中时,beginRefreshing 不起作用

当 UITextField 在 modalView 中有第一响应者时,UINavigationController 堆栈错误

当应用程序 rootViewController 是 tabBarController 时 UINavigationController 的奇怪行为

当 UISplitViewController 旋转为纵向时,如何调整 UINavigationController 内容的大小