Как добавить ярлык на корзину UIBarButton в NavigationBar в Swift - PullRequest
0 голосов
/ 21 мая 2018

Я работаю над прототипом приложения для заказа еды.У меня проблема, как я могу добавить метку количества над BarButton.Я не нахожу способ сделать это.кто-нибудь может мне помочь?

вот дизайн the label should be on the cart button

1 Ответ

0 голосов
/ 22 мая 2018
private var handle: UInt8 = 0

public func addBadge(number: Int, withOffset offset: CGPoint = CGPoint.zero, andBackgroundColor color: UIColor, strokeColor: UIColor,textColor:UIColor) {
        guard let view = self as? UIView else { return }

        badgeLayer?.removeFromSuperlayer()

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

        // Initialiaze Badge's label
        let label = CATextLayer()
        label.string = "\(number)"
        label.alignmentMode = kCAAlignmentCenter
        if number > 9 {
            label.fontSize = 9
            label.font = UIFont(name:"HelveticaNeue-Bold", size: 9)!
            label.frame = CGRect(origin: CGPoint(x: location.x - 5, y: offset.y+2), size: CGSize(width: 10, height: 16))
        }else{
            label.fontSize = 11
            label.font = UIFont(name:"HelveticaNeue-Bold", size: 11)!
            label.frame = CGRect(origin: CGPoint(x: location.x - 5, y: offset.y+1), size: CGSize(width: 10, height: 16))
        }
        label.foregroundColor = textColor.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)
    }


extension CAShapeLayer {
    func drawCircleAtLocation(location: CGPoint, withRadius radius: CGFloat, andColor color: UIColor,stokColor:UIColor) {
        fillColor = color.cgColor
        strokeColor = stokColor.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
    }
}

тогда вы можете использовать его как:

yourBtn.addBadge(number: 0, withOffset: CGPoint(x: -3, y: -3), andBackgroundColor: UIColor.red, strokeColor: UIColor.white, textColor:
            UIColor.white)
...