UITabBar 的怪异帧计算

Weird frame calculation for UITabBar

有时应用会缩小UITabBar的宽度,屏幕截图中的4个图标通常分布在整个宽度上。

有没有人遇到过这种情况并且知道为什么会发生,或者更好的方法是如何fix/avoid?我认为它是从 Swift 开始发生的,所以也许他们的另一个很棒的优化?

也不确定如何重现它,大约每周发生两次,可能是旋转、segue 或应用程序切换。

此屏幕截图来自 iPhone6 纵向模式,但在其他设备上也会出现。

我在 iOS9 上发现了两种相同的行为:

1) 在 UINavigationController;

的弹出式导航期间立即旋转

2) 在观看全屏视频播放器并在之后关闭播放器时从横向旋转到纵向。

要解决 iOS8+ 上的问题,您应该继承 UITabBarController 并从 UIContentContainer 协议实现方法,如下所示:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    if (!self.tabBar.window) return;

    [coordinator animateAlongsideTransition: ^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
         CGRect newBounds = self.tabBar.bounds;
         newBounds.size.width = size.width;
         self.tabBar.bounds = newBounds;

         [self.view.superview setNeedsLayout];
     }
                             completion: nil];
}

如果您不编写 return 字符串,您将无法解决第二个问题。

在 Swift 中添加相同的内容:

extension UITabBarController {
    public override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        if let _ = self.tabBar.window {
            coordinator.animateAlongsideTransition( { (context) in
                self.tabBar.bounds.size.width = size.width
                self.view.superview?.setNeedsLayout()
                }, completion: nil)
        }
    }
}