Добавление значка в кнопку чата при получении сообщения - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть приложение для социальной сети.Значок приложения и значок tabbar.item работают нормально.Но у меня есть кнопка сообщения на домашней странице, как в Instagram.Я хочу, чтобы эта кнопка показывала значок при получении нового сообщения.Вот моя функция push-уведомлений в папке «Входящие»

// Send Push notification
        let pushStr = "\(PFUser.current()![USER_USERNAME]!) sent you a message.:\nRelated post: \(self.adObj[ADS_TITLE]!)"
        //\(self.lastMessageStr)

        let data = [ "badge" : "Increment",
                     "alert" : pushStr,
                     "sound" : "bingbong.aiff"
        ]
        let request = [
                    "someKey" : self.userObj.objectId!,
                    "data" : data
        ] as [String : Any]
        PFCloud.callFunction(inBackground: "push", withParameters: request as [String : Any], block: { (results, error) in
            if error == nil {
                print ("\nPUSH SENT TO: \(self.userObj[USER_USERNAME]!)\nMESSAGE: \(pushStr)\n")
            } else {
                print ("\(error!.localizedDescription)")
            }
        })

Вот моя кнопка чата в homepageviewcontroller

    @IBAction func chatsButt(_ sender: Any) {
    if PFUser.current() != nil { 
        let aVC = storyboard?.instantiateViewController(withIdentifier: "Chats") as! Chats
        navigationController?.pushViewController(aVC, animated: true)
    } else {
        showLoginAlert("You need to be logged in to see your Chats. Want to Login now?")
    }
}

При получении нового сообщения только кнопка сообщения должна отображать значок, но при получении нового, как,только элемент панели вкладок должен показывать значок.Как я могу это сделать?

1 Ответ

0 голосов
/ 11 декабря 2018

У меня был этот помощник:

//
//  UIButton+BadgeCircle.swift
//
//  Created by João Marcelo Ferreira Pinho on 27/08/18.
//  Copyright © 2018 WIT Software. All rights reserved.
//
// source: https://gist.github.com/freedom27/c709923b163e26405f62b799437243f4

import UIKit

fileprivate struct Badge {
    static let size: CGSize = CGSize(width: 16, height: 16)
    static let offSet: CGFloat = 8
    static let fontSize: CGFloat = 11.0
    static let color: UIColor = .black
    static let filled: Bool = true
}

private var handle: UInt8 = 0

extension UIButton {

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

    func addBadge(number: Int, withColor color: UIColor = Badge.color, filled: Bool = Badge.filled) {
        badgeLayer?.removeFromSuperlayer()

        let badge = CAShapeLayer()
        let location = CGPoint(x: frame.width - Badge.offSet, y: -Badge.offSet)
        badge.drawCircleAt(location, withColor: color, filled: filled)
        layer.addSublayer(badge)

        let label = CATextLayer()
        label.string = "\(number)"
        label.alignmentMode = kCAAlignmentCenter
        label.fontSize = Badge.fontSize
        label.frame = CGRect(origin: CGPoint(x: location.x, y: -6.5), size: Badge.size)
        label.foregroundColor = filled ? UIColor.white.cgColor : color.cgColor
        label.backgroundColor = UIColor.clear.cgColor
        label.contentsScale = UIScreen.main.scale
        badge.addSublayer(label)

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

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

private extension CAShapeLayer {

    func drawCircleAt(_ location: CGPoint, withColor color: UIColor, filled: Bool) {
        fillColor = filled ? color.cgColor : UIColor.white.cgColor
        strokeColor = color.cgColor
        path = UIBezierPath(ovalIn: CGRect(origin: location, size: Badge.size)).cgPath
    }
}

Вставьте этот код в быстрый файл, затем вы можете просто позвонить button.addBadge(number: 2) и нарисовать собственный значок.

Вы можете настроить свойЗначок с fileprivate struct Badge, это были мои значения по умолчанию для темы моего проекта, ваши могут отличаться.

В комментариях к классу вы можете найти, на чем основан мой код (источник: https://gist.github.com/freedom27/c709923b163e26405f62b799437243f4).

...