2015-07-06 2 views
9

Я пытаюсь отобразить значок на моей кнопке уведомления в приложении, как показано на AppIcon.Swift добавить значок к навигации barButtonItem и UIButton

До сих пор, что я исследовал, связано с Obj. C, но ничего, что конкретно обсуждалось, как реализовать это решение в Swift,

Помогите найти решение для добавления пользовательского класса/кода для достижения значка на UiBarbutton и UiButton.

исследуемыми до сих пор:

https://github.com/Marxon13/M13BadgeView

вместе с классом MKBadge и т.д.

ответ

0

MIBadgeButton-Swift работает также на UIBarButtonItems. Вот мой код после того, как создается панель навигации:

let rightBarButtons = self.navigationItem.rightBarButtonItems 

let alarmsBarButton = rightBarButtons?.last 

let alarmsButton = alarmsBarButton.customView as! MIBadgeButton? 

alarmsButton.badgeString = "10" 
+0

Ваш код не работает – mehmetsen80

+0

Это не работает, подтверждающий .... –

+0

не работает .... –

1

используя M13BadgeView .. использовать этот код

(им с помощью fontawesome.swift для кнопок :: https://github.com/thii/FontAwesome.swift)

let rightButton = UIButton(frame: CGRect(x:0,y:0,width:30,height:30)) 
    rightButton.titleLabel?.font = UIFont.fontAwesome(ofSize: 22) 
    rightButton.setTitle(String.fontAwesomeIcon(name: .shoppingBasket), for: .normal) 

    let rightButtonItem : UIBarButtonItem = UIBarButtonItem(customView: rightButton) 

    let badgeView = M13BadgeView() 
     badgeView.text = "1" 
     badgeView.textColor = UIColor.white 
     badgeView.badgeBackgroundColor = UIColor.red 
     badgeView.borderWidth = 1.0 
     badgeView.borderColor = UIColor.white 
     badgeView.horizontalAlignment = M13BadgeViewHorizontalAlignmentLeft 
     badgeView.verticalAlignment = M13BadgeViewVerticalAlignmentTop 
     badgeView.hidesWhenZero = true 

    rightButton.addSubview(badgeView) 

    self.navigationItem.rightBarButtonItem = rightButtonItem 
-1

You может сделать это программно с помощью

self.tabBarItem.badgeColor = .red 

или используйте st oryboard. Смотрите изображение: storyboard

4

Существует более элегантное решение с расширением для UIButtonItem

extension CAShapeLayer { 
    func drawCircleAtLocation(location: CGPoint, withRadius radius: CGFloat, andColor color: UIColor, filled: Bool) { 
     fillColor = filled ? color.cgColor : UIColor.white.cgColor 
     strokeColor = color.cgColor 
     let origin = CGPoint(x: location.x - radius, y: location.y - radius) 
     path = UIBezierPath(ovalIn: CGRect(origin: origin, size: CGSize(width: radius * 2, height: radius * 2))).cgPath 
    } 
} 

private var handle: UInt8 = 0 

extension UIBarButtonItem { 
    private var badgeLayer: CAShapeLayer? { 
     if let b: AnyObject = objc_getAssociatedObject(self, &handle) as AnyObject? { 
      return b as? CAShapeLayer 
     } else { 
      return nil 
     } 
    } 

    func addBadge(number: Int, withOffset offset: CGPoint = CGPoint.zero, andColor color: UIColor = UIColor.red, andFilled filled: Bool = true) { 
     guard let view = self.value(forKey: "view") as? UIView else { return } 

     badgeLayer?.removeFromSuperlayer() 

     // Initialize Badge 
     let badge = CAShapeLayer() 
     let radius = CGFloat(7) 
     let location = CGPoint(x: view.frame.width - (radius + offset.x), y: (radius + offset.y)) 
     badge.drawCircleAtLocation(location: location, withRadius: radius, andColor: color, filled: filled) 
     view.layer.addSublayer(badge) 

     // Initialiaze Badge's label 
     let label = CATextLayer() 
     label.string = "\(number)" 
     label.alignmentMode = kCAAlignmentCenter 
     label.fontSize = 11 
     label.frame = CGRect(origin: CGPoint(x: location.x - 4, y: offset.y), size: CGSize(width: 8, height: 16)) 
     label.foregroundColor = filled ? UIColor.white.cgColor : color.cgColor 
     label.backgroundColor = UIColor.clear.cgColor 
     label.contentsScale = UIScreen.main.scale 
     badge.addSublayer(label) 

     // Save Badge as UIBarButtonItem property 
     objc_setAssociatedObject(self, &handle, badge, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 

    func updateBadge(number: Int) { 
     if let text = badgeLayer?.sublayers?.filter({ $0 is CATextLayer }).first as? CATextLayer { 
      text.string = "\(number)" 
     } 
    } 

    func removeBadge() { 
     badgeLayer?.removeFromSuperlayer() 
    } 
} 

Этот большой код был создан Стефано Vettor, и вы можете найти все подробности по адресу: https://gist.github.com/freedom27/c709923b163e26405f62b799437243f4

0

Хороший ответ @Julio Bailon (https://stackoverflow.com/a/45948819/1898973)!

Адрес сайта автора с полным описанием: http://www.stefanovettor.com/2016/04/30/adding-badge-uibarbuttonitem/.

Кажется, что не работает на iOS 11, может быть, потому, что скрипт пытается получить доступ к свойству «view» UIBarButtonItem.Я сделал это работу:

1) Путем создания UIButton, а затем создавая UIBarButtonItem используя UIButton как customView:

navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: shoppingCartButton)

2) заменой линии в UIBarButtonItem расширения:

guard let view = self.value(forKey: "view") as? UIView else { return }

со следующим:

guard let view = self.customView else { return }

Кажется, для меня это элегантно и, лучше всего, это сработало!