Ver código fonte

1.增加 sos 闪光
2.更换图标

100Years 3 meses atrás
pai
commit
33b8f5ea0c

+ 4 - 0
Girly.xcodeproj/project.pbxproj

@@ -89,6 +89,7 @@
 		A8BA8DB52D31FF87006CB966 /* TSTimerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DB42D31FF85006CB966 /* TSTimerView.swift */; };
 		A8BA8DB72D3203C3006CB966 /* TSSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DB62D3203BF006CB966 /* TSSettingCell.swift */; };
 		A8BA8DCA2D328228006CB966 /* CameraManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DC92D328228006CB966 /* CameraManager.swift */; };
+		A8F76C492D36887800AA6E93 /* TSSOSLigntVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C482D36886F00AA6E93 /* TSSOSLigntVC.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
@@ -177,6 +178,7 @@
 		A8BA8DB42D31FF85006CB966 /* TSTimerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTimerView.swift; sourceTree = "<group>"; };
 		A8BA8DB62D3203BF006CB966 /* TSSettingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSettingCell.swift; sourceTree = "<group>"; };
 		A8BA8DC92D328228006CB966 /* CameraManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraManager.swift; sourceTree = "<group>"; };
+		A8F76C482D36886F00AA6E93 /* TSSOSLigntVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSOSLigntVC.swift; sourceTree = "<group>"; };
 		BBACC86FF0E1F3F5E9AAF63F /* Pods_Girly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Girly.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -485,6 +487,7 @@
 				A8BA8D9A2D2FE43D006CB966 /* TSDiscoLightVC.swift */,
 				A8BA8D982D2FE41E006CB966 /* TSNightLightVC.swift */,
 				A8BA8D962D2FE3F1006CB966 /* TSWarningLightVC.swift */,
+				A8F76C482D36886F00AA6E93 /* TSSOSLigntVC.swift */,
 			);
 			path = VC;
 			sourceTree = "<group>";
@@ -719,6 +722,7 @@
 				A8BA8D422D2D1F6B006CB966 /* TSFlashVC.swift in Sources */,
 				A8BA8DA52D30C6B9006CB966 /* TSCustomTimer.swift in Sources */,
 				A8BA8D282D2D06B7006CB966 /* Int+Ex.swift in Sources */,
+				A8F76C492D36887800AA6E93 /* TSSOSLigntVC.swift in Sources */,
 				A8BA8D292D2D06B7006CB966 /* Dictionary+Ex.swift in Sources */,
 				A8BA8D2A2D2D06B7006CB966 /* UIImageView+Ex.swift in Sources */,
 				A8BA8CF82D2D061B006CB966 /* AppDelegate.swift in Sources */,

BIN
Girly/Assets.xcassets/Flash/light_alarm.imageset/light_alarm@2x.png


BIN
Girly/Assets.xcassets/Flash/light_alarm.imageset/light_alarm@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/light_sos.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "light_sos@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "light_sos@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
Girly/Assets.xcassets/Flash/light_sos.imageset/light_sos@2x.png


BIN
Girly/Assets.xcassets/Flash/light_sos.imageset/light_sos@3x.png


BIN
Girly/Assets.xcassets/Flash/light_warning.imageset/light_warning@2x.png


BIN
Girly/Assets.xcassets/Flash/light_warning.imageset/light_warning@3x.png


+ 21 - 0
Girly/Assets.xcassets/Light/shape/sos_shape.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "sos_shape.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
Girly/Assets.xcassets/Light/shape/sos_shape.imageset/sos_shape.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_select_light.imageset/tabbar_select_light@2x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_select_light.imageset/tabbar_select_light@3x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_unSelect_light.imageset/tabbar_unSelect_light@2x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_unSelect_light.imageset/tabbar_unSelect_light@3x.png


+ 15 - 3
Girly/Business/Flash/TSFlashVC.swift

@@ -62,19 +62,31 @@ class TSFlashVC: TSBaseVC{
                 kPushVC(target: self,modelVC:TSDiscoLightVC())
             }))
         
