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
}
我有一个带有三个选项卡的 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
}