// // ZLPhotoUIConfiguration.swift // ZLPhotoBrowser // // Created by long on 2022/4/18. // // Copyright (c) 2020 Long Zhang <495181165@qq.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import UIKit /// Custom UI configuration (include colors, images, text, font) @objcMembers public class ZLPhotoUIConfiguration: NSObject { @objc public enum CancelButtonStyle: Int { case text case image } private static var single = ZLPhotoUIConfiguration() public class func `default`() -> ZLPhotoUIConfiguration { return ZLPhotoUIConfiguration.single } public class func resetConfiguration() { ZLPhotoUIConfiguration.single = ZLPhotoUIConfiguration() } // MARK: Framework style. public var style: ZLPhotoBrowserStyle = .embedAlbumList public var statusBarStyle: UIStatusBarStyle = .lightContent /// text: Cancel. image: 'x'. Defaults to image. public var navCancelButtonStyle: ZLPhotoUIConfiguration.CancelButtonStyle = .image /// Whether to show the status bar when previewing photos. Defaults to false. public var showStatusBarInPreviewInterface = false /// HUD style. Defaults to dark. public var hudStyle: ZLProgressHUD.HUDStyle = .dark /// Adjust Slider Type public var adjustSliderType: ZLAdjustSliderType = .vertical public var cellCornerRadio: CGFloat = 0 /// Custom alert class. Defaults to nil. public var customAlertClass: ZLCustomAlertProtocol.Type? private var pri_columnCount = 4 /// The column count when iPhone is in portait mode. Minimum is 2, maximum is 6. Defaults to 4. /// ``` /// iPhone landscape mode: columnCount += 2. /// iPad portait mode: columnCount += 2. /// iPad landscape mode: columnCount += 4. /// ``` /// /// - Note: This property is ignored when using columnCountBlock. public var columnCount: Int { get { pri_columnCount } set { pri_columnCount = min(6, max(newValue, 2)) } } /// Use this property to customize the column count for `ZLThumbnailViewController`. /// This property is recommended. public var columnCountBlock: ((_ collectionViewWidth: CGFloat) -> Int)? /// The minimum spacing to use between items in the same row for `ZLThumbnailViewController`. public var minimumInteritemSpacing: CGFloat = 2 /// The minimum spacing to use between lines of items in the grid for `ZLThumbnailViewController`. public var minimumLineSpacing: CGFloat = 2 // MARK: Navigation and bottom tool bar /// The blur effect of the navigation bar in the album list public var navViewBlurEffectOfAlbumList: UIBlurEffect? = UIBlurEffect(style: .dark) /// The blur effect of the navigation bar in the preview interface public var navViewBlurEffectOfPreview: UIBlurEffect? = UIBlurEffect(style: .dark) /// The blur effect of the bottom tool bar in the album list public var bottomViewBlurEffectOfAlbumList: UIBlurEffect? = UIBlurEffect(style: .dark) /// The blur effect of the bottom tool bar in the preview interface public var bottomViewBlurEffectOfPreview: UIBlurEffect? = UIBlurEffect(style: .dark) // MARK: Image properties /// Developers can customize images, but the name of the custom image resource must be consistent with the image name in the replaced bundle. /// - example: Developers need to replace the selected and unselected image resources, and the array that needs to be passed in is /// ["zl_btn_selected", "zl_btn_unselected"]. public var customImageNames: [String] = [] { didSet { ZLCustomImageDeploy.imageNames = customImageNames } } /// Developers can customize images, but the name of the custom image resource must be consistent with the image name in the replaced bundle. /// - example: Developers need to replace the selected and unselected image resources, and the array that needs to be passed in is /// ["zl_btn_selected": selectedImage, "zl_btn_unselected": unselectedImage]. public var customImageForKey: [String: UIImage?] = [:] { didSet { customImageForKey.forEach { ZLCustomImageDeploy.imageForKey[$0.key] = $0.value } } } /// Developers can customize images, but the name of the custom image resource must be consistent with the image name in the replaced bundle. /// - example: Developers need to replace the selected and unselected image resources, and the array that needs to be passed in is /// ["zl_btn_selected": selectedImage, "zl_btn_unselected": unselectedImage]. public var customImageForKey_objc: [String: UIImage] = [:] { didSet { ZLCustomImageDeploy.imageForKey = customImageForKey_objc } } // MARK: Language properties /// Language for framework. public var languageType: ZLLanguageType = .system { didSet { ZLCustomLanguageDeploy.language = languageType Bundle.resetLanguage() } } /// Developers can customize languages. /// - example: If you needs to replace /// key: .hudLoading, value: "loading, waiting please" language, /// The dictionary that needs to be passed in is [.hudLoading: "text to be replaced"]. /// - warning: Please pay attention to the placeholders contained in languages when changing, such as %ld, %@. public var customLanguageKeyValue: [ZLLocalLanguageKey: String] = [:] { didSet { ZLCustomLanguageDeploy.deploy = customLanguageKeyValue } } /// Developers can customize languages (This property is only for objc). /// - example: If you needs to replace /// key: @"loading", value: @"loading, waiting please" language, /// The dictionary that needs to be passed in is @[@"hudLoading": @"text to be replaced"]. /// - warning: Please pay attention to the placeholders contained in languages when changing, such as %ld, %@. public var customLanguageKeyValue_objc: [String: String] = [:] { didSet { var swiftParams: [ZLLocalLanguageKey: String] = [:] customLanguageKeyValue_objc.forEach { key, value in swiftParams[ZLLocalLanguageKey(rawValue: key)] = value } customLanguageKeyValue = swiftParams } } // MARK: Font /// Font name. public var themeFontName: String? { didSet { ZLCustomFontDeploy.fontName = themeFontName } } // MARK: Color properties /// The theme color of framework. /// 框架主题色 public var themeColor: UIColor = .zl.rgba(7, 213, 101) /// Preview selection mode, translucent background color above. /// 预览快速选择模式下,上方透明区域背景色 public var sheetTranslucentColor: UIColor = .black.withAlphaComponent(0.1) /// Preview selection mode, a background color for `Camera`, `Album`, `Cancel` buttons. /// 预览快速选择模式下,按钮背景颜色 public var sheetBtnBgColor: UIColor = .white /// Preview selection mode, a text color for `Camera`, `Album`, `Cancel` buttons. /// 预览快速选择模式下,按钮标题颜色 public var sheetBtnTitleColor: UIColor = .black private var pri_sheetBtnTitleTintColor: UIColor? /// Preview selection mode, cancel button title color when the selection amount is superior than 0. /// 预览快速选择模式下,按钮标题高亮颜色 public var sheetBtnTitleTintColor: UIColor { get { pri_sheetBtnTitleTintColor ?? themeColor } set { pri_sheetBtnTitleTintColor = newValue } } /// A color for navigation bar. /// 相册列表及小图界面导航条背景色 public var navBarColor: UIColor = .zl.rgba(160, 160, 160, 0.65) /// A color for navigation bar in preview interface. /// 预览大图界面的导航条背景色 public var navBarColorOfPreviewVC: UIColor = .zl.rgba(160, 160, 160, 0.65) /// A color for Navigation bar text. /// 相册列表及小图界面导航栏标题颜色 public var navTitleColor: UIColor = .white /// A color for Navigation bar text of preview vc. /// 预览大图界面导航栏标题颜色 public var navTitleColorOfPreviewVC: UIColor = .white /// The background color of the title view when the frame style is embedAlbumList. /// 下拉选择相册列表模式下,选择区域的背景色 public var navEmbedTitleViewBgColor: UIColor = .zl.rgba(80, 80, 80) /// A color for background in album list. /// 相册列表背景色 public var albumListBgColor: UIColor = .zl.rgba(45, 45, 45) /// A color of the translucent area below the embed album list. /// 嵌入式相册列表下方透明区域颜色 public var embedAlbumListTranslucentColor: UIColor = .black.withAlphaComponent(0.8) /// A color for album list title label. /// 相册列表标题颜色 public var albumListTitleColor: UIColor = .white /// A color for album list count label. /// 相册列表数量label的颜色 public var albumListCountColor: UIColor = .zl.rgba(180, 180, 180) /// A color for album list separator. /// 相册列表分割线颜色 public var separatorColor: UIColor = .zl.rgba(60, 60, 60) /// A color for background in thumbnail interface. /// 相册小图界面背景色 public var thumbnailBgColor: UIColor = .zl.rgba(50, 50, 50) /// A color for background in preview interface.. /// 预览大图界面背景色 public var previewVCBgColor: UIColor = .black /// A color for background in bottom tool view. /// 相册小图界面底部工具条背景色 public var bottomToolViewBgColor: UIColor = .zl.rgba(35, 35, 35, 0.3) /// A color for background in bottom tool view in preview interface. /// 预览大图界面底部工具条背景色 public var bottomToolViewBgColorOfPreviewVC: UIColor = .zl.rgba(35, 35, 35, 0.3) /// The normal state title color of bottom tool view buttons. Without done button. /// 相册小图界面底部按钮可交互状态下标题颜色,不包括 `完成` 按钮 public var bottomToolViewBtnNormalTitleColor: UIColor = .white /// The normal state title color of bottom tool view done button. /// 相册小图界面底部 `完成` 按钮可交互状态下标题颜色 public var bottomToolViewDoneBtnNormalTitleColor: UIColor = .white /// The normal state title color of bottom tool view buttons in preview interface. Without done button. /// 预览大图界面底部按钮可交互状态下标题颜色,不包括 `完成` 按钮 public var bottomToolViewBtnNormalTitleColorOfPreviewVC: UIColor = .white /// The normal state title color of bottom tool view done button. /// 预览大图界面底部 `完成` 按钮可交互状态下标题颜色 public var bottomToolViewDoneBtnNormalTitleColorOfPreviewVC: UIColor = .white /// The disable state title color of bottom tool view buttons. Without done button. /// 相册小图界面底部按钮不可交互状态下标题颜色,不包括 `完成` 按钮 public var bottomToolViewBtnDisableTitleColor: UIColor = .zl.rgba(168, 168, 168) /// The disable state title color of bottom tool view done button. /// 相册小图界面底部 `完成` 按钮不可交互状态下标题颜色 public var bottomToolViewDoneBtnDisableTitleColor: UIColor = .zl.rgba(168, 168, 168) /// The disable state title color of bottom tool view buttons in preview interface. Without done button. /// 预览大图界面底部按钮不可交互状态下标题颜色,不包括 `完成` 按钮 public var bottomToolViewBtnDisableTitleColorOfPreviewVC: UIColor = .zl.rgba(168, 168, 168) /// The disable state title color of bottom tool view done button in preview interface. /// 预览大图界面底部 `完成` 按钮不可交互状态下标题颜色 public var bottomToolViewDoneBtnDisableTitleColorOfPreviewVC: UIColor = .zl.rgba(168, 168, 168) private var pri_bottomToolViewBtnNormalBgColor: UIColor? /// The normal state background color of bottom tool view buttons. /// 相册小图界面底部按钮可交互状态下背景色 public var bottomToolViewBtnNormalBgColor: UIColor { get { pri_bottomToolViewBtnNormalBgColor ?? themeColor } set { pri_bottomToolViewBtnNormalBgColor = newValue } } private var pri_bottomToolViewBtnNormalBgColorOfPreviewVC: UIColor? /// The normal state background color of bottom tool view buttons in preview interface. /// 预览大图界面底部按钮可交互状态下背景色 public var bottomToolViewBtnNormalBgColorOfPreviewVC: UIColor { get { pri_bottomToolViewBtnNormalBgColorOfPreviewVC ?? themeColor } set { pri_bottomToolViewBtnNormalBgColorOfPreviewVC = newValue } } /// The disable state background color of bottom tool view buttons. /// 相册小图界面底部按钮不可交互状态下背景色 public var bottomToolViewBtnDisableBgColor: UIColor = .zl.rgba(50, 50, 50) /// The disable state background color of bottom tool view buttons in preview interface. /// 预览大图界面底部按钮不可交互状态下背景色 public var bottomToolViewBtnDisableBgColorOfPreviewVC: UIColor = .zl.rgba(50, 50, 50) /// With iOS14 limited authority, a color for select more photos at the bottom of the thumbnail interface. /// iOS14 limited权限下,下方提示选择更多图片信息文字的颜色 public var limitedAuthorityTipsColor: UIColor = .white private var pri_cameraRecodeProgressColor: UIColor? /// The record progress color of custom camera. /// 自定义相机录制视频时进度条颜色 public var cameraRecodeProgressColor: UIColor { get { pri_cameraRecodeProgressColor ?? themeColor } set { pri_cameraRecodeProgressColor = newValue } } /// Mask layer color of selected cell. /// 已选择照片上方遮罩阴影颜色 public var selectedMaskColor: UIColor = .black.withAlphaComponent(0.2) private var pri_selectedBorderColor: UIColor? /// Border color of selected cell. /// 已选择照片border颜色 public var selectedBorderColor: UIColor { get { pri_selectedBorderColor ?? themeColor } set { pri_selectedBorderColor = newValue } } /// Mask layer color of the cell that cannot be selected. /// 不可选的照片上方遮罩阴影颜色 public var invalidMaskColor: UIColor = .white.withAlphaComponent(0.5) /// The text color of selected cell index label. /// 已选照片右上角序号label背景色 public var indexLabelTextColor: UIColor = .white private var pri_indexLabelBgColor: UIColor? /// The background color of selected cell index label. /// 已选照片右上角序号label背景色 public var indexLabelBgColor: UIColor { get { pri_indexLabelBgColor ?? themeColor } set { pri_indexLabelBgColor = newValue } } /// The background color of camera cell inside album. /// 相册小图界面拍照按钮背景色 public var cameraCellBgColor: UIColor = .zl.rgba(76, 76, 76) /// The normal color of adjust slider. /// 编辑图片,调整饱和度、对比度、亮度时,右侧slider背景色 public var adjustSliderNormalColor: UIColor = .white private var pri_adjustSliderTintColor: UIColor? /// The tint color of adjust slider. /// 编辑图片,调整饱和度、对比度、亮度时,右侧slider背景高亮色 public var adjustSliderTintColor: UIColor { get { pri_adjustSliderTintColor ?? themeColor } set { pri_adjustSliderTintColor = newValue } } /// The normal color of the title below the various tools in the image editor. /// 图片编辑器中各种工具下方标题普通状态下的颜色 public var imageEditorToolTitleNormalColor: UIColor = .zl.rgba(160, 160, 160) /// The tint color of the title below the various tools in the image editor. /// 图片编辑器中各种工具下方标题高亮状态下的颜色 public var imageEditorToolTitleTintColor: UIColor = .white /// The tint color of the image editor tool icons. /// 图片编辑器中各种工具图标高亮状态下的颜色 public var imageEditorToolIconTintColor: UIColor? /// Background color of trash can in image editor. /// 编辑器中垃圾箱普通状态下的颜色 public var trashCanBackgroundNormalColor: UIColor = .zl.rgba(40, 40, 40, 0.8) /// Background tint color of trash can in image editor. /// 编辑器中垃圾箱高亮状态下的颜色 public var trashCanBackgroundTintColor: UIColor = .zl.rgba(241, 79, 79, 0.98) } /// Font deploy enum ZLCustomFontDeploy { static var fontName: String? } /// Image source deploy enum ZLCustomImageDeploy { static var imageNames: [String] = [] static var imageForKey: [String: UIImage] = [:] } @objc public enum ZLPhotoBrowserStyle: Int { /// The album list is embedded in the navigation of the thumbnail interface, click the drop-down display. case embedAlbumList /// The display relationship between the album list and the thumbnail interface is push. case externalAlbumList } /// Language deploy enum ZLCustomLanguageDeploy { static var language: ZLLanguageType = .system static var deploy: [ZLLocalLanguageKey: String] = [:] } /// Adjust slider type @objc public enum ZLAdjustSliderType: Int { case vertical case horizontal }