UITabBarItem背景由UITabBar.appearance()设置.selectionIndicatorImage在iPhone X上未对齐

Vla*_*lad 5 ios swift iphone-x

代码:

let size = CGSize(width: tabBar.frame.width / CGFloat(TabBarItem.allValues.count),
                  height: tabBar.frame.height)
let image = UIImage.image(color: Color.action, size: size)
UITabBar.appearance().selectionIndicatorImage = image
Run Code Online (Sandbox Code Playgroud)

在通常的设备上看起来像这样:

在此输入图像描述

在iPhone X上像这样:

在此输入图像描述

iPhone X标签栏项目背景错位的原因是什么?


更新1:

更改代码后,它看起来更好,但它仍然是解决方法,因为图像不完全占据标签栏项目空间:

  var image: UIImage
  if DeviceInfo.is5p8Inch {
     image = UIImage.image(color: Color.action, size: CGSize(width: 4, height: 4))
     image = image.resizableImage(withCapInsets: UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2), resizingMode: .tile)
  } else {
     let size = CGSize(width: tabBar.frame.width / CGFloat(TabBarItem.allValues.count),
                       height: tabBar.frame.height)
     image = UIImage.image(color: Color.action, size: size)
  }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


更新2:

上面的代码从viewDidLoad(也尝试从viewWillAppear)调用.UITabBarController从代码中编写的100%的子类(没有使用Storyboard/Xibs).


更新3:

我们还有一个自定义按钮作为子视图添加到UITabBar,它正确定位.只是selectionIndicatorImage错位......

在此输入图像描述


更新4:

在上面运行原始代码viewDidAppear而不是in viewDidLoadviewWillAppear产生以下结果:

在此输入图像描述

Dev*_*per 1

您只需要在延迟后调用它,因为在您的情况下它没有获得正确的 tabBar 高度并将其设置在 self.tabBar 中,下面的代码对我有用,我在viewDidload

Async.main {
        let size = CGSize(width: tabBar.frame.width / CGFloat(TabBarItem.allValues.count),
                          height: tabBar.frame.height)
        let image = UIImage.image(color: Color.action, size: size)
        UITabBar.appearance().selectionIndicatorImage = image
        self.tabBar.selectionIndicatorImage = image // this will change color and height of current tabBar
    }
Run Code Online (Sandbox Code Playgroud)