Commit 09821a35 authored by CZ1004's avatar CZ1004

资源配置

parent 9100f541
...@@ -24,6 +24,16 @@ ...@@ -24,6 +24,16 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
04BD7A3E2DA3B8F100A24C4B /* Embed ExtensionKit Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "$(EXTENSIONS_FOLDER_PATH)";
dstSubfolderSpec = 16;
files = (
);
name = "Embed ExtensionKit Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
04BD916E2D9D68AF00055CEB /* Embed Foundation Extensions */ = { 04BD916E2D9D68AF00055CEB /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
...@@ -40,6 +50,8 @@ ...@@ -40,6 +50,8 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
0496DEF22D9E3F57005B2834 /* widgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = widgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 0496DEF22D9E3F57005B2834 /* widgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = widgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
0496DF042D9E3FA7005B2834 /* widgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = widgetExtension.entitlements; sourceTree = "<group>"; }; 0496DF042D9E3FA7005B2834 /* widgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = widgetExtension.entitlements; sourceTree = "<group>"; };
04BD7A442DA3BA1700A24C4B /* Intents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Intents.framework; path = System/Library/Frameworks/Intents.framework; sourceTree = SDKROOT; };
04BD7A4F2DA3BA1700A24C4B /* IntentsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IntentsUI.framework; path = System/Library/Frameworks/IntentsUI.framework; sourceTree = SDKROOT; };
04BD915D2D9D68AD00055CEB /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 04BD915D2D9D68AD00055CEB /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
04BD915F2D9D68AD00055CEB /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 04BD915F2D9D68AD00055CEB /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
295785B9009F20AC4C1C36C4 /* Pods-PhoneManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PhoneManager.debug.xcconfig"; path = "Target Support Files/Pods-PhoneManager/Pods-PhoneManager.debug.xcconfig"; sourceTree = "<group>"; }; 295785B9009F20AC4C1C36C4 /* Pods-PhoneManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PhoneManager.debug.xcconfig"; path = "Target Support Files/Pods-PhoneManager/Pods-PhoneManager.debug.xcconfig"; sourceTree = "<group>"; };
...@@ -111,6 +123,8 @@ ...@@ -111,6 +123,8 @@
6028F60B696E2F97EAA2325C /* Pods_PhoneManager.framework */, 6028F60B696E2F97EAA2325C /* Pods_PhoneManager.framework */,
04BD915D2D9D68AD00055CEB /* WidgetKit.framework */, 04BD915D2D9D68AD00055CEB /* WidgetKit.framework */,
04BD915F2D9D68AD00055CEB /* SwiftUI.framework */, 04BD915F2D9D68AD00055CEB /* SwiftUI.framework */,
04BD7A442DA3BA1700A24C4B /* Intents.framework */,
04BD7A4F2DA3BA1700A24C4B /* IntentsUI.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -180,6 +194,7 @@ ...@@ -180,6 +194,7 @@
EB388E592D8A61A800629B0D /* Resources */, EB388E592D8A61A800629B0D /* Resources */,
B06228D82143041809F900CE /* [CP] Embed Pods Frameworks */, B06228D82143041809F900CE /* [CP] Embed Pods Frameworks */,
04BD916E2D9D68AF00055CEB /* Embed Foundation Extensions */, 04BD916E2D9D68AF00055CEB /* Embed Foundation Extensions */,
04BD7A3E2DA3B8F100A24C4B /* Embed ExtensionKit Extensions */,
); );
buildRules = ( buildRules = (
); );
......
{ {
"images" : [ "images" : [
{ {
"idiom" : "universal", "filename" : "logo.png",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal", "idiom" : "universal",
"platform" : "ios", "platform" : "ios",
"size" : "1024x1024" "size" : "1024x1024"
......
{
"images" : [
{
"filename" : "ic_close_charging.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_close_charging@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_close_charging@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":30,"ip":0,"op":60,"w":500,"h":500,"nm":"Comp 1","assets":[{"id":"image_0","w":450,"h":451,"u":"","p":"data:image/webp;base64,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","e":1},{"id":"image_1","w":213,"h":220,"u":"","p":"data:image/webp;base64,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","e":1},{"id":"comp_0","layers":[{"ind":1,"ty":2,"nm":"Man/3704194.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[225,225.5,0]},"a":{"a":0,"k":[225,225.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ip":0,"op":150,"st":0}]},{"id":"comp_1","layers":[{"ind":1,"ty":2,"nm":"Box/3704194.ai","cl":"ai","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[106.5,110,0]},"a":{"a":0,"k":[106.5,110,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ip":0,"op":150,"st":0}]}],"layers":[{"ind":1,"ty":0,"nm":"Man/3704194","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0]},"a":{"a":0,"k":[225,225.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":450,"h":451,"ip":0,"op":91,"st":0},{"ind":2,"ty":0,"nm":"Box/3704194","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[290,216,0],"to":[0,27.667,0],"ti":[0,-27.667,0]},{"t":59,"s":[290,382,0]}]},"a":{"a":0,"k":[106.5,110,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[70,70,100]},{"t":59,"s":[40,40,100]}]}},"ao":0,"w":213,"h":220,"ip":0,"op":91,"st":0}],"markers":[]}
\ No newline at end of file
//
// ChargeInfoViewController.swift
// PhoneManager
//
// Created by edy on 2025/3/26.
//
import UIKit
class ChargeInfoViewController:BaseViewController {
enum ChargeInfoType {
case setting
case charge
}
var model:ChargeViewCollectionModel?
var type:ChargeInfoType?
var isShowBack:Bool? {
didSet {
changeTitleView()
}
}
var isShowSettingView:Bool? {
didSet {
changeSettingViews()
}
}
lazy var backImageView:ChargeInfoBackView = {
let sview:ChargeInfoBackView = ChargeInfoBackView(frame: view.bounds, backImage: model?.CoverImage ?? "")
return sview
}()
lazy var settingView:ChargeInfoSettingView = {
let sview:ChargeInfoSettingView = ChargeInfoSettingView(frame: CGRect(x: 0, y: 0, width: view.width, height: 78 + safeHeight))
sview.isHidden = type == .setting ? false : true
return sview
}()
init(model: ChargeViewCollectionModel?,type:ChargeInfoType?) {
self.type = type
self.model = model
super.init(nibName: nil, bundle: nil)
}
// 由于继承自 UIViewController,必须实现这个必需的构造器
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func viewDidLoad() {
super.viewDidLoad()
self.barHidden = true
titleView.model.title = ""
titleView.lineView.isHidden = true
titleView.backgroundColor = .clear
if type == .charge {
DispatchQueue.main.asyncAfter(deadline: .now() + 3, execute: {[weak self] in
guard let self else {return}
isShowBack = true
})
}
}
override func addViews() {
view.addSubview(backImageView)
view.addSubview(titleView)
view.addSubview(settingView)
}
func changeSettingViews() {
if type == .charge {
return
}
DispatchQueue.main.async {
if !(self.isShowSettingView ?? false) {
self.settingView.isHidden = false
}
UIView.animate(withDuration: 0.3, animations: {[weak self] in
guard let self else {return}
self.settingView.alpha = (self.isShowSettingView ?? false) ? 0 : 1
}, completion: {[weak self] _ in
guard let self else {return}
self.settingView.isHidden = self.isShowSettingView ?? false
})
}
}
func changeTitleView() {
if !(self.isShowBack ?? false) {
self.titleView.isHidden = false
}
UIView.animate(withDuration: 0.3, animations: {[weak self] in
guard let self else {return}
self.titleView.alpha = (self.isShowBack ?? false) ? 0 : 1
}, completion: {[weak self] _ in
guard let self else {return}
self.titleView.isHidden = self.isShowBack ?? false
})
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
backImageView.snp.makeConstraints { make in
make.center.width.height.equalToSuperview()
}
settingView.snp.makeConstraints { make in
make.bottom.width.centerX.equalToSuperview()
make.height.equalTo(safeHeight + (safeHeight == 0 ? 78 : 68))
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
isShowSettingView = !(isShowSettingView ?? false)
isShowBack = !(isShowBack ?? false)
}
}
//
// ChargeGuideController.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
class ChargeGuideController : BaseViewController,UIScrollViewDelegate,UINavigationControllerDelegate {
lazy var guideScrollView: UIScrollView = {
let view = UIScrollView(frame: self.view.bounds)
view.contentSize = CGSize(width: self.view.bounds.width * CGFloat(8), height: self.view.bounds.height)
view.isPagingEnabled = true
view.showsHorizontalScrollIndicator = false
view.delegate = self
return view
}()
lazy var closeButton : UIButton = {
let view = UIButton()
view.backgroundColor = .clear
view.setImage(UIImage(named: "ic_close_charging"), for: .normal)
view.addTarget(self, action: #selector(closeCurrentPage), for: .touchUpInside)
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(self.guideScrollView)
self.view.addSubview(self.closeButton)
navigationController?.delegate = self
self.closeButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-15)
make.top.equalToSuperview().offset(statusBarHeight + 15)
make.width.height.equalTo(28)
}
// 先添加一个快捷指令的页面
let shortcutsView = ChargeGuideOpenShortcutsView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height))
shortcutsView.backgroundColor = .gray
self.guideScrollView.addSubview(shortcutsView)
shortcutsView.callback = {[weak self] text in
guard let self else {return}
if text as! String == "next" {
self.guideScrollView.contentOffset = CGPointMake(self.view.bounds.width, 0)
}
}
for i in 1..<7{
let view = ChargeGuideNormalView(frame: CGRect(x: self.view.bounds.width * CGFloat(i), y: 0, width: self.view.bounds.width, height: self.view.bounds.height))
self.guideScrollView.addSubview(view)
view.orderFlag = i
view.callback = {[weak self] text in
guard let self else {return}
if text as! String == "next" {
self.guideScrollView.contentOffset = CGPointMake(self.guideScrollView.contentOffset.x + self.view.bounds.width, 0)
}
if text as! String == "back" {
self.guideScrollView.contentOffset = CGPointMake(self.guideScrollView.contentOffset.x - self.view.bounds.width, 0)
}
}
}
let endView = ChargeGuideEndView(frame: CGRect(x: self.view.bounds.width * 7, y: 0, width: self.view.bounds.width, height: self.view.bounds.height))
endView.callback = {[weak self] text in
guard let self else {return}
if text as! String == "over" {
self.guideScrollView.contentOffset = CGPointMake(0, 0)
}
}
self.guideScrollView.addSubview(endView)
}
@objc func closeCurrentPage(){
self.navigationController?.popViewController(animated: true)
}
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if operation == .pop {
return CustomPopAnimator()
}
return nil
}
}
// 自定义转场动画类
class CustomPopAnimator: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromVC = transitionContext.viewController(forKey:.from),
let toVC = transitionContext.viewController(forKey:.to) else {
return
}
let containerView = transitionContext.containerView
containerView.insertSubview(toVC.view, belowSubview: fromVC.view)
let screenBounds = UIScreen.main.bounds
let finalFrame = CGRect(x: 0, y: screenBounds.height * 2, width: screenBounds.width, height: screenBounds.height)
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
fromVC.view.frame = finalFrame
}) { (finished) in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
}
}
//
// ChargeGuideController.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
class ChargeGuideStartController : BaseViewController {
var callback : callBack<Any> = {text in}
lazy var backView : UIImageView = {
let view = UIImageView()
return view
}()
lazy var startButton : UIButton = {
let view = UIButton()
view.setTitle("Get Started", for: .normal)
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
view.setTitleColor(.white, for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(getStart), for: .touchUpInside)
return view
}()
lazy var closeButton : UIButton = {
let view = UIButton()
view.backgroundColor = .clear
view.setImage(UIImage(named: "ic_close_charging"), for: .normal)
view.addTarget(self, action: #selector(closeCurrentPage), for: .touchUpInside)
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(self.backView)
self.view.addSubview(self.startButton)
self.view.addSubview(self.closeButton)
self.backView.snp.makeConstraints { make in
make.left.right.bottom.top.equalToSuperview()
}
self.startButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.bottom.equalToSuperview().offset(-70)
make.height.equalTo(46)
}
self.closeButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-15)
make.top.equalToSuperview().offset(statusBarHeight + 15)
make.width.height.equalTo(28)
}
}
@objc func closeCurrentPage(){
self.dismiss(animated: true)
}
@objc func getStart(){
callback("getStart")
self.dismiss(animated: false)
}
}
//
// ChargeViewController.swift
// PhoneManager
//
// Created by edy on 2025/3/26.
//
import UIKit
class ChargeViewController:BaseViewController {
lazy var detailsBtn:UIButton = {
let sview:UIButton = UIButton()
sview.setImage(UIImage(named: "ic_details_charging"), for: .normal)
sview.width = 20
sview.height = 20
sview.x = view.width - sview.width - 15
sview.centerY = navCenterY
sview.addTarget(self, action: #selector(guideClick), for: .touchUpInside)
return sview
}()
lazy var chargeView:ChargeView = {
let cY:CGFloat = titleView.height + titleView.y
let sview:ChargeView = ChargeView(frame: CGRect(x: 0, y: cY, width: view.width, height: view.height - cY))
sview.callBack = {[weak self] model in
guard let self else {return}
DispatchQueue.main.async {[weak self] in
guard let self else {return}
if let cModel = model as? ChargeDataModel {
let vc:ChargeInfoViewController = ChargeInfoViewController(model: cModel, type: ChargeInfoViewController.ChargeInfoType.setting)
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
return sview
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .green
titleView.addSubview(detailsBtn)
view.addSubview(chargeView)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.barHidden = false
}
// 跳转充电引导
@objc func guideClick(){
let vc : ChargeGuideStartController = ChargeGuideStartController()
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true)
vc.callback = {[weak self] text in
guard let self else {return}
let vc : ChargeGuideController = ChargeGuideController()
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
//
// ChargeDataModel.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
struct ChargeDataModel {
var isFree:Bool
var CoverImage:UIImage
var url : URL
init(isFree: Bool, CoverImage: UIImage, url: URL) {
self.isFree = isFree
self.CoverImage = CoverImage
self.url = url
}
}
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
// //
import Foundation import Foundation
import AVFoundation
func loadChargeImtesSONFromBundle() -> [ChargeViewCollectionModel]? { func loadChargeImtesSONFromBundle() -> [ChargeViewCollectionModel]? {
// 获取 JSON 文件路径 // 获取 JSON 文件路径
...@@ -28,6 +29,31 @@ func loadChargeImtesSONFromBundle() -> [ChargeViewCollectionModel]? { ...@@ -28,6 +29,31 @@ func loadChargeImtesSONFromBundle() -> [ChargeViewCollectionModel]? {
} }
} }
func loadVideoItems() -> [ChargeDataModel]{
let mainBundle = Bundle.main
// 获取指定文件夹下所有 MP4 文件的 URL
var dataArray : [ChargeDataModel] = []
if let mp4URLs = mainBundle.urls(forResourcesWithExtension: "mp4", subdirectory: nil) {
for url in mp4URLs {
let asset = AVURLAsset(url: url)
// 获取视频第一帧图片
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
let time = CMTimeMake(value: 0, timescale: 1)
do {
let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
let image = UIImage(cgImage: cgImage)
let model = ChargeDataModel(isFree: true, CoverImage: image, url: url)
dataArray.append(model)
print("获取视频成功")
} catch {
print("获取视频图片出错: \(error.localizedDescription)")
}
}
}
return dataArray
}
struct ChargeViewCollectionModel:Codable { struct ChargeViewCollectionModel:Codable {
var isFree:Bool var isFree:Bool
......
//
// ChargeGuideEndView.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
class ChargeGuideEndView : UIView{
var callback :callBack<Any> = {text in}
lazy var backView : UIImageView = {
let view = UIImageView()
return view
}()
lazy var gotoAnimationButton : UIButton = {
let view = UIButton()
view.setTitle("Go to Animations", for: .normal)
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
view.setTitleColor(.white, for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(gotoAnimation), for: .touchUpInside)
return view
}()
lazy var startOverButton : UIButton = {
let view = UIButton()
view.setTitle("Start Over", for: .normal)
view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(startOver), for: .touchUpInside)
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.backView)
self.addSubview(self.gotoAnimationButton)
self.addSubview(self.startOverButton)
self.backView.snp.makeConstraints { make in
make.left.right.bottom.top.equalToSuperview()
}
self.gotoAnimationButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.bottom.equalToSuperview().offset(-150)
make.height.equalTo(46)
}
self.startOverButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.bottom.equalToSuperview().offset(-70)
make.height.equalTo(46)
}
}
@objc func gotoAnimation(){
self.responderViewController()?.navigationController?.popViewController(animated: true)
}
@objc func startOver(){
callback("over")
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//
// ChargeGuideNormalView.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
class ChargeGuideNormalView : UIView{
var orderFlag : Int = 1
var callback :callBack<Any> = {text in}
lazy var backView : UIImageView = {
let view = UIImageView()
return view
}()
lazy var backButton : UIButton = {
let view = UIButton()
view.setTitle("Back", for: .normal)
view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
view.setTitleColor(.white, for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(getBack), for: .touchUpInside)
return view
}()
lazy var nextButton : UIButton = {
let view = UIButton()
view.setTitle("Next", for: .normal)
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(getNext), for: .touchUpInside)
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.backView)
self.addSubview(self.backButton)
self.addSubview(self.nextButton)
self.backView.snp.makeConstraints { make in
make.left.right.bottom.top.equalToSuperview()
}
self.backView.snp.makeConstraints { make in
make.left.right.bottom.top.equalToSuperview()
}
self.backButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.width.equalTo(self.snp.width).multipliedBy(0.5).offset(-20)
make.bottom.equalToSuperview().offset(-70)
make.height.equalTo(46)
}
self.nextButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-15)
make.width.equalTo(self.snp.width).multipliedBy(0.5).offset(-20)
make.bottom.equalToSuperview().offset(-70)
make.height.equalTo(46)
}
}
@objc func getBack(){
callback("back")
}
@objc func getNext(){
callback("next")
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//
// ChargeGuideOpenShortcutsView.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
class ChargeGuideOpenShortcutsView : UIView {
var callback :callBack<Any> = {text in}
lazy var backView : UIImageView = {
let view = UIImageView()
return view
}()
lazy var openButton : UIButton = {
let view = UIButton()
view.setTitle("Open Shortcuts", for: .normal)
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
view.setTitleColor(.white, for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(getOpen), for: .touchUpInside)
return view
}()
lazy var nextButton : UIButton = {
let view = UIButton()
view.setTitle("Next", for: .normal)
view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
view.setTitleColor(.black, for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 8
view.addTarget(self, action: #selector(getNext), for: .touchUpInside)
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.backView)
self.addSubview(self.openButton)
self.addSubview(self.nextButton)
self.backView.snp.makeConstraints { make in
make.left.right.bottom.top.equalToSuperview()
}
self.openButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.bottom.equalToSuperview().offset(-150)
make.height.equalTo(46)
}
self.nextButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.bottom.equalToSuperview().offset(-70)
make.height.equalTo(46)
}
}
@objc func getOpen(){
// 创建快捷指令 APP 的 URL
if let shortcutsURL = URL(string: "shortcuts://") {
// 检查设备是否能打开该 URL
if UIApplication.shared.canOpenURL(shortcutsURL) {
// 打开快捷指令 APP
UIApplication.shared.open(shortcutsURL, options: [:], completionHandler: { (success) in
if success {
print("成功跳转至快捷指令 APP")
} else {
print("无法跳转至快捷指令 APP")
}
})
} else {
print("设备不支持打开快捷指令 APP")
}
}
}
@objc func getNext(){
callback("next")
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
...@@ -7,21 +7,16 @@ ...@@ -7,21 +7,16 @@
import UIKit import UIKit
import SnapKit import SnapKit
import AVKit
class ChargeInfoBackView:UIView { class ChargeInfoBackView:UIView {
var backImage:String? var model : ChargeDataModel?
private var timer: Timer? private var timer: Timer?
lazy var backImageView:UIImageView = { lazy var videoPlayView:ChargeVideoPlayingView = {
let sview:ChargeVideoPlayingView = ChargeVideoPlayingView(frame: self.bounds)
let sview:UIImageView = UIImageView()
sview.contentMode = .scaleToFill
sview.clipsToBounds = true
sview.isUserInteractionEnabled = true
return sview return sview
}() }()
...@@ -53,14 +48,16 @@ class ChargeInfoBackView:UIView { ...@@ -53,14 +48,16 @@ class ChargeInfoBackView:UIView {
return label return label
}() }()
init(frame: CGRect,backImage:String) { init(frame: CGRect,model:ChargeDataModel) {
self.backImage = backImage
super.init(frame: frame) super.init(frame: frame)
self.model = model
setupUI() setupUI()
self.videoPlayView.playVideo(with: self.model!.url)
setupTimeUpdates() setupTimeUpdates()
BatteryMonitorManager.shared.delegate = self BatteryMonitorManager.shared.delegate = self
...@@ -74,9 +71,8 @@ class ChargeInfoBackView:UIView { ...@@ -74,9 +71,8 @@ class ChargeInfoBackView:UIView {
func setupUI() { func setupUI() {
backImageView.image = UIImage(named: self.backImage ?? "")
self.addSubview(backImageView) self.addSubview(videoPlayView)
self.addSubview(timeLabel) self.addSubview(timeLabel)
...@@ -190,7 +186,7 @@ class ChargeInfoBackView:UIView { ...@@ -190,7 +186,7 @@ class ChargeInfoBackView:UIView {
super.layoutSubviews() super.layoutSubviews()
backImageView.snp.makeConstraints { make in videoPlayView.snp.makeConstraints { make in
make.centerX.width.height.equalToSuperview() make.centerX.width.height.equalToSuperview()
} }
......
//
// VideoPlayingView.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import Foundation
import UIKit
import AVKit
class ChargeVideoPlayingView: UIView {
private var player: AVPlayer?
private var playerLayer: AVPlayerLayer?
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
private func setupView() {
backgroundColor = .black
}
func playVideo(with url: URL) {
// 对 URL 字符串进行编码处理
guard let encodedURLString = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
print("URL 编码失败")
return
}
// 将编码后的字符串转换为 URL 对象
guard let encodedURL = URL(string: encodedURLString) else {
print("无法创建编码后的 URL")
return
}
self.player = AVPlayer(url: url)
self.playerLayer = AVPlayerLayer(player: self.player)
self.playerLayer?.frame = self.bounds
self.layer.addSublayer(playerLayer!)
// 监听视频加载状态
player?.addObserver(self, forKeyPath: "status", options: [.new, .old], context: nil)
NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem)
player?.play()
}
@objc private func playerDidFinishPlaying() {
player?.seek(to: CMTime.zero)
player?.play()
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "status" {
if let status = player?.status {
switch status {
case .readyToPlay:
print("视频准备好播放")
case .failed:
if let error = player?.error {
print("视频播放失败: \(error.localizedDescription)")
}
case .unknown:
print("视频状态未知")
@unknown default:
break
}
}
}
}
deinit {
NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem)
}
}
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
// //
import UIKit import UIKit
import AVFoundation
class ChargeView:UIView { class ChargeView:UIView {
...@@ -13,7 +14,7 @@ class ChargeView:UIView { ...@@ -13,7 +14,7 @@ class ChargeView:UIView {
let footerID:String = "footerID" let footerID:String = "footerID"
lazy var models:[ChargeViewCollectionModel] = [] lazy var models:[ChargeDataModel] = []
lazy var collectionView:UICollectionView = { lazy var collectionView:UICollectionView = {
...@@ -53,11 +54,13 @@ class ChargeView:UIView { ...@@ -53,11 +54,13 @@ class ChargeView:UIView {
super.init(frame: frame) super.init(frame: frame)
models = loadChargeImtesSONFromBundle() ?? [] models = loadVideoItems()
setupUI() setupUI()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
......
...@@ -12,6 +12,8 @@ class ChargeViewCollectionCell:UICollectionViewCell { ...@@ -12,6 +12,8 @@ class ChargeViewCollectionCell:UICollectionViewCell {
static let identifiers = "ChargeViewCollectionCellID" static let identifiers = "ChargeViewCollectionCellID"
var videoURL : URL?
lazy var backImageView:UIImageView = { lazy var backImageView:UIImageView = {
let sview:UIImageView = UIImageView() let sview:UIImageView = UIImageView()
...@@ -56,7 +58,7 @@ class ChargeViewCollectionCell:UICollectionViewCell { ...@@ -56,7 +58,7 @@ class ChargeViewCollectionCell:UICollectionViewCell {
self.contentView.addSubview(isFreeBtn) self.contentView.addSubview(isFreeBtn)
} }
var model:ChargeViewCollectionModel! { var model:ChargeDataModel! {
didSet { didSet {
...@@ -64,9 +66,11 @@ class ChargeViewCollectionCell:UICollectionViewCell { ...@@ -64,9 +66,11 @@ class ChargeViewCollectionCell:UICollectionViewCell {
guard let self else {return} guard let self else {return}
self.backImageView.image = UIImage.init(named: model.CoverImage) self.backImageView.image = model.CoverImage
self.isFreeBtn.isHidden = model.isFree self.isFreeBtn.isHidden = model.isFree
self.videoURL = model.url
} }
} }
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import Foundation import Foundation
import Photos import Photos
import Lottie
class CompressCompletedViewController : BaseViewController{ class CompressCompletedViewController : BaseViewController{
...@@ -18,12 +19,12 @@ class CompressCompletedViewController : BaseViewController{ ...@@ -18,12 +19,12 @@ class CompressCompletedViewController : BaseViewController{
var currentMediaType : Int = 0 var currentMediaType : Int = 0
lazy var imageView: UIImageView = { lazy var animationView : LottieAnimationView = {
let imageView = UIImageView() let animationView = LottieAnimationView(name: "CompressCompletedLight")
imageView.clipsToBounds = true animationView.layer.cornerRadius = 12
imageView.layer.cornerRadius = 12 animationView.backgroundColor = .gray
imageView.backgroundColor = .gray animationView.loopMode = .loop
return imageView return animationView
}() }()
...@@ -152,7 +153,7 @@ class CompressCompletedViewController : BaseViewController{ ...@@ -152,7 +153,7 @@ class CompressCompletedViewController : BaseViewController{
self.view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1) self.view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
self.titleView.isHidden = true self.titleView.isHidden = true
self.view.addSubview(self.imageView) self.view.addSubview(self.animationView)
self.view.addSubview(self.tipLabel) self.view.addSubview(self.tipLabel)
self.view.addSubview(self.detailTiplabel) self.view.addSubview(self.detailTiplabel)
self.view.addSubview(self.infoView) self.view.addSubview(self.infoView)
...@@ -168,13 +169,13 @@ class CompressCompletedViewController : BaseViewController{ ...@@ -168,13 +169,13 @@ class CompressCompletedViewController : BaseViewController{
self.view.addSubview(self.completedButton) self.view.addSubview(self.completedButton)
self.imageView.snp.makeConstraints { make in self.animationView.snp.makeConstraints { make in
make.top.equalTo(statusBarHeight + 60) make.top.equalTo(statusBarHeight + 60)
make.width.height.equalTo(230) make.width.height.equalTo(230)
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
} }
self.tipLabel.snp.makeConstraints { make in self.tipLabel.snp.makeConstraints { make in
make.top.equalTo(self.imageView.snp.bottom).offset(24) make.top.equalTo(self.animationView.snp.bottom).offset(24)
make.width.equalTo(295) make.width.equalTo(295)
make.height.equalTo(28) make.height.equalTo(28)
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
......
...@@ -29,7 +29,8 @@ class CompressQualityController : BaseViewController{ ...@@ -29,7 +29,8 @@ class CompressQualityController : BaseViewController{
let imageView = UIImageView() let imageView = UIImageView()
imageView.clipsToBounds = true imageView.clipsToBounds = true
imageView.layer.cornerRadius = 12 imageView.layer.cornerRadius = 12
imageView.backgroundColor = .clear imageView.contentMode = .scaleAspectFit
imageView.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
return imageView return imageView
}() }()
......
...@@ -40,20 +40,30 @@ class CompressSwitchView : UIView { ...@@ -40,20 +40,30 @@ class CompressSwitchView : UIView {
self.backgroundColor = .clear self.backgroundColor = .clear
self.addSubview(self.leftButton) self.addSubview(self.leftButton)
self.addSubview(self.rightButton) // // 暂时屏蔽
// self.addSubview(self.rightButton)
// self.leftButton.snp.makeConstraints { make in
// make.left.equalToSuperview().offset(4)
// make.top.equalToSuperview().offset(4)
// make.bottom.equalToSuperview().offset(-4)
// make.width.equalTo(self.snp.width).multipliedBy(0.5).offset(-6)
// }
//
// self.rightButton.snp.makeConstraints { make in
// make.right.equalToSuperview().offset(-4)
// make.top.equalToSuperview().offset(4)
// make.bottom.equalToSuperview().offset(-4)
// make.left.equalTo(self.leftButton.snp.right).offset(4)
// }
self.leftButton.snp.makeConstraints { make in self.leftButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(4) make.left.equalToSuperview().offset(4)
make.top.equalToSuperview().offset(4) make.top.equalToSuperview().offset(4)
make.bottom.equalToSuperview().offset(-4) make.bottom.equalToSuperview().offset(-4)
make.width.equalTo(self.snp.width).multipliedBy(0.5).offset(-6)
}
self.rightButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-4) make.right.equalToSuperview().offset(-4)
make.top.equalToSuperview().offset(4)
make.bottom.equalToSuperview().offset(-4)
make.left.equalTo(self.leftButton.snp.right).offset(4)
} }
// 初始化的时候设置默认值 // 初始化的时候设置默认值
......
...@@ -123,7 +123,7 @@ class HomeViewController:BaseViewController { ...@@ -123,7 +123,7 @@ class HomeViewController:BaseViewController {
if BatteryMonitorManager.shared.getBatteryIsCharging() { if BatteryMonitorManager.shared.getBatteryIsCharging() {
let vc:ChargeInfoViewController = ChargeInfoViewController(model:loadChargeImtesSONFromBundle()?.first, type: ChargeInfoViewController.ChargeInfoType.charge) let vc:ChargeInfoViewController = ChargeInfoViewController(model:loadVideoItems().first, type: ChargeInfoViewController.ChargeInfoType.charge)
self.navigationController?.pushViewController(vc, animated: false) self.navigationController?.pushViewController(vc, animated: false)
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
<key>NSUserActivityTypes</key> <key>NSUserActivityTypes</key>
<array> <array>
<string>LaunchAppIntent</string> <string>LaunchAppIntent</string>
<string>Charge Intents</string>
</array> </array>
<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key> <key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
<true/> <true/>
......
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