当 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
(这似乎是按钮跳转的地方)。
在我的应用程序中呈现相同的导航控制器/根视图控制器,而不是应用程序扩展,不会给我同样的问题。有什么想法吗?
【问题讨论】:
这里有同样的问题 - 认为使用所有UIBarButtonItem
s 的默认外观的自定义字体是个问题,但我拿走了自定义字体,它一直在发生!我从DDMenuController
调用我的模态,并且这个问题肯定没有出现在iOS7 中。我什至没有设置modalPresentationStyle
或modalTransitionStyle
。
附带说明,每次我以模态方式呈现 VC 时,都会收到控制台消息“不鼓励在分离的视图控制器上呈现视图控制器 DDMenuController
及其根控制器进行演示,但无论哪种方式我都会收到消息。也许这就是不鼓励它的原因?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 内容的大小