自定义 BarButtonItem 项:在右上角添加红点,Swift 4 IOS

Atu*_*mar 1 uinavigationbar uinavigationitem ios swift

我想添加/设置未读标志为右上角的红点UIbarButtonItem,请参阅附加图片

在此处输入图片说明

我应该怎么做才能在 Bar Button 项目上添加/设置红点?一旦用户点击项目,我想删除红点。

Rob*_*ler 5

UIButton 子类

好的,让我们从创建自定义UIButton子类开始

class ButtonWithBadge: UIButton {
}
Run Code Online (Sandbox Code Playgroud)

现在让我们创建UIView代表红点

let badgeView: UIView = {
    let view = UIView()
    view.layer.cornerRadius = 3
    view.backgroundColor = .red
    return view
}()
Run Code Online (Sandbox Code Playgroud)

然后覆盖init此子类并在内部将其添加badgeView到按钮的右上角:设置其约束(右侧和顶部等于按钮的锚点,宽度和高度为badgeView'cornerRadius 值的两倍)

override init(frame: CGRect) {
    super.init(frame: frame)

    addSubview(badgeView)
    badgeView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        badgeView.rightAnchor.constraint(equalTo: rightAnchor, constant: 3),
        badgeView.topAnchor.constraint(equalTo: topAnchor, constant: 3),
        badgeView.heightAnchor.constraint(equalToConstant: badgeView.layer.cornerRadius*2),
        badgeView.widthAnchor.constraint(equalToConstant: badgeView.layer.cornerRadius*2)
    ])
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
Run Code Online (Sandbox Code Playgroud)

接下来创建代表按钮当前状态的变量:

var isRead: Bool = false
Run Code Online (Sandbox Code Playgroud)

现在让我们创建一些badgeView根据isRead值隐藏或取消隐藏的方法

func setBadge() {
    badgeView.isHidden = isRead
}
Run Code Online (Sandbox Code Playgroud)

现在我们有了函数,对吧?因此,让我们调用这个函数在年底initdidSetisRead变量

class ButtonWithProperty: UIButton {

var isRead: Bool = false {
    didSet {
        setBadge()
    }
}

override init(frame: CGRect) {
    ...
    setBadge()
}
Run Code Online (Sandbox Code Playgroud)

添加到视图控制器

首先为按钮和视图创建变量

lazy var barButton: ButtonWithProperty = {
    let button = ButtonWithProperty()
    ... // set color, title, target, etc.
    return button
}()
Run Code Online (Sandbox Code Playgroud)

现在例如viewDidLoad将它添加barButtonUINavigationBar您想要的位置并放置它:

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    guard let navigationBar = self.navigationController?.navigationBar else { return }

    navigationBar.addSubview(barButton)
    barButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        barButton.rightAnchor.constraint(equalTo: navigationBar.rightAnchor, constant: -20),
        barButton.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: -6)
    ])

}
Run Code Online (Sandbox Code Playgroud)

现在,当您需要时,您可以轻松更改barButtonisRead变量,红点消失或出现

barButton.isRead = true
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


class ButtonWithProperty: UIButton {

    var isRead: Bool = false {
        didSet {
            setBadge()
        }
    }

    lazy var badgeView: UIView = {
        let view = UIView()
        view.layer.cornerRadius = 3
        view.backgroundColor = .red
        return view
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        addSubview(badgeView)
        badgeView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            badgeView.rightAnchor.constraint(equalTo: rightAnchor, constant: 3),
            badgeView.topAnchor.constraint(equalTo: topAnchor, constant: 3),
            badgeView.heightAnchor.constraint(equalToConstant: badgeView.layer.cornerRadius*2),
            badgeView.widthAnchor.constraint(equalToConstant: badgeView.layer.cornerRadius*2)
        ])

        setBadge()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setBadge() {
        badgeView.isHidden = isRead
    }

}
Run Code Online (Sandbox Code Playgroud)

内部视图控制器:

class ViewController: UIViewController {

    lazy var barButton: ButtonWithProperty = {
        let button = ButtonWithProperty()
        ... // color, title, target, etc.
        return button
    }()

    ...

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        guard let navigationBar = self.navigationController?.navigationBar else { return }

        navigationBar.addSubview(barButton)
        barButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            barButton.rightAnchor.constraint(equalTo: navigationBar.rightAnchor, constant: -20),
            barButton.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: -6)
        ])

    }
    ...
}
Run Code Online (Sandbox Code Playgroud)