Swift 3 - selectionIndicatorImage 的 UITabBarItem 的全宽

Swift 3 - full width of UITabBarItem for selectionIndicatorImage

我有一个带有三个选项卡的 UITabBar。现在我想分配或假设将一个选项卡的完整宽度填充到相关的 selectionIndicatorImage,因为目前如果选择了一个选项卡,我会得到一个边框。如以下屏幕截图中左侧的选项卡所示:

我用新的 属性 创建了 UITabBar 的子类:

var activeItemBackground:UIColor = UIColor.white {
    didSet {

        let numberOfItems = CGFloat((items!.count))

        let tabBarItemSize = CGSize(width: frame.width / numberOfItems,
                                    height: frame.height)

        selectionIndicatorImage = UIImage.imageWithColor(color: activeItemBackground,
                                     size: tabBarItemSize).resizableImage(withCapInsets: .zero)

        frame.size.width = frame.width + 4
        frame.origin.x = -2


    }
}

和 UIImage-Extension 以获得背景颜色和图像:

extension UIImage
{
    class func imageWithColor(color: UIColor, size: CGSize) -> UIImage
    {
        let rect: CGRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

我读了很多关于这个问题的资料,但不幸的是我无法让它工作。我的代码中是否缺少某些内容?

我认为你采取了一些额外的步骤...

您正在计算标签栏项目的确切大小,并创建该大小的图像,因此您不需要.resizableImage部分。

而且,由于您设置为精确大小,因此您也不需要调整标签栏框架的大小。

这在我的测试中似乎工作正常(使用您的 .imageWithColor func):

class MyTabBar: UITabBar {

    var activeItemBackground:UIColor = UIColor.white {
        didSet {

            let numberOfItems = CGFloat((items!.count))

            let tabBarItemSize = CGSize(width: frame.width / numberOfItems,
                                        height: frame.height)

            selectionIndicatorImage = UIImage.imageWithColor(color: activeItemBackground,
                                                             size: tabBarItemSize)

        }
    }

}

然后在viewDidLoad的第一个VC:

    if let tb = self.tabBarController?.tabBar as? MyTabBar {
        tb.activeItemBackground = UIColor.red
    }