+//        sectionModel.addSubItemModel(
+//            createItemModel(
+//            leftImageName: "light_flash",
+//            height: cellH,
+//            rectCorner:.allCorners,
+//            tapBlock: {[weak self] itemModel, index, view  in
+//                guard let self = self else { return }
+//                kPushVC(target: self,modelVC:TSFlashLightVC())
+//            }))
+        
         sectionModel.addSubItemModel(
             createItemModel(
-            leftImageName: "light_flash",
+            leftImageName: "light_sos",
             height: cellH,
             rectCorner:.allCorners,
             tapBlock: {[weak self] itemModel, index, view  in
                 guard let self = self else { return }
-                kPushVC(target: self,modelVC:TSFlashLightVC())
+                kPushVC(target: self,modelVC:TSSOSLigntVC())
             }))
         
-        
         return dataArray
         
+        
+        
+        
     }()
     
     override func createView() {

+ 375 - 0
Girly/Business/Flash/VC/TSSOSLigntVC.swift

@@ -0,0 +1,375 @@
+//
+//  TSSOSLigntVC.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/14.
+//
+
+class TSSOSLigntVC: TSBaseVC {
+    
+    private var isOpen = false
+    private var currentValue:CGFloat = 0.5
+    
+    lazy var shapeView: TSLightShape1View = {
+        let shapeView = TSLightShape1View()
+        shapeView.imageNamed = "sos_shape"
+        shapeView.color = "#FF313D".color
+        return shapeView
+    }()
+    
+    let sosFlashlight = SOSFlashlight()
+
+    lazy var setToolView: TSSOSSetToolView = {
+        let setToolView = TSSOSSetToolView()
+        setToolView.changedValueComplete = { [weak self] value,isEnd in
+            guard let self = self else { return }
+            currentValue = value
+            
+            UIDevice.brightness(brightness: currentValue)
+        }
+        
+        setToolView.clickDoneComplete = { [weak self]  in
+            guard let self = self else { return }
+            isOpen = !isOpen
+            
+            if isOpen {
+                UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                    setToolView.isHidden = true
+                }
+                UIDevice.keepScreenAwake()
+                sosFlashlight.start()
+                setToolView.submitBtn.setTitle("Close".localized, for: .normal)
+            }else{
+                UIDevice.allowScreenSleep()
+                sosFlashlight.stop()
+                setToolView.submitBtn.setTitle("Open".localized, for: .normal)
+            }
+        }
+        
+        return setToolView
+    }()
+    
+
+    override func createView() {
+        
+        view.insertSubview(shapeView, at: 0)
+        shapeView.snp.makeConstraints { make in
+            make.top.equalTo(10)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(k_ScreenWidth)
+            make.height.equalToSuperview()
+        }
+
+        contentView.layoutIfNeeded()
+        self.shapeView.addContent()
+        
+        addNormalNavBarView()
+        setPageTitle("")
+        
+        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(showToView)))
+
+        contentView.addSubview(setToolView)
+        setToolView.snp.makeConstraints { make in
+            make.leading.trailing.equalTo(0)
+            make.bottom.equalTo(0)
+            make.height.equalTo(282.0)
+        }
+    }
+    
+    @objc func showToView() {
+        if setToolView.isHidden == true {
+            UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                self.setToolView.isHidden = false
+            }
+        }
+        self.setToolView.submitBtn.setTitle(self.isOpen ? "Close" : "Open", for: .normal)
+        UIDevice.allowScreenSleep()
+    }
+    
+    
+    deinit {
+        UIDevice.allowScreenSleep()
+        sosFlashlight.stop()
+    }
+}
+
+class TSSOSSetToolView: TSBaseView {
+
+    var clickDoneComplete:(()->Void)?
+    var changedValueComplete:((CGFloat,Bool)->Void)?{
+        didSet{
+            flashSliderView.changedValueComplete = changedValueComplete
+        }
+    }
+
+    lazy var bottomView: UIView = {
+        let bottomView = UIView()
+        bottomView.backgroundColor = .cardBgColor
+        return bottomView
+    }()
+    
+    var isShow = true
+
+    lazy var titleLabel1: UILabel = {
+        let titleLabel1 = UILabel.createLabel(text: "Brightness".localized,font: .font(size: 14,weight: .medium),textColor: .white)
+        return titleLabel1
+    }()
+
+    lazy var flashSliderView: TSFlashSliderView = {
+        let flashSliderView = TSFlashSliderView()
+        flashSliderView.setSliderValue(minimumValue: 0.0, maximumValue: 1.0, value: 0.5)
+        flashSliderView.setSliderImage(leftImage: UIImage(named: "reduceBrightness")!, rightImage: UIImage(named: "brightness")!)
+        return flashSliderView
+    }()
+    
+
+    lazy var submitBtn: UIButton = {
+        let submitBtn = createNormalSubmitBtn(title: "Open".localized) { [weak self]  in
+            guard let self = self else { return }
+            isShow = !isShow
+            clickDoneComplete?()
+        }
+        submitBtn.cornerRadius = 22.0;
+        return submitBtn
+    }()
+    
+
+    override func creatUI() {
+        
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        let cell1 = creatCell(subView: titleLabel1)
+        bottomView.addSubview(cell1)
+        cell1.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(20)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(flashSliderView)
+        flashSliderView.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+        
+        bottomView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.leading.equalTo(50)
+            make.trailing.equalTo(-51)
+            make.bottom.equalTo(-34)
+            make.height.equalTo(44)
+        }
+
+        kDelayMainShort {
+            self.bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+        }
+        
+    }
+    
+    func creatCell(subView:UIView) -> UIView{
+        let view = UIView()
+        view.addSubview(subView)
+        subView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(0)
+            make.centerY.equalToSuperview()
+        }
+        return view
+    }
+    
+
+}
+
+
+class TSLightShape1View: TSBaseView {
+
+    private var shwoWidth:CGFloat = k_ScreenWidth
+    private var less:CGFloat = 5.0
+    lazy var bgShapeView: UIView = {
+        let shapeView = UIView()
+        shapeView.frame = CGRect(x: 0, y: 0, width: shwoWidth-less, height: shwoWidth-less)
+        shapeView.backgroundColor = color
+        return shapeView
+    }()
+    
+   
+    lazy var blurView: UIView = {
+        let blurView = createBlurEffectView(style:.extraLight,backgroundColor: .clear)
+        blurView.frame = CGRect(x: 0, y: 0, width: shwoWidth, height: shwoWidth)
+        return blurView
+    }()
+    
+    lazy var shapeView: UIView = {
+        let shapeView = UIView()
+        shapeView.frame = CGRect(x: 0, y: 0, width: shwoWidth, height: shwoWidth)
+        shapeView.backgroundColor = color
+        return shapeView
+    }()
+    
+ 
+    
+    var imageNamed:String = "bold_roundness_shape" {
+        didSet{
+            if UIImage(named: imageNamed) != nil {
+                setShapeView(shapeView: bgShapeView)
+                setShapeView(shapeView: shapeView)
+            }
+        }
+    }
+    
+    var color:UIColor = .white {
+        didSet{
+            shapeView.backgroundColor = color
+            bgShapeView.backgroundColor = color
+        }
+    }
+    
+    override func creatUI() {
+        self.backgroundColor = .mainBg
+    }
+    
+    
+    func addContent() {
+        shwoWidth = min(contentView.width, contentView.height)
+        contentView.addSubview(bgShapeView)
+        contentView.addSubview(blurView)
+        contentView.addSubview(shapeView)
+        
+        let bottom:CGFloat = 0.0
+        let space:CGFloat = 0.0
+        bgShapeView.snp.makeConstraints { make in
+            make.leading.equalTo(space+less)
+            make.trailing.equalTo(-less-space)
+            make.top.equalTo(bottom)
+            make.bottom.equalTo(-bottom)
+        }
+        
+        blurView.snp.makeConstraints { make in
+            make.leading.equalTo(space)
+            make.trailing.equalTo(-space)
+            make.top.equalTo(bottom)
+            make.bottom.equalTo(-bottom)
+        }
+        
+        shapeView.snp.makeConstraints { make in
+            make.leading.equalTo(space)
+            make.trailing.equalTo(-space)
+            make.top.equalTo(bottom)
+            make.bottom.equalTo(-bottom)
+        }
+        
+        self.setNeedsLayout()
+        kDelayMainShort {
+            self.setShapeView(shapeView: self.bgShapeView)
+            self.setShapeView(shapeView: self.shapeView)
+        }
+        
+        for subview in blurView.subviews {
+            if String(describing: type(of: subview)).contains("UIVisualEffectSubview") {
+                subview.isHidden = true
+            }
+        }
+    
+    }
+    
+    func setShapeView(shapeView:UIView){
+        if let image = UIImage(named: imageNamed) {
+            shapeView.setImageMask(image: image,scaleFactor: 0.7)
+        }
+    }
+    
+}
+
+
+import AVFoundation
+
+class SOSFlashlight {
+    private var isRunning = false
+    private let device = AVCaptureDevice.default(for: .video)
+    
+    /// 开始闪烁
+    func start() {
+        guard let device = device, device.hasTorch else {
+            print("Device does not support torch")
+            return
+        }
+        
+        if isRunning { return } // 防止重复调用
+        isRunning = true
+        
+        DispatchQueue.global().async { [weak self] in
+            while self?.isRunning == true {
+                self?.flashSOSPattern()
+            }
+        }
+    }
+    
+    /// 停止闪烁
+    func stop() {
+        isRunning = false
+        turnTorch(on: false)
+    }
+    
+    /// 按摩斯码的模式闪烁
+    private func flashSOSPattern() {
+        // 短闪:0.2 秒,长闪:0.6 秒,间隔:0.2 秒
+        let shortDuration: TimeInterval = 0.2
+        let longDuration: TimeInterval = 0.6
+        let pauseDuration: TimeInterval = 0.2
+        
+        // 短闪三次
+        for _ in 0..<3 {
+            flash(on: true, for: shortDuration)
+            pause(for: pauseDuration)
+        }
+        
+        // 长闪三次
+        for _ in 0..<3 {
+            flash(on: true, for: longDuration)
+            pause(for: pauseDuration)
+        }
+        
+        // 短闪三次
+        for _ in 0..<3 {
+            flash(on: true, for: shortDuration)
+            pause(for: pauseDuration)
+        }
+        
+        // 间隔 1 秒后重复
+        pause(for: 1.0)
+    }
+    
+    /// 控制闪光灯开关并延迟指定时间
+    private func flash(on: Bool, for duration: TimeInterval) {
+        turnTorch(on: on)
+        pause(for: duration)
+        turnTorch(on: false)
+    }
+    
+    /// 打开或关闭闪光灯
+    private func turnTorch(on: Bool) {
+        guard let device = device, device.hasTorch else { return }
+        
+        do {
+            try device.lockForConfiguration()
+            device.torchMode = on ? .on : .off
+            if on {
+                try device.setTorchModeOn(level: AVCaptureDevice.maxAvailableTorchLevel)
+            }
+            device.unlockForConfiguration()
+        } catch {
+            print("Torch could not be used: \(error)")
+        }
+    }
+    
+    /// 延迟指定时间
+    private func pause(for duration: TimeInterval) {
+        Thread.sleep(forTimeInterval: duration)
+    }
+}

