ios – 嵌入在容器视图中的UINavigationController,显示大小错误的表视图控制器

ios – 嵌入在容器视图中的UINavigationController,显示大小错误的表视图控制器,第1张

概述我正在尝试找到解决这种情况的方法: 我有一个UITabBarController它的一个segue连接到一个容器视图控制器(BannerViewController),我用来嵌入一个UINavigationController,导航控制器推送其他容器视图控制器(EventListContainerviewController),每个包含一个tableview控制器. 这是我的故事板上的一个屏幕 问 我正在尝试找到解决这种情况的方法:
我有一个UITabbarController它的一个segue连接到一个容器视图控制器(BannerVIEwController),我用来嵌入一个UINavigationController,导航控制器推送其他容器视图控制器(EventListContainervIEwController),每个包含一个tablevIEw控制器.
这是我的故事板上的一个屏幕

问题是最后一个容器视图显示在一个比它们的容器更小的框架中.它们似乎松动了底部的tabbar空间.

我强制所有视图控制器,导航控制器和tabbar控制器都避免不扩展边缘并调整插入.

颜色意味着:

Red: main vIEw of the BannerContainerVIEwController 0x7fcc6d38bb00
light green : the container vIEw of the BannerContainerVIEwController
0x7fcc6d38b860

Blue: main vIEw of the EventListContainerVIEwController 0x7fcc6bd7b7c0
Orange: the container vIEw of the EventListContainerVIEwController
0x7fcc6bd7b690

当导航控制器添加蓝色容器视图时,似乎某些东西会发生变化,从而减少相同数量的tabbar(49pt).
它也可以在视图层次结构的递归描述中看到:

<UIWindow: 0x7fcc6bd5af40; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7fcc6bd4dd80>; layer = <UIWindowLayer: 0x7fcc6bd317c0>>   | <UILayoutContainerVIEw: 0x7fcc6bd671c0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fcc6bd66de0>>   |    | <UITransitionVIEw: 0x7fcc6bd6a980; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7fcc6bd6ace0>>   |    |    | <UIVIEwControllerWrapperVIEw: 0x7fcc6d3a7b20; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fcc6d3a7db0>>   |    |    |    | <UIVIEw: 0x7fcc6d38bb00; frame = (0 0; 320 519); autoresize = W+H; layer = <CALayer: 0x7fcc6d38bbd0>>   |    |    |    |    | <UIVIEw: 0x7fcc6d38b860; frame = (0 0; 320 519); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fcc6d38b930>>   |    |    |    |    |    | <UILayoutContainerVIEw: 0x7fcc6d398000; frame = (0 0; 320 519); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fcc6d3a4b50>; layer = <CALayer: 0x7fcc6d387670>>   |    |    |    |    |    |    | <UINavigationTransitionVIEw: 0x7fcc6d39cfa0; frame = (0 0; 320 519); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7fcc6d39cc40>>   |    |    |    |    |    |    |    | <UIVIEwControllerWrapperVIEw: 0x7fcc6bf31230; frame = (0 0; 320 519); autoresize = W+H; layer = <CALayer: 0x7fcc6bf31300>>   |    |    |    |    |    |    |    |    | <UIVIEw: 0x7fcc6bd7b7c0; frame = (0 64; 320 406); autoresize = W+H; layer = <CALayer: 0x7fcc6bd7afe0>>   |    |    |    |    |    |    |    |    |    | <UIVIEw: 0x7fcc6bd7b690; frame = (0 0; 320 406); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fcc6bd7aac0>>   |    |    |    |    |    |    |    |    |    |    | <UItableVIEw: 0x7fcc6f03c400; frame = (0 0; 320 406); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7fcc6bf34aa0>; layer = <CALayer: 0x7fcc6bf30bc0>; contentOffset: {0,0}; contentSize: {320,170}>   |    |    |    |    |    |    |    |    |    |    |    | <UItableVIEwWrapperVIEw: 0x7fcc6bf35960; frame = (0 0; 320 406); gestureRecognizers = <NSArray: 0x7fcc6bf363e0>; layer = <CALayer: 0x7fcc6bf35ed0>; contentOffset: {0,406}>   |    |    |    |    |    |    |    |    |    |    |    |    | <EventCell: 0x7fcc6bca2950; baseClass = UItableVIEwCell; frame = (0 85; 320 85); autoresize = W; layer = <CALayer: 0x7fcc6bca2ca0>>

我试图使用自定义segue而不是容器视图尝试强制布局,但我猜是导航控制器故障.
如您所见,横幅未按预期与视图重叠.

有什么建议吗?

解决方法 这个问题在iOS 10中仍然存在.嵌入在容器视图中的UINavigationController又包含在UITabbarController中,它将在导航堆栈中布置所有视图,并为底部的“幻像”选项卡栏留出额外空间.

最简单的解决方案是子类化UINavigationController并从tabbarController返回’nil’.

class MyNavigationController: UINavigationController {    overrIDe var tabbarController: UITabbarController? {        return nil    }}

这使得导航堆栈中的视图认为它们没有标签栏控制器,因此在布局期间它们不会为它留下额外的空间.我没有发现此修复有任何负面影响,但显然此导航控制器堆栈中的视图将无法再访问标签栏控制器.如果这是一个问题,您可以使用更通用的方法来查找标签栏控制器(或任何“父”视图控制器).

例如,如果您的应用程序的主视图控制器是名为“MainVIEwController”的UITabbarController,则可以使用便捷方法扩展UIVIEwController以查找它.

extension UIVIEwController {    func mainVIEwController() -> MainVIEwController? {        var vc: UIVIEwController? = self        while !(vc is MainVIEwController) && vc != nil {            vc = vc?.parent ?? vc?.navigationController ?? vc?.presentingVIEwController        }        return vc as? MainVIEwController    }}

这是因为标签栏控制器是其直接子视图控制器的父级.上述方法沿着父链,呈现和导航控制器的方式向上移动,最终到达标签栏控制器的子节点,该控制器返回标签栏控制器作为其父节点.

总结

以上是内存溢出为你收集整理的ios – 嵌入在容器视图中的UINavigationController,显示大小错误的表视图控制器全部内容,希望文章能够帮你解决ios – 嵌入在容器视图中的UINavigationController,显示大小错误的表视图控制器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1106171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存