Commit 09821a35 authored by CZ1004's avatar CZ1004

资源配置

parent 9100f541
......@@ -24,6 +24,16 @@
/* End PBXContainerItemProxy 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 */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
......@@ -40,6 +50,8 @@
/* Begin PBXFileReference section */
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>"; };
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; };
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>"; };
......@@ -111,6 +123,8 @@
6028F60B696E2F97EAA2325C /* Pods_PhoneManager.framework */,
04BD915D2D9D68AD00055CEB /* WidgetKit.framework */,
04BD915F2D9D68AD00055CEB /* SwiftUI.framework */,
04BD7A442DA3BA1700A24C4B /* Intents.framework */,
04BD7A4F2DA3BA1700A24C4B /* IntentsUI.framework */,
);
name = Frameworks;
sourceTree = "<group>";
......@@ -180,6 +194,7 @@
EB388E592D8A61A800629B0D /* Resources */,
B06228D82143041809F900CE /* [CP] Embed Pods Frameworks */,
04BD916E2D9D68AF00055CEB /* Embed Foundation Extensions */,
04BD7A3E2DA3B8F100A24C4B /* Embed ExtensionKit Extensions */,
);
buildRules = (
);
......
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"filename" : "logo.png",
"idiom" : "universal",
"platform" : "ios",
"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
}
}
//
// 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 @@
//
import Foundation
import AVFoundation
func loadChargeImtesSONFromBundle() -> [ChargeViewCollectionModel]? {
// 获取 JSON 文件路径
......@@ -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 {
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 @@
import UIKit
import SnapKit
import AVKit
class ChargeInfoBackView:UIView {
var backImage:String?
var model : ChargeDataModel?
private var timer: Timer?
lazy var backImageView:UIImageView = {
let sview:UIImageView = UIImageView()
sview.contentMode = .scaleToFill
sview.clipsToBounds = true
sview.isUserInteractionEnabled = true
lazy var videoPlayView:ChargeVideoPlayingView = {
let sview:ChargeVideoPlayingView = ChargeVideoPlayingView(frame: self.bounds)
return sview
}()
......@@ -53,14 +48,16 @@ class ChargeInfoBackView:UIView {
return label
}()
init(frame: CGRect,backImage:String) {
self.backImage = backImage
init(frame: CGRect,model:ChargeDataModel) {
super.init(frame: frame)
self.model = model
setupUI()
self.videoPlayView.playVideo(with: self.model!.url)
setupTimeUpdates()
BatteryMonitorManager.shared.delegate = self
......@@ -73,10 +70,9 @@ class ChargeInfoBackView:UIView {
}
func setupUI() {
backImageView.image = UIImage(named: self.backImage ?? "")
self.addSubview(backImageView)
self.addSubview(videoPlayView)
self.addSubview(timeLabel)
......@@ -190,7 +186,7 @@ class ChargeInfoBackView:UIView {
super.layoutSubviews()
backImageView.snp.makeConstraints { make in
videoPlayView.snp.makeConstraints { make in
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 @@
//
import UIKit
import AVFoundation
class ChargeView:UIView {
......@@ -13,7 +14,7 @@ class ChargeView:UIView {
let footerID:String = "footerID"
lazy var models:[ChargeViewCollectionModel] = []
lazy var models:[ChargeDataModel] = []
lazy var collectionView:UICollectionView = {
......@@ -53,11 +54,13 @@ class ChargeView:UIView {
super.init(frame: frame)
models = loadChargeImtesSONFromBundle() ?? []
models = loadVideoItems()
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
......@@ -118,7 +121,7 @@ extension ChargeView:WaterfallMutiSectionDelegate,UICollectionViewDataSource,UIC
ofKind: kind,
withReuseIdentifier: footerID,
for: indexPath
)
)
return footer
}
......
......@@ -12,6 +12,8 @@ class ChargeViewCollectionCell:UICollectionViewCell {
static let identifiers = "ChargeViewCollectionCellID"
var videoURL : URL?
lazy var backImageView:UIImageView = {
let sview:UIImageView = UIImageView()
......@@ -56,7 +58,7 @@ class ChargeViewCollectionCell:UICollectionViewCell {
self.contentView.addSubview(isFreeBtn)
}
var model:ChargeViewCollectionModel! {
var model:ChargeDataModel! {
didSet {
......@@ -64,9 +66,11 @@ class ChargeViewCollectionCell:UICollectionViewCell {
guard let self else {return}
self.backImageView.image = UIImage.init(named: model.CoverImage)
self.backImageView.image = model.CoverImage
self.isFreeBtn.isHidden = model.isFree
self.videoURL = model.url
}
}
}
......
......@@ -7,6 +7,7 @@
import Foundation
import Photos
import Lottie
class CompressCompletedViewController : BaseViewController{
......@@ -18,12 +19,12 @@ class CompressCompletedViewController : BaseViewController{
var currentMediaType : Int = 0
lazy var imageView: UIImageView = {
let imageView = UIImageView()
imageView.clipsToBounds = true
imageView.layer.cornerRadius = 12
imageView.backgroundColor = .gray
return imageView
lazy var animationView : LottieAnimationView = {
let animationView = LottieAnimationView(name: "CompressCompletedLight")
animationView.layer.cornerRadius = 12
animationView.backgroundColor = .gray
animationView.loopMode = .loop
return animationView
}()
......@@ -152,7 +153,7 @@ class CompressCompletedViewController : BaseViewController{
self.view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
self.titleView.isHidden = true
self.view.addSubview(self.imageView)
self.view.addSubview(self.animationView)
self.view.addSubview(self.tipLabel)
self.view.addSubview(self.detailTiplabel)
self.view.addSubview(self.infoView)
......@@ -168,13 +169,13 @@ class CompressCompletedViewController : BaseViewController{
self.view.addSubview(self.completedButton)
self.imageView.snp.makeConstraints { make in
self.animationView.snp.makeConstraints { make in
make.top.equalTo(statusBarHeight + 60)
make.width.height.equalTo(230)
make.centerX.equalToSuperview()
}
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.height.equalTo(28)
make.centerX.equalToSuperview()
......
......@@ -29,7 +29,8 @@ class CompressQualityController : BaseViewController{
let imageView = UIImageView()
imageView.clipsToBounds = true
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
}()
......
......@@ -40,20 +40,30 @@ class CompressSwitchView : UIView {
self.backgroundColor = .clear
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
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)
}
// 初始化的时候设置默认值
......
......@@ -123,7 +123,7 @@ class HomeViewController:BaseViewController {
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)
......
......@@ -12,6 +12,7 @@
<key>NSUserActivityTypes</key>
<array>
<string>LaunchAppIntent</string>
<string>Charge Intents</string>
</array>
<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
<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