+ 2 - 2
Girly/Business/Flash/VC/TSWarningLightVC.swift

@@ -37,8 +37,8 @@ class TSWarningLightVC: TSBaseVC {
                     setToolView.isHidden = true
                 }
                 audioPlayer?.play()
-                warningImageView.startAlphaAnimation(minAlpha: 0.3,duration: 0.5)
-                flashlightController.startFlashing(frequency: 2.0)
+                warningImageView.startAlphaAnimation(minAlpha: 0.3,duration: 0.4)
+                flashlightController.startFlashing(frequency: 3)
             }else {
                 audioPlayer?.pause()
                 warningImageView.stopAlphaAnimation()

+ 1 - 1
Girly/Business/Light/VC/View/TSLightShapeView.swift

@@ -30,7 +30,7 @@ class TSLightShapeView: TSBaseView {
         return shapeView
     }()
     
- 
+    var scaleFactor:CGFloat = 1.0
     
     var imageNamed:String = "bold_roundness_shape" {
         didSet{

+ 116 - 51
Girly/Common/Ex/View+Ex.swift

@@ -117,65 +117,130 @@ extension UIView {
         self.subviews.forEach { $0.removeFromSuperview() }
     }
 
-    enum MaskContentMode {
-        case scaleToFill
-        case scaleAspectFit
-        case scaleAspectFill
-    }
+//    enum MaskContentMode {
+//        case scaleToFill
+//        case scaleAspectFit
+//        case scaleAspectFill
+//    }
+//    
+//    /// 设置图片蒙版,支持指定 `contentMode`
+//    /// - Parameters:
+//    ///   - image: 用作蒙版的图片
+//    ///   - contentMode: 蒙版的内容模式
+//    func setImageMask(image: UIImage, contentMode: MaskContentMode = .scaleAspectFit) {
+//        // 创建一个 CALayer 来作为蒙版
+//        let maskLayer = CALayer()
+//        maskLayer.contents = image.cgImage
+//        
+//        // 计算蒙版的 frame
+//        let viewSize = self.bounds.size
+//        let imageSize = image.size
+//        
+//        var maskFrame: CGRect = .zero
+//        
+//        switch contentMode {
+//        case .scaleToFill:
+//            // 拉伸填充整个视图
+//            maskFrame = CGRect(origin: .zero, size: viewSize)
+//            
+//        case .scaleAspectFit:
+//            // 按比例缩放,适配视图并居中
+//            let aspectWidth = viewSize.width / imageSize.width
+//            let aspectHeight = viewSize.height / imageSize.height
+//            let aspectRatio = min(aspectWidth, aspectHeight) // 按比例适配
+//            
+//            let scaledWidth = imageSize.width * aspectRatio
+//            let scaledHeight = imageSize.height * aspectRatio
+//            let xOffset = (viewSize.width - scaledWidth) / 2
+//            let yOffset = (viewSize.height - scaledHeight) / 2
+//            
+//            maskFrame = CGRect(x: xOffset, y: yOffset, width: scaledWidth, height: scaledHeight)
+//            
+//        case .scaleAspectFill:
+//            // 按比例缩放,填充视图并裁剪多余部分
+//            let aspectWidth = viewSize.width / imageSize.width
+//            let aspectHeight = viewSize.height / imageSize.height
+//            let aspectRatio = max(aspectWidth, aspectHeight) // 按比例填充
+//            
+//            let scaledWidth = imageSize.width * aspectRatio
+//            let scaledHeight = imageSize.height * aspectRatio
+//            let xOffset = (viewSize.width - scaledWidth) / 2
+//            let yOffset = (viewSize.height - scaledHeight) / 2
+//            
+//            maskFrame = CGRect(x: xOffset, y: yOffset, width: scaledWidth, height: scaledHeight)
+//        }
+//        
+//        maskLayer.frame = maskFrame
+//        
+//        // 设置蒙版
+//        self.layer.mask = maskLayer
+//    }
     
-    /// 设置图片蒙版,支持指定 `contentMode`
-    /// - Parameters:
-    ///   - image: 用作蒙版的图片
-    ///   - contentMode: 蒙版的内容模式
-    func setImageMask(image: UIImage, contentMode: MaskContentMode = .scaleAspectFit) {
-        // 创建一个 CALayer 来作为蒙版
-        let maskLayer = CALayer()
-        maskLayer.contents = image.cgImage
-        
-        // 计算蒙版的 frame
-        let viewSize = self.bounds.size
-        let imageSize = image.size
-        
-        var maskFrame: CGRect = .zero
-        
-        switch contentMode {
-        case .scaleToFill:
-            // 拉伸填充整个视图
-            maskFrame = CGRect(origin: .zero, size: viewSize)
+    
+    enum MaskContentMode {
+            case scaleToFill
+            case scaleAspectFit
+            case scaleAspectFill
+        }
+
+        /// 设置图片蒙版,支持指定 `contentMode` 和缩小比例
+        /// - Parameters:
+        ///   - image: 用作蒙版的图片
+        ///   - contentMode: 蒙版的内容模式
+        ///   - scaleFactor: 缩小比例,默认 1.0 表示不缩放,0.8 表示缩小为 80%
+        func setImageMask(image: UIImage, contentMode: MaskContentMode = .scaleAspectFit, scaleFactor: CGFloat = 1.0) {
+            guard scaleFactor > 0 && scaleFactor <= 1 else {
+                print("Invalid scaleFactor. It must be in the range (0, 1].")
+                return
+            }
             
-        case .scaleAspectFit:
-            // 按比例缩放,适配视图并居中
-            let aspectWidth = viewSize.width / imageSize.width
-            let aspectHeight = viewSize.height / imageSize.height
-            let aspectRatio = min(aspectWidth, aspectHeight) // 按比例适配
+            // 创建一个 CALayer 来作为蒙版
+            let maskLayer = CALayer()
+            maskLayer.contents = image.cgImage
             
-            let scaledWidth = imageSize.width * aspectRatio
-            let scaledHeight = imageSize.height * aspectRatio
-            let xOffset = (viewSize.width - scaledWidth) / 2
-            let yOffset = (viewSize.height - scaledHeight) / 2
+            // 计算蒙版的 frame
+            let viewSize = self.bounds.size
+            let imageSize = image.size
             
-            maskFrame = CGRect(x: xOffset, y: yOffset, width: scaledWidth, height: scaledHeight)
+            var maskFrame: CGRect = .zero
             
-        case .scaleAspectFill:
-            // 按比例缩放,填充视图并裁剪多余部分
-            let aspectWidth = viewSize.width / imageSize.width
-            let aspectHeight = viewSize.height / imageSize.height
-            let aspectRatio = max(aspectWidth, aspectHeight) // 按比例填充
+            switch contentMode {
+            case .scaleToFill:
+                // 拉伸填充整个视图
+                maskFrame = CGRect(origin: .zero, size: viewSize)
+                
+            case .scaleAspectFit:
+                // 按比例缩放,适配视图并居中
+                let aspectWidth = viewSize.width / imageSize.width
+                let aspectHeight = viewSize.height / imageSize.height
+                let aspectRatio = min(aspectWidth, aspectHeight) // 按比例适配
+                
+                let scaledWidth = imageSize.width * aspectRatio * scaleFactor
+                let scaledHeight = imageSize.height * aspectRatio * scaleFactor
+                let xOffset = (viewSize.width - scaledWidth) / 2
+                let yOffset = (viewSize.height - scaledHeight) / 2
+                
+                maskFrame = CGRect(x: xOffset, y: yOffset, width: scaledWidth, height: scaledHeight)
+                
+            case .scaleAspectFill:
+                // 按比例缩放,填充视图并裁剪多余部分
+                let aspectWidth = viewSize.width / imageSize.width
+                let aspectHeight = viewSize.height / imageSize.height
+                let aspectRatio = max(aspectWidth, aspectHeight) // 按比例填充
+                
+                let scaledWidth = imageSize.width * aspectRatio * scaleFactor
+                let scaledHeight = imageSize.height * aspectRatio * scaleFactor
+                let xOffset = (viewSize.width - scaledWidth) / 2
+                let yOffset = (viewSize.height - scaledHeight) / 2
+                
+                maskFrame = CGRect(x: xOffset, y: yOffset, width: scaledWidth, height: scaledHeight)
+            }
             
-            let scaledWidth = imageSize.width * aspectRatio
-            let scaledHeight = imageSize.height * aspectRatio
-            let xOffset = (viewSize.width - scaledWidth) / 2
-            let yOffset = (viewSize.height - scaledHeight) / 2
+            maskLayer.frame = maskFrame
             
-            maskFrame = CGRect(x: xOffset, y: yOffset, width: scaledWidth, height: scaledHeight)
+            // 设置蒙版
+            self.layer.mask = maskLayer
         }
-        
-        maskLayer.frame = maskFrame
-        
-        // 设置蒙版
-        self.layer.mask = maskLayer
-    }
-    
 }