Atu*_*mar 1 uinavigationbar uinavigationitem ios swift
我想添加/设置未读标志为右上角的红点UIbarButtonItem,请参阅附加图片
我应该怎么做才能在 Bar Button 项目上添加/设置红点?一旦用户点击项目,我想删除红点。
好的,让我们从创建自定义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)
现在我们有了函数,对吧?因此,让我们调用这个函数在年底init和didSet的isRead变量
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将它添加barButton到UINavigationBar您想要的位置并放置它:
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)
现在,当您需要时,您可以轻松更改barButton的isRead变量,红点消失或出现
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)
| 归档时间: |
|
| 查看次数: |
1701 次 |
| 最近记录: |