2015-11-12 1 views
5

Я хочу использовать толстую линию внизу UITabbarItems в качестве индикатора выбора. Из-за того, что приложение должно работать на разных телефонах, я не могу использовать изображение в качестве индикатора выбора. Вот почему я считаю, что для этого нужно использовать Swift. (Строка должна быть 1/3 ширины страницы).Добавьте строку в качестве индикатора выбора в UITabbarItem в Swift

Я попытался использовать UITabBarItem.appearance(), но безуспешно.

+0

вы можете использовать 'UIView' и установить выделенный цвет фона для этого же. – Nishant

ответ

3

Я решил свою проблему.

Особенности этого крошечного фрагмента кода:

  • ширина динамического
  • это анимированный
  • это намного более настраиваемый для будущих функций

    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) 
    } 
    } 
    
10

Вы можете сделать это с добавлением пользовательского изображения, которое будет создано в вашем коде, до 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 
    } 
} 

И называют это в вашей первой загрузке 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. 
    } 
} 

В этом случае результат будет выглядеть следующим образом:

enter image description here

7

Swift 3:

extension UIImage { 
    func createSelectionIndicator(color: UIColor, size: CGSize, lineWidth: CGFloat) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(size, false, 0) 
     color.setFill() 
     UIRectFill(CGRect(origin: CGPoint(x: 0,y :size.height - lineWidth), size: CGSize(width: size.width, height: lineWidth))) 
     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), lineWidth: 2.0) 
} 
+0

Спасибо, решила моя проблема –

+0

спасибо, но в iphone X 11.2 это не работает, значит, 2.0px-бар не выравнивается с tarbar, а собирается 20pix. Есть идеи? –

Смежные вопросы