Arm1.ru

Кастомный бейдж для UITabBarController на Swift

Шёл 2016 год, а для того, чтобы изменить цвета для бейджа внутри таба всё ещё необходимо создавать свой UI-элемент и добавлять его в таббар вручную. Работающее решение на Swift:

// MARK: - UITabBarController extension for badges
extension UITabBarController {

  /**
  Set badges

  - parameter badgeValues: values array
  */
  func setBadges(badgeValues: [Int]) {

    for view in self.tabBar.subviews {
      if view is CustomTabBadge {
        view.removeFromSuperview()
      }
    }

    for index in 0...badgeValues.count-1 {
      if badgeValues[index] != 0 {
        addBadge(index,
                 value: badgeValues[index],
                 color:UIColor.yellowColor(),
                 font: UIFont.systemFontOfSize(11)
        )
      }
    }

  }

  /**
  Add badge for tab

  - parameter index: index of tab
  - parameter value: badge value
  - parameter color: badge color
  - parameter font: badge font
  */
  func addBadge(index: Int, value: Int, color: UIColor, font: UIFont) {
    let badgeView = CustomTabBadge()

    badgeView.clipsToBounds = true
    badgeView.textColor = UIColor.whiteColor()
    badgeView.textAlignment = .Center
    badgeView.font = font
    badgeView.text = String(value)
    badgeView.backgroundColor = color
    badgeView.tag = index
    tabBar.addSubview(badgeView)

    self.positionBadges()
  }

  override public func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.tabBar.setNeedsLayout()
    self.tabBar.layoutIfNeeded()
    self.positionBadges()
  }

  /**
  Positioning
  */
  func positionBadges() {

    var tabbarButtons = self.tabBar.subviews.filter { (view: UIView) -> Bool in
      return view.userInteractionEnabled // only UITabBarButton are userInteractionEnabled
    }

    tabbarButtons = tabbarButtons.sort({ $0.frame.origin.x < $1.frame.origin.x })

    for view in self.tabBar.subviews {
      if view is CustomTabBadge {
        let badgeView = view as! CustomTabBadge
        self.positionBadge(badgeView, items:tabbarButtons, index: badgeView.tag)
      }
    }
  }

  /**
  Position for badge

  - parameter badgeView: badge view
  - parameter items: tab bar buttons array
  - parameter index: index of tab
  */
  func positionBadge(badgeView: UIView, items: [UIView], index: Int) {

    let itemView = items[index]
    let center = itemView.center

    let xOffset: CGFloat = 12
    let yOffset: CGFloat = -14
    badgeView.frame.size = CGSizeMake(17, 17)
    badgeView.center = CGPointMake(center.x + xOffset, center.y + yOffset)
    badgeView.layer.cornerRadius = badgeView.bounds.width/2
    tabBar.bringSubviewToFront(badgeView)
  }

}

/// Custom UILabel class for badge view
class CustomTabBadge: UILabel {}

keyboard_return back