// // AppShare.swift // SolarStationSwift // // Created by weclouds on 2018/7/31. // Copyright © 2018年 weclouds. All rights reserved. // import UIKit import Toast_Swift import SwifterSwift import SnapKit import JXCategoryView import BabyBluetooth import SwiftPopup import PKHUD extension UIViewController{ //清除历史数据 @objc func sendclearHistoryDataCMD () { let arr = ["FF06DF050001"] //发送数据 let marr = NSMutableArray() for i in 0..CGFloat{ let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: 0)) label.text = title label.numberOfLines = 0 label.sizeToFit() let height = label.frame.height return height } //根据宽度计算高度 自适应高度 func getWidth(byHeight height:CGFloat,title:String,font:UIFont)->CGFloat{ let label = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: height)) label.text = title label.numberOfLines = 0 label.sizeToFit() let width = label.frame.width return width } } extension UIImage{ public class func renderImageWithColor(_ color : UIColor, size :CGSize) -> UIImage { UIGraphicsBeginImageContext(size) guard let context = UIGraphicsGetCurrentContext() else { UIGraphicsEndImageContext() return UIImage() } context.setFillColor(color.cgColor) context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height)) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img ?? UIImage() } } public struct UIRectSide : OptionSet { public let rawValue: Int public static let left = UIRectSide(rawValue: 1 << 0) public static let top = UIRectSide(rawValue: 1 << 1) public static let right = UIRectSide(rawValue: 1 << 2) public static let bottom = UIRectSide(rawValue: 1 << 3) public static let all: UIRectSide = [.top, .right, .left, .bottom] public init(rawValue: Int) { self.rawValue = rawValue; } } extension UIDevice{ public func isX() -> Bool { if UIScreen.main.bounds.size.height == 812 { return true } return false } } // MARK: - String extensions extension String { // 摄氏温度 转华式温度 func centigradeToFahrenheit() -> String { let centigrade = Double(self) let fahrenheit = 9 * centigrade! / 5 + 32 let fahrenheitStr = String(format: "%.1f", fahrenheit) return fahrenheitStr } //华氏温度转摄氏温度 func fahrenheitToCentigrade() -> String { let fahrenheit = Double(self) let centigrade = 5 * (fahrenheit! - 32) / 9 let centigradeStr = String(format: "%.1f", centigrade) return centigradeStr } // 摄氏温度 转华式温度 func centigradeToFahrenheit_int() -> String { let centigrade = Double(self) let fahrenheit = 9 * centigrade! / 5 + 32 let fahrenheitStr = String(format: "%.0f", fahrenheit) return fahrenheitStr } //华氏温度转摄氏温度 func fahrenheitToCentigrade_int() -> String { let fahrenheit = Double(self) let centigrade = 5 * (fahrenheit! - 32) / 9 let centigradeStr = String(format: "%.0f", centigrade) return centigradeStr } /// Returns the localized string value public var localized: String { return localize(withBundle: Bundle.main) } public func localize(withBundle bundle: Bundle) -> String { return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "") } public func localizedstr() -> String { return NSLocalizedString(self, comment: "") //return DAConfig.localizedString(forKey: self, value: nil, table: nil) } // func notifi_change_localizedStr() -> String { // NotificationCenter.default.addObserver(self, selector: #selector(#selector(da_localizedStr)), name: NSNotification.Name(KCHANGELANGUAGE), object: nil) // } func da_localizedStr() -> String { return DAConfig.localizedString(forKey: self, value: nil, table: nil) } } extension String { func contains(find: String) -> Bool{ return self.range(of: find) != nil } func containsIgnoringCase(find: String) -> Bool{ return self.range(of: find, options: .caseInsensitive) != nil } ///随机字符串 static let random_str_characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" static func randomStr(len : Int) -> String{ var ranStr = "" for _ in 0.. String? { if let data = self.data(using: .utf8) { return data.base64EncodedString() } return nil } // base64解码 func fromBase64() -> String? { if let data = Data(base64Encoded: self) { return String(data: data, encoding: .utf8) } return nil } //6d4b8bd5540d79f0000000000000000000000000000000000000000000000000 //6df15733785565e565b080fd6e9079d1628067099650516c53f8000000000000 //根据开始位置和长度截取字符串 func subString(start:Int, length:Int = -1) -> String { var len = length if len == -1 { len = self.count - start } let st = self.index(startIndex, offsetBy:start) let en = self.index(st, offsetBy:len) return String(self[st ..< en]) } //获取子字符串 func substingInRange(_ r: Range) -> String? { if r.lowerBound < 0 || r.upperBound > self.count { return nil } let startIndex = self.index(self.startIndex, offsetBy:r.lowerBound) let endIndex = self.index(self.startIndex, offsetBy:r.upperBound) return String(self[startIndex.. String{ var mutStr = "" for i in 0.. Bool { for (_ , value) in self.charactersArray.enumerated() { if "\u{4E00}" <= value && value <= "\u{9FA5}"{ return true } } return false } func transformToPinyin() -> String { let stringRef = NSMutableString(string: self) as CFMutableString // 转换为带音标的拼音 CFStringTransform(stringRef,nil, kCFStringTransformToLatin, false); // 去掉音标 CFStringTransform(stringRef, nil, kCFStringTransformStripCombiningMarks, false); let pinyin = stringRef as String; return pinyin.replacingOccurrences(of: " ", with: "") } // func transformToPinyin() -> String { // let stringRef = NSMutableString(string: self) as CFMutableString // // 转换为带音标的拼音 // CFStringTransform(stringRef,nil, kCFStringTransformToLatin, false); // // 去掉音标 // CFStringTransform(stringRef, nil, kCFStringTransformStripCombiningMarks, false); // let pinyin = stringRef as String; // // return pinyin // } } extension UIViewController { func g_toast(_ msg:String) { self.view.makeToast(msg, duration: 2.0, position: .center) } func g_httpFail() { g_toast("network_error".localizedstr()) } func g_delay_excute(_ cmd:(()->())?) { DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { cmd?() } // Async.main(after: 2.0, block: cmd?) // Async.main(after: 2.0) { // cmd?() // } } func g_real_delay_excute(_ cmd:(()->())?) { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { cmd?() } } } func stringConvertDate(string:String) -> Date { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "HH:mm" let date = dateFormatter.date(from: string) return date! } func g_showHUD(_ message: String) { HUD.flash(.label(message), delay: 2.0) { _ in print("License Obtained.") } } func g_showloading() { HUD.show(.labeledProgress(title: "", subtitle: "Set_Language".da_localizedStr())) // Now some long running task starts... delay(2.0) { // ...and once it finishes we flash the HUD for a second. HUD.flash(.labeledSuccess(title: "", subtitle: "Successful_Setup_Languange".da_localizedStr()), delay: 1.0) } } //延迟执行 func delay(_ delay: Double, closure:@escaping () -> Void) { DispatchQueue.main.asyncAfter( deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure) } // MARK: 获取当前时间 // 这里的 type 是指日期的格式 “yyyyMMdd” 或者 “yyyy-MM-dd” 这样子 func nowTime(_ type:String?) -> String { let currentDate = Date() let formatter = DateFormatter() formatter.dateFormat = type ?? "yyyyMMdd" let time = formatter.string(from: currentDate) return time; } //获取前当前时间的前一天 //NowDay 是传入的需要计算时间 func getLastDay(_ nowDay:String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-M-d" //先把传入的时间转为date let date = dateFormatter.date(from: nowDay) let lastTime :TimeInterval = -(24*60*60) // 往前减去一天秒数,昨天 let lastDate = date?.addingTimeInterval(lastTime) let lastDay = dateFormatter.string(from: lastDate!) return lastDay; } class AppShare: NSObject { static var dataDict : [String: Any] = [String: Any]() // 所有设备数据 static var paramDataDict : [String: Any] = [String: Any]() /// 参数数据 static var realDataDict : [String: Any] = [String: Any]() /// 实时数据 static var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据 static var isRefresh: Bool? = false static var isTimarStop : Bool? = false // 实时数据 定时器 static var isTimar2Stop : Bool? = false // 统计数据定时器 static var batteryType:BatteryType? = .USER static var toolbarSelectedIndex : Int? = 0 static var reloadDeviceReciveData:Bool = false static var batIndexPath : BarIndexPath? static var perihperalName:String? // static var chartViewType :Int? // static var selectededBarIndex : Int? } enum BatteryType { case USER // 自定义 case FLD // 开口铅酸FLD case SLD // 密封铅酸SLD case GEL // 胶体铅酸GEL case LI //磷酸铁锂LI }