I've tried many things but impossible to find a way to put the label of a UITabBarItem with a lineNumber customised.0 (i would like to get the title on 2 lines).
Is there a way to do it?
I've tried many things but impossible to find a way to put the label of a UITabBarItem with a lineNumber customised.0 (i would like to get the title on 2 lines).
Is there a way to do it?
Now it contains two subviews. At 0 it is imageView and at 1 it is label.
Now make the height of imageview
a bit smaller so that you can give the height of label a bit larger to have multiple lines. Set the property ofnumberoflines
of the label to 0 via code.
let viewTabBar = tabBarItem.value(forKey: "view") as? UIView
let imageView = viewTabBar?.subviews[0] as? UIImageView
let label = viewTabBar?.subviews[1] as? UILabel
and now play with this label.
More stable solution:
guard let view = tabBarItem?.value(forKey: "view") as? UIView,
let label = (view.subviews.compactMap{ $0 as? UILabel }).first,
let imageView = (view.subviews.compactMap{ $0 as? UIImageView }).first else { return }
This is my solution for that
We need to implement this inside viewwillLayoutSubviews
, to update the UI and make it works.
In this example in going to customize my 3rd tab bar item only
override func viewWillLayoutSubviews() {
// acess to list of tab bar items
if let items = self.tabBar.items {
// in each item we have a view where we find 2 subviews imageview and label
// in this example i would like to change
// access to item view
let viewTabBar = items[2].value(forKey: "view") as? UIView
// access to item subviews : imageview and label
if viewTabBar.subviews.count == 2 {
let label = viewTabBar?.subviews[1]as? UILabel
// here is the customization for my label 2 lines
label?.numberOfLines = 2
label?.textAlignment = .center
label!.text = "tab_point".localized
// here customisation for image insets top and bottom
items[2].imageInsets = UIEdgeInsets(top: 8, left: 0, bottom: -5, right: 0)
}
}
}
tabBar.items?.forEach {
$0.imageInsets = UIEdgeInsets(top: 8, left: 0, bottom: -15, right: 0)
guard let view = $0.value(forKey: "view") as? UIView,
let label = (view.subviews.compactMap{ $0 as? UILabel }).first,
let imageView = (view.subviews.compactMap{ $0 as? UIImageView }).first else { return }
label.numberOfLines = 2
if CBServerManagerApi.sharedManager().currentUser.type == "Local" {
label.text = titles[element]
}
label.lineBreakMode = .byTruncatingTail
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.heightAnchor.constraint(equalToConstant: 30)
])
}
You can not do this with UITabBarItem
because it doesn't have property titleView
like UINavigationItem
.
You can set only string as title and tab image. That's it.
If UITabBarItem
had a titleView
property then you would have the option to set a label as titleView
with numberOfLines
set to 0 but here you can only set the title as a string.