Tob*_*aut 10 uitabbaritem uitabbar swift
我想在UITabbarItems底部使用粗线作为选择指示器.由于应用程序必须适用于不同的手机尺寸,我无法使用图像作为选择指示器.这就是为什么我认为我必须使用Swift来做到这一点.(该行必须是页面宽度的1/3).
我尝试使用UITabBarItem.appearance()但没有成功.
Ale*_*kov 15
你可以这样做与添加自定义图像,将在你的代码中创建,以selectionIndicatorImage您的UITabBar对象.例如,您可以像这样extension为UIImage类创建:
extension UIImage {
func createSelectionIndicator(color: UIColor, size: CGSize, lineWidth: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(CGRectMake(0, size.height - lineWidth, size.width, lineWidth))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Run Code Online (Sandbox Code Playgroud)
并在你第一次加载时调用它ViewController:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let tabBar = self.tabBarController!.tabBar
tabBar.selectionIndicatorImage = UIImage().createSelectionIndicator(UIColor.blueColor(), size: CGSizeMake(tabBar.frame.width/CGFloat(tabBar.items!.count), tabBar.frame.height), lineWidth: 2.0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,结果将是这样的:
小智 11
斯威夫特3:
extension UIImage {
func createSelectionIndicator(color: UIColor, size: CGSize, lineHeight: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(CGRect(origin: CGPoint(x: 0,y :size.height - lineHeight), size: CGSize(width: size.width, height: lineHeight)))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
override func viewDidLoad() {
super.viewDidLoad()
let tabBar = self.tabBarController!.tabBar
tabBar.selectionIndicatorImage = UIImage().createSelectionIndicator(color: UIColor.blue, size: CGSize(width: tabBar.frame.width/CGFloat(tabBar.items!.count), height: tabBar.frame.height), lineHeight: 2.0)
}
Run Code Online (Sandbox Code Playgroud)
雨燕4.x
Xcode 10.x
extension UIImage {
func createSelectionIndicator(color: UIColor, size: CGSize, lineWidth: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(CGRect(x: 0, y: size.height - lineWidth, width: size.width, height: lineWidth))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
Run Code Online (Sandbox Code Playgroud)
使用
tabBar.selectionIndicatorImage = UIImage().createSelectionIndicator(color: BLUE, size: CGSize(width: tabBar.frame.width/CGFloat(tabBar.items!.count), height: tabBar.frame.height), lineWidth: 2.0)
Run Code Online (Sandbox Code Playgroud)
我解决了我的问题。
这个小代码片段的特点:
它可以为未来的功能提供更多的可定制性
class FirstViewController: UIViewController {
let rectShape = CAShapeLayer()
let indicatorHeight: CGFloat = 5
var indicatorWidth: CGFloat!
let indicatorBottomMargin: CGFloat = 2
let indicatorLeftMargin: CGFloat = 2
override func viewDidLoad() {
super.viewDidLoad()
// setup tabbar indicator
rectShape.fillColor = UIColor.redColor().CGColor
indicatorWidth = view.bounds.maxX / 2 // count of items
self.tabBarController!.view.layer.addSublayer(rectShape)
self.tabBarController?.delegate = self
// initial position
updateTabbarIndicatorBySelectedTabIndex(0)
}
func updateTabbarIndicatorBySelectedTabIndex(index: Int) -> Void
{
let updatedBounds = CGRect( x: CGFloat(index) * (indicatorWidth + indicatorLeftMargin),
y: view.bounds.maxY - indicatorHeight,
width: indicatorWidth - indicatorLeftMargin,
height: indicatorHeight)
let path = CGPathCreateMutable()
CGPathAddRect(path, nil, updatedBounds)
rectShape.path = path
}
}
extension FirstViewController: UITabBarControllerDelegate {
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
updateTabbarIndicatorBySelectedTabIndex(tabBarController.selectedIndex)
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
6158 次 |
| 最近记录: |