Commit d7b597a1 authored by yqz's avatar yqz

widgets

parent f83b3045
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_battery_widgets_blue.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_battery_widgets_blue@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_battery_widgets_blue@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_battery_widgets_white.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_battery_widgets_white@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_battery_widgets_white@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_photo_defpage.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_photo_defpage@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_photo_defpage@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_storage_widgets_blue.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_storage_widgets_blue@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_storage_widgets_blue@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_storage_widgets_black.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_storage_widgets_black@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_storage_widgets_black@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_widgets_n_0.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_widgets_n_0@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_widgets_n_0@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_widgets_n_1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_widgets_n_1@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_widgets_n_1@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_widgets_n_2.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_widgets_n_2@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_widgets_n_2@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_widgets_s_0.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_widgets_s_0@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_widgets_s_0@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_widgets_s_1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_widgets_s_1@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_widgets_s_1@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_widgets_s_2.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_widgets_s_2@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_widgets_s_2@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
......@@ -61,6 +61,14 @@ class HomeViewController:BaseViewController {
}
break
case 2:
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
let vc = WidgetViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
break
default:
break
}
......
......@@ -274,7 +274,7 @@ extension SecretViewController : UICollectionViewDelegate,UICollectionViewDataSo
seletedAllBtn.isSelected = !seletedAllBtn.isSelected
self.seletedAllBtn.width = seletedAllBtn.isSelected ? 131 : 115
seletedAllBtn.x = titleView.width - marginLR - seletedAllBtn.width
var sets = NSMutableSet()
let sets = NSMutableSet()
if seletedAllBtn.isSelected {
for i in 0..<data.count {
sets.add((i))
......
//
// WidgetPublicModel.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import UIKit
import Foundation
import Darwin
class WidgetPublicModel: NSObject {
public class func battery() -> Float {
let device = UIDevice.current
device.isBatteryMonitoringEnabled = true
let batt = device.batteryLevel * 100;
return batt
}
public class func getDiskSpace() -> (Int64,Int64) {
let total = TotalDiskSize()
let available = AvailableDiskSize()
return (total,available)
}
// 硬盘总大小
class func TotalDiskSize() -> Int64 {
var fs = blankof(type: statfs.self)
if statfs("/var",&fs) >= 0 {
return Int64(UInt64(fs.f_bsize) * fs.f_blocks)
}
return -1
}
// 硬盘剩余大小
class func AvailableDiskSize() -> Int64 {
var fs = blankof(type: statfs.self)
if statfs("/var",&fs) >= 0 {
return Int64(UInt64(fs.f_bsize) * fs.f_bavail)
}
return -1
}
class private func blankof<T>(type:T.Type) -> T {
let ptr = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T>.size)
let val = ptr.pointee
return val
}
}
//
// WidgetBatteryStView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import UIKit
class WidgetBatteryStView: UIView ,BatteryStatusDelegate {
var widgetType = 0 {
didSet{
if widgetType == 0 {
widgetT.text = "Battery"
widgetR.text = String(format: "%.0f%%", WidgetPublicModel.battery() )
staray.isHidden = true
}else{
widgetT.text = "Storage"
let disk = WidgetPublicModel.getDiskSpace()
let use = disk.0 - disk.1
let useP = Float(use) / Float(disk.0)
widgetR.text = String(format: "%.0f%%", useP * 100)
widgetInfo.image = UIImage(named: "img_storage_widgets")
staray.isHidden = false
}
setWidgetInfo()
}
}
var widgetMode = 0 {
didSet{
if widgetMode == 0 {
shapeLayer.strokeColor = UIColor.colorWithHex(hexStr: "#FFFFFF").cgColor
clayer.backgroundColor = UIColor.colorWithHex(hexStr: "#0082FF").cgColor
layer.shadowColor = UIColor.colorWithHex(hexStr: "#0082FF").cgColor
widgetT.textColor = .white
widgetR.textColor = .white
staray.textColor = .white
}else if widgetMode == 1 {
shapeLayer.strokeColor = UIColor.colorWithHex(hexStr: "#0082FF").cgColor
clayer.backgroundColor = UIColor.colorWithHex(hexStr: "#333333").cgColor
layer.shadowColor = UIColor.colorWithHex(hexStr: "#333333").cgColor
widgetT.textColor = .white
widgetR.textColor = .white
staray.textColor = .white
}else{
shapeLayer.strokeColor = UIColor.colorWithHex(hexStr: "#0082FF").cgColor
layer.shadowColor = UIColor.colorWithHex(hexStr: "#CCE6FF").cgColor
clayer.backgroundColor = UIColor.white.cgColor
widgetT.textColor = .colorWithHex(hexStr: "#0082FF")
widgetR.textColor = .colorWithHex(hexStr: "#0082FF")
staray.textColor = .colorWithHex(hexStr: "#0082FF")
}
setWidgetInfo()
}
}
private func setWidgetInfo() -> Void {
if widgetType == 0 {
if widgetMode != 2 {
widgetInfo.image = UIImage(named: "img_battery_widgets")
}else{
widgetInfo.image = UIImage(named: "img_battery_widgets_b")
}
}else{
if widgetMode != 2 {
widgetInfo.image = UIImage(named: "img_storage_widgets")
}else{
widgetInfo.image = UIImage(named: "img_storage_widgets_b")
}
}
self.layoutIfNeeded()
let path = UIBezierPath()
let size:CGSize = widgetInfo.bounds.size
var endangle:CGFloat = 0
if widgetType == 0 {
let end:CGFloat = CGFloat(WidgetPublicModel.battery() / 100.0)
endangle = -Double.pi/2.0 + CGFloat(Double.pi * 2.0 * end)
}else{
let disk = WidgetPublicModel.getDiskSpace()
let use = disk.0 - disk.1
let useP:CGFloat = CGFloat(use) / CGFloat(disk.0)
endangle = -.pi/2.0 + CGFloat(Double.pi * 2.0 * useP)
}
path.addArc(withCenter: CGPoint(x: size.width/2.0, y: size.height/2.0),
radius: size.width / 2.0 - 3,
startAngle: -Double.pi/2.0,
endAngle: endangle,
clockwise: true)
shapeLayer.path = path.cgPath
}
private func setUI() -> Void {
widgetInfo.layer.addSublayer(shapeLayer)
widgetT.snp.makeConstraints { make in
make.left.top.equalToSuperview().inset(15)
}
widgetR.snp.makeConstraints { make in
make.right.top.equalToSuperview().inset(15)
}
widgetInfo.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.centerY.equalToSuperview().offset(5)
make.size.equalTo(CGSize(width: 80, height: 80))
}
staray.snp.makeConstraints { make in
make.centerX.equalTo(widgetR.snp.centerX)
make.top.equalTo(widgetR.snp.bottom).offset(4)
}
self.layoutIfNeeded()
shapeLayer.frame = widgetInfo.bounds
}
private lazy var widgetT: UILabel = {
let l = UILabel()
l.font = UIFont.boldSystemFont(ofSize: 14)
addSubview(l)
return l
}()
private lazy var widgetR: UILabel = {
let r = UILabel()
r.font = UIFont.boldSystemFont(ofSize: 14)
addSubview(r)
return r
}()
private lazy var widgetInfo: UIImageView = {
let info = UIImageView()
addSubview(info)
info.contentMode = .scaleToFill
return info
}()
private lazy var staray: UILabel = {
let use = UILabel()
use.text = "Used"
use.font = UIFont.systemFont(ofSize: 10)
addSubview(use)
return use
}()
override init(frame: CGRect) {
super.init(frame: frame)
BatteryMonitorManager.shared.delegate = self
layer.insertSublayer(clayer, at: 0)
setUI()
}
func batteryStatusDidUpdate(level: Float, state: UIDevice.BatteryState) {
if widgetType == 0 {
widgetR.text = String(format: "%.0f%%", WidgetPublicModel.battery() )
}
}
private lazy var clayer: CALayer = {
let l = CALayer()
l.backgroundColor = UIColor.white.cgColor
l.cornerRadius = 20
return l
}()
override func layoutSubviews() {
super.layoutSubviews()
clayer.frame = self.bounds
layer.shadowOffset = CGSize(width: 3, height: 3)
layer.shadowOpacity = 0.7
layer.shadowRadius = 20.0
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
shapeLayer.zPosition = 10
}
private lazy var shapeLayer: CAShapeLayer = {
let sh = CAShapeLayer()
sh.fillColor = UIColor.clear.cgColor
sh.lineWidth = 6
sh.lineCap = .round
return sh
}()
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//
// WidgetStatesView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import UIKit
class WidgetStatesView: UIView {
private var count = 0
var callback:((_ idx:Int)->Void)?
@objc func widgetModeTouch(_ sender:UIButton) -> Void {
if sender.isSelected {
return
}
guard let sup = sender.superview else { return }
for b in sup.subviews {
guard let btn:UIButton = b as? UIButton else { return }
btn.isSelected = false
}
sender.isSelected = true
guard callback != nil else { return }
callback!(sender.tag)
}
func setUI() -> Void {
widgetStack.snp.makeConstraints { make in
make.left.top.bottom.right.equalToSuperview()
}
for i in 0..<count {
let b = UIButton(type: .custom)
let imgn = String(format: "img_widgets_n_%d", i)
b.setImage(UIImage(named: imgn), for: .normal)
let imgs = String(format: "img_widgets_s_%d", i)
b.setImage(UIImage(named: imgs), for: .selected)
b.tag = i
if i == 0 {
b.isSelected = true
}
b.snp.makeConstraints { make in
make.width.equalTo(b.snp.height).multipliedBy(1)
}
b.addTarget(self, action: #selector(widgetModeTouch(_:)), for: .touchUpInside)
widgetStack.addArrangedSubview(b)
}
}
private lazy var widgetStack: UIStackView = {
let stack = UIStackView()
stack.axis = .horizontal
stack.alignment = .fill
stack.distribution = .equalCentering
addSubview(stack)
return stack
}()
init(_ count:Int) {
super.init(frame: CGRectZero)
self.count = count
setUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//
// WidgetTopStackView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import UIKit
class WidgetTopStackView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
layer.cornerRadius = 8
backgroundColor = .colorWithHex(hexStr: "#F2F6FC")
clipsToBounds = true
setUI()
}
var callback:((_ idx:Int)->Void)?
var type : Int = 0 {
didSet {
if type == 0 {
battryBtn.isSelected = true
storageBtn.isSelected = false
battryBtn.backgroundColor = .white
storageBtn.backgroundColor = .clear
}else{
battryBtn.isSelected = false
storageBtn.isSelected = true
battryBtn.backgroundColor = .clear
storageBtn.backgroundColor = .white
}
}
}
@objc private func widgetTouchs(_ sender:UIButton) -> Void {
guard callback != nil else {
return
}
callback!(sender.tag)
}
private func setUI() -> Void {
battryBtn.snp.makeConstraints { make in
make.left.top.bottom.equalToSuperview().inset(4)
make.right.equalTo(self.snp.centerX)
}
storageBtn.snp.makeConstraints { make in
make.right.top.bottom.equalToSuperview().inset(4)
make.left.equalTo(self.snp.centerX)
}
}
private lazy var battryBtn: UIButton = {
let b = UIButton(type: .custom)
b.tag = 0
b.setTitle("Battery", for: .normal)
b.setTitleColor(.colorWithHex(hexStr: "#B3B3B3"), for: .normal)
b.setTitleColor(.colorWithHex(hexStr: "#0082FF"), for: .selected)
b.addTarget(self, action: #selector(widgetTouchs(_:)), for: .touchUpInside)
b.layer.cornerRadius = 4
addSubview(b)
return b
}()
private lazy var storageBtn: UIButton = {
let b = UIButton(type: .custom)
b.tag = 1
b.setTitle("Storage", for: .normal)
b.setTitleColor(.colorWithHex(hexStr: "#B3B3B3"), for: .normal)
b.setTitleColor(.colorWithHex(hexStr: "#0082FF"), for: .selected)
b.addTarget(self, action: #selector(widgetTouchs(_:)), for: .touchUpInside)
b.layer.cornerRadius = 4
addSubview(b)
return b
}()
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//
// WidgetKeepListViewController.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import UIKit
class WidgetKeepListViewController: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
setUI()
}
private func setUI() -> Void {
keepL.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.equalTo(titleView.snp.bottom).offset(10)
}
NotData.snp.makeConstraints { make in
make.centerX.centerY.equalToSuperview()
}
}
private lazy var keepL: UILabel = {
let l = UILabel()
l.text = "Keep List"
l.font = UIFont.boldSystemFont(ofSize: 20)
l.textColor = .black
view.addSubview(l)
return l
}()
private lazy var NotData: UIImageView = {
let no = UIImageView(image: UIImage(named: "img_photo_defpage"))
no.contentMode = .scaleToFill
view.addSubview(no)
return no
}()
}
//
// WidgetViewController.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import UIKit
class WidgetViewController: BaseViewController {
enum widgetType {
case battery
case storage
}
var widgets:widgetType = .battery {
didSet {
topButs.type = (self.widgets == .battery ? 0 : 1)
batterySta.widgetType = (self.widgets == .battery ? 0 : 1)
}
}
var widgetMode = 0 {// 0 1 2
didSet{
batterySta.widgetMode = widgetMode
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setUI()
}
@objc func setWidgetTouch() -> Void {
}
func setUI() -> Void {
titleL.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.equalTo(titleView.snp.bottom).offset(10)
}
topButs.snp.makeConstraints { make in
make.top.equalTo(titleL.snp.bottom).offset(22)
make.left.right.equalToSuperview().inset(15)
make.height.equalTo(46)
}
batterySta.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(topButs.snp.bottom).offset(64)
make.size.equalTo(CGSize(width: 164, height: 164))
}
widgetPageCtrol.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(batterySta.snp.bottom).offset(50)
}
statesBottom.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.size.equalTo(CGSize(width: 180, height: 40))
make.top.equalTo(widgetPageCtrol.snp.bottom).offset(50)
}
setWidgetBtn.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(15)
make.bottom.equalToSuperview().offset(-50)
make.height.equalTo(46)
}
}
private lazy var titleL: UILabel = {
let l = UILabel()
l.text = "Widgets"
l.font = UIFont.boldSystemFont(ofSize: 20)
l.textColor = .black
view.addSubview(l)
return l
}()
private lazy var topButs: WidgetTopStackView = {
let topbuts = WidgetTopStackView()
topbuts.type = (self.widgets == .battery ? 0 : 1)
topbuts.callback = { [weak self] idx in
if idx == 0 {
self?.widgets = .battery
self?.widgetPageCtrol.currentPage = 0
}else{
self?.widgets = .storage
self?.widgetPageCtrol.currentPage = 1
}
}
view.addSubview(topbuts)
return topbuts
}()
private lazy var batterySta: WidgetBatteryStView = {
let stav = WidgetBatteryStView()
stav.layer.cornerRadius = 20
stav.widgetType = (self.widgets == .battery ? 0 : 1)
stav.widgetMode = widgetMode
// stav.clipsToBounds = true
view.addSubview(stav)
return stav
}()
private lazy var widgetPageCtrol: UIPageControl = {
let page = UIPageControl()
page.currentPage = 0
page.numberOfPages = 2
page.currentPageIndicatorTintColor = .colorWithHex(hexStr: "#0082FF")
page.pageIndicatorTintColor = .colorWithHex(hexStr: "#C6CEE0")
view.addSubview(page)
return page
}()
private lazy var statesBottom: WidgetStatesView = {
let bottom = WidgetStatesView(3)
bottom.callback = { [weak self] idx in
self?.widgetMode = idx
}
view.addSubview(bottom)
return bottom
}()
private lazy var setWidgetBtn: UIButton = {
let btn = UIButton(type: .custom)
btn.setTitle("Set Widget", for: .normal)
btn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
btn.setTitleColor(.white, for: .normal)
btn.addTarget(self, action: #selector(setWidgetTouch), for: .touchUpInside)
view.addSubview(btn)
btn.backgroundColor = .colorWithHex(hexStr: "#0082FF")
btn.layer.cornerRadius = 8
return btn
}()
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment