根据 RSSI 值更新 UILabel 颜色
Updating UILabel Colors based on RSSI Values
我正在开发一个使用 BLE 连接到微控制器的应用程序。
我目前拥有所有这些 运行,还可以从 BLE link 读取 RSSI。我能够很好地显示 RSSI,以确定信号强度。但我想设计标签以根据信号强度改变颜色。 0 到 -30(绿色)、-30 到 -60(黄色)和 -60 到 -90(红色)。我是 swift 的新手。但是我做了一个Range测试视图控制器。
显然我的代码只会更新颜色一次。可能有一些非常简单的东西我错过了,我只是不太明白。另外,可能 while 循环或 for-in 可以解决这个问题。但是到目前为止我还没有弄好。
无论如何,如果有人能告诉我应该走哪条路线,我将不胜感激!
代码如下:
@IBOutlet weak var RSSILabel: UILabel!
@IBOutlet weak var deviceLabel: UILabel!
var timer = Timer()
var progressHUD: MBProgressHUD?
func serialDidChangeState() {
}
func serialDidDisconnect(_ peripheral: CBPeripheral, error: NSError?)
{
}
override func viewDidLoad() {
super.viewDidLoad()
if (serial?.isReady)! {
deviceLabel.text = serial?.connectedPeripheral!.name
serial?.readRSSI()
readRssiTimer()
showRssiInLabel()
}
}
func readRssiTimer() {
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
serial?.readRSSI()})
}
func showRssiInLabel(){
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
self.RSSILabel.text = serial?.realtimeRSSI.stringValue})
if (serial?.self.realtimeRSSI.intValue)! > -40 {
RSSILabel.textColor = UIColor.green
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(RSSILabel)
} else if (serial?.realtimeRSSI.intValue)! <= -40 && (serial?.realtimeRSSI.intValue)! > -70 {
RSSILabel.textColor = UIColor.yellow
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(RSSILabel)
} else if (serial?.realtimeRSSI.intValue)! <= -70 && (serial?.realtimeRSSI.intValue)! > -90 {
RSSILabel.textColor = UIColor.red
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(RSSILabel)
}
}
由于您在 Storyboard 中定义了 UILabel,并且在 ViewController 中定义了标签,因为 @IBOutlet weak var RSSILabel: UILabel!
意味着您没有以编程方式创建 RSSILabel。这意味着您不需要执行 self.view.addSubview(RSSILabel)
。您也可以避免每次都为每个 if 情况设置字体系列,因为它们都相同。并且可能可以避免 serial?
在某些时候可能为零,所以最好检查它,因为你声明它是可选的,然后通过告诉编译器你知道它不是零来玩它 serial!
。 UI 的更改也应该发生在主线程中,并且可能是你在更改 UI 标签颜色时不在主线程中,所以我把 DispatchQueue.main.async{}
块放在那里
如果您正在调试检查并且颜色应该能够改变,这应该可以工作:
func showRssiInLabel(){
if serial != nil {
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
DispatchQueue.main.async {
self.RSSILabel.text = serial!.realtimeRSSI.stringValue
}
})
var labelColor: UIColor = UIColor.green
if (serial!.self.realtimeRSSI.intValue)! > -40 {
labelColor = UIColor.green
} else if (serial!.realtimeRSSI.intValue)! <= -40 && (serial!.realtimeRSSI.intValue)! > -70 {
labelColor = UIColor.yellow
} else if (serial!.realtimeRSSI.intValue)! <= -70 && (serial!.realtimeRSSI.intValue)! > -90 {
labelColor = UIColor.red
}
DispatchQueue.main.async {
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
RSSILabel.textColor = labelColor
}
}
}
我正在开发一个使用 BLE 连接到微控制器的应用程序。 我目前拥有所有这些 运行,还可以从 BLE link 读取 RSSI。我能够很好地显示 RSSI,以确定信号强度。但我想设计标签以根据信号强度改变颜色。 0 到 -30(绿色)、-30 到 -60(黄色)和 -60 到 -90(红色)。我是 swift 的新手。但是我做了一个Range测试视图控制器。
显然我的代码只会更新颜色一次。可能有一些非常简单的东西我错过了,我只是不太明白。另外,可能 while 循环或 for-in 可以解决这个问题。但是到目前为止我还没有弄好。
无论如何,如果有人能告诉我应该走哪条路线,我将不胜感激!
代码如下:
@IBOutlet weak var RSSILabel: UILabel!
@IBOutlet weak var deviceLabel: UILabel!
var timer = Timer()
var progressHUD: MBProgressHUD?
func serialDidChangeState() {
}
func serialDidDisconnect(_ peripheral: CBPeripheral, error: NSError?)
{
}
override func viewDidLoad() {
super.viewDidLoad()
if (serial?.isReady)! {
deviceLabel.text = serial?.connectedPeripheral!.name
serial?.readRSSI()
readRssiTimer()
showRssiInLabel()
}
}
func readRssiTimer() {
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
serial?.readRSSI()})
}
func showRssiInLabel(){
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
self.RSSILabel.text = serial?.realtimeRSSI.stringValue})
if (serial?.self.realtimeRSSI.intValue)! > -40 {
RSSILabel.textColor = UIColor.green
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(RSSILabel)
} else if (serial?.realtimeRSSI.intValue)! <= -40 && (serial?.realtimeRSSI.intValue)! > -70 {
RSSILabel.textColor = UIColor.yellow
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(RSSILabel)
} else if (serial?.realtimeRSSI.intValue)! <= -70 && (serial?.realtimeRSSI.intValue)! > -90 {
RSSILabel.textColor = UIColor.red
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(RSSILabel)
}
}
由于您在 Storyboard 中定义了 UILabel,并且在 ViewController 中定义了标签,因为 @IBOutlet weak var RSSILabel: UILabel!
意味着您没有以编程方式创建 RSSILabel。这意味着您不需要执行 self.view.addSubview(RSSILabel)
。您也可以避免每次都为每个 if 情况设置字体系列,因为它们都相同。并且可能可以避免 serial?
在某些时候可能为零,所以最好检查它,因为你声明它是可选的,然后通过告诉编译器你知道它不是零来玩它 serial!
。 UI 的更改也应该发生在主线程中,并且可能是你在更改 UI 标签颜色时不在主线程中,所以我把 DispatchQueue.main.async{}
块放在那里
如果您正在调试检查并且颜色应该能够改变,这应该可以工作:
func showRssiInLabel(){
if serial != nil {
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { (Timer) in
DispatchQueue.main.async {
self.RSSILabel.text = serial!.realtimeRSSI.stringValue
}
})
var labelColor: UIColor = UIColor.green
if (serial!.self.realtimeRSSI.intValue)! > -40 {
labelColor = UIColor.green
} else if (serial!.realtimeRSSI.intValue)! <= -40 && (serial!.realtimeRSSI.intValue)! > -70 {
labelColor = UIColor.yellow
} else if (serial!.realtimeRSSI.intValue)! <= -70 && (serial!.realtimeRSSI.intValue)! > -90 {
labelColor = UIColor.red
}
DispatchQueue.main.async {
RSSILabel.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
RSSILabel.textColor = labelColor
}
}
}