适配打电话
This commit is contained in:
30
Pods/DDUIKit/DDUIKit/Classes/UIApplication/UIApplication.swift
generated
Normal file
30
Pods/DDUIKit/DDUIKit/Classes/UIApplication/UIApplication.swift
generated
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// UIApplication.swift
|
||||
// Pods-DDUIKit_Example
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIApplication {
|
||||
public enum UrlTypeEnum : String {
|
||||
case phone = "tel:"
|
||||
case mail = "mailto:"
|
||||
case sms = "sms:"
|
||||
case map = "http://maps.apple.com/?"
|
||||
}
|
||||
|
||||
public func dd_openUrl(type:UrlTypeEnum,appending:String,completionHandler:((Bool) -> Void)? = nil) {
|
||||
var urlString = type.rawValue
|
||||
urlString = urlString.appending(appending)
|
||||
if let url = URL(string: urlString),UIApplication.shared.canOpenURL(url) == true {
|
||||
UIApplication.shared.open(url,completionHandler: completionHandler)
|
||||
}
|
||||
}
|
||||
|
||||
public func dd_openSetting(completionHandler:((Bool) -> Void)? = nil) {
|
||||
if let url = URL(string: UIApplicationOpenSettingsURLString),UIApplication.shared.canOpenURL(url) == true {
|
||||
UIApplication.shared.open(url,completionHandler: completionHandler)
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UIButton/DDUIButton.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UIButton/DDUIButton.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUIButton.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIButton : UIButton {
|
||||
|
||||
}
|
||||
248
Pods/DDUIKit/DDUIKit/Classes/UIButton/UIButton.swift
generated
Normal file
248
Pods/DDUIKit/DDUIKit/Classes/UIButton/UIButton.swift
generated
Normal file
@@ -0,0 +1,248 @@
|
||||
//
|
||||
// UIButton.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
// MARK: 关联的对象
|
||||
public extension UIButton {
|
||||
internal struct DDButtonAssociatedKey {
|
||||
static var adjustsImageWhenHighlighted = true
|
||||
static var adjustsImageWhenDisabled = true
|
||||
static var contentEdgeInsets = UIEdgeInsets.zero
|
||||
static var imagePadding = 0.0
|
||||
static var imagePlacement : DDImagePosition = .left
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: MethodSwizzling
|
||||
public extension UIButton {
|
||||
|
||||
static func dd_methodSwizzlingUIButton() {
|
||||
dd_methodSwizzling(targetClass: UIButton.self, originalSelector: #selector(UIButton.init(frame:)), swizzledSelector: #selector(UIButton.dd_init(frame:)))
|
||||
dd_methodSwizzling(targetClass: UIButton.self, originalSelector: #selector(UIButton.setTitleColor(_:for:)), swizzledSelector: #selector(UIButton.dd_setTitleColor(_:for:)))
|
||||
dd_methodSwizzling(targetClass: UIButton.self, originalSelector: #selector(UIButton.point(inside:with:)), swizzledSelector: #selector(UIButton.dd_point(inside:with:)))
|
||||
}
|
||||
|
||||
@objc func dd_init(frame: CGRect) {
|
||||
dd_init(frame: frame)
|
||||
|
||||
/// 去掉图片的高亮
|
||||
dd_adjustsImageWhenHighlighted = true
|
||||
|
||||
if #available(iOS 15.0, *) {
|
||||
/// 创建一个configuration,背景色为clear
|
||||
configuration = UIButton.Configuration.plain()
|
||||
configuration?.background = UIBackgroundConfiguration.clear()
|
||||
configuration?.background.backgroundColor = .clear
|
||||
|
||||
/// automaticallyUpdatesConfiguration = true时,按钮state改变时会自动更新configuration,automaticallyUpdatesConfiguration = false时,configurationUpdateHandler里需要将updated(for:)后的configuration赋值给button才能更新状态.
|
||||
/// automaticallyUpdatesConfiguration = false时,需要重新实现configurationUpdateHandler方法
|
||||
configurationUpdateHandler = {[weak self] button in
|
||||
var oldC = button.configuration
|
||||
|
||||
if let imagePadding = self?.dd_imagePadding {
|
||||
oldC?.imagePadding = imagePadding
|
||||
}
|
||||
|
||||
if let imagePosition = self?.dd_imagePlacement {
|
||||
var position : NSDirectionalRectEdge = .leading
|
||||
switch imagePosition {
|
||||
case .left:
|
||||
position = .leading
|
||||
case .bottom:
|
||||
position = .bottom
|
||||
case .right:
|
||||
position = .trailing
|
||||
case .top:
|
||||
position = .top
|
||||
}
|
||||
oldC?.imagePlacement = position
|
||||
}
|
||||
|
||||
if let dd_contentEdgeInsets = self?.dd_contentEdgeInsets {
|
||||
oldC?.contentInsets = NSDirectionalEdgeInsets(top: dd_contentEdgeInsets.top, leading: dd_contentEdgeInsets.left, bottom: dd_contentEdgeInsets.bottom, trailing: dd_contentEdgeInsets.right)
|
||||
}
|
||||
|
||||
switch button.state {
|
||||
case .normal:
|
||||
break
|
||||
case .selected:
|
||||
break
|
||||
case .highlighted:
|
||||
/// 取消高亮
|
||||
if self?.dd_adjustsImageWhenHighlighted == true {
|
||||
let image = oldC?.image
|
||||
let newImage = image?.withRenderingMode(.alwaysTemplate)
|
||||
oldC?.image = newImage
|
||||
oldC?.imageColorTransformer = UIConfigurationColorTransformer({ color in
|
||||
return UIColor.init(white: 0, alpha: 0.8)
|
||||
})
|
||||
}
|
||||
break
|
||||
case .disabled:
|
||||
if self?.dd_adjustsImageWhenDisabled == true {
|
||||
let image = oldC?.image
|
||||
let newImage = image?.withRenderingMode(.alwaysTemplate)
|
||||
oldC?.image = newImage
|
||||
oldC?.imageColorTransformer = UIConfigurationColorTransformer({ color in
|
||||
return UIColor.init(white: 0.5, alpha: 0.5)
|
||||
})
|
||||
}
|
||||
break
|
||||
case .focused:
|
||||
break
|
||||
case .application:
|
||||
break
|
||||
case .reserved:
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
button.configuration = oldC
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@objc func dd_setTitleColor(_ color: UIColor?, for state: UIControl.State) {
|
||||
dd_setTitleColor(color, for: state)
|
||||
|
||||
if state == .normal {
|
||||
setTitleColor(color, for: .highlighted)
|
||||
setTitleColor(color, for: .selected)
|
||||
setTitleColor(color, for: .disabled)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: 按钮的图片状态
|
||||
public extension UIButton {
|
||||
var dd_adjustsImageWhenHighlighted : Bool {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDButtonAssociatedKey.adjustsImageWhenHighlighted) as? Bool) ?? DDButtonAssociatedKey.adjustsImageWhenHighlighted
|
||||
}
|
||||
|
||||
set {
|
||||
if #available(iOS 15.0, *) {
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.adjustsImageWhenHighlighted, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}else{
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.adjustsImageWhenHighlighted, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
adjustsImageWhenHighlighted = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var dd_adjustsImageWhenDisabled : Bool {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDButtonAssociatedKey.adjustsImageWhenDisabled) as? Bool) ?? DDButtonAssociatedKey.adjustsImageWhenDisabled
|
||||
}
|
||||
|
||||
set {
|
||||
if #available(iOS 15.0, *) {
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.adjustsImageWhenDisabled, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}else{
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.adjustsImageWhenDisabled, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
adjustsImageWhenDisabled = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: 按钮的图片和文字的位置
|
||||
public extension UIButton {
|
||||
enum DDImagePosition : Int {
|
||||
case top = 0
|
||||
case left
|
||||
case bottom
|
||||
case right
|
||||
}
|
||||
|
||||
var dd_contentEdgeInsets : UIEdgeInsets {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDButtonAssociatedKey.contentEdgeInsets) as? UIEdgeInsets) ?? DDButtonAssociatedKey.contentEdgeInsets
|
||||
}
|
||||
set {
|
||||
if #available(iOS 15.0, *) {
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.contentEdgeInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}else{
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.contentEdgeInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
contentEdgeInsets = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@available(iOS 15.0, *)
|
||||
internal var dd_imagePadding : CGFloat {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDButtonAssociatedKey.imagePadding) as? CGFloat) ?? DDButtonAssociatedKey.imagePadding
|
||||
}
|
||||
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.imagePadding, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
setNeedsUpdateConfiguration()
|
||||
}
|
||||
}
|
||||
|
||||
@available(iOS 15.0, *)
|
||||
internal var dd_imagePlacement : DDImagePosition {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDButtonAssociatedKey.imagePlacement) as? DDImagePosition) ?? DDButtonAssociatedKey.imagePlacement
|
||||
}
|
||||
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDButtonAssociatedKey.imagePlacement, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
setNeedsUpdateConfiguration()
|
||||
}
|
||||
}
|
||||
|
||||
func dd_imagePosition(position:DDImagePosition,spaceWithText space:CGFloat) {
|
||||
if #available(iOS 15.0, *) {
|
||||
dd_imagePlacement = position
|
||||
dd_imagePadding = space
|
||||
}else{
|
||||
let imageWith : CGFloat = imageView?.intrinsicContentSize.width ?? 0.0
|
||||
let imageHeight : CGFloat = imageView?.intrinsicContentSize.height ?? 0.0
|
||||
|
||||
let labelWidth : CGFloat = titleLabel?.intrinsicContentSize.width ?? 0.0
|
||||
let labelHeight : CGFloat = titleLabel?.intrinsicContentSize.height ?? 0.0
|
||||
|
||||
var imageEdgeInsets : UIEdgeInsets = .zero
|
||||
var labelEdgeInsets : UIEdgeInsets = .zero
|
||||
|
||||
switch position {
|
||||
case .top:
|
||||
imageEdgeInsets = UIEdgeInsets.init(top: -labelHeight - space/2.0, left: 0, bottom: 0, right: -labelWidth)
|
||||
labelEdgeInsets = UIEdgeInsets.init(top:0, left: -imageWith, bottom: -imageHeight-space/2.0, right: 0)
|
||||
break;
|
||||
case .left:
|
||||
imageEdgeInsets = UIEdgeInsets.init(top:0, left:-space/2.0, bottom: 0, right:space/2.0)
|
||||
labelEdgeInsets = UIEdgeInsets.init(top:0, left:space/2.0, bottom: 0, right: -space/2.0)
|
||||
break;
|
||||
case .bottom:
|
||||
imageEdgeInsets = UIEdgeInsets.init(top:0, left:0, bottom: -labelHeight-space/2.0, right: -labelWidth)
|
||||
labelEdgeInsets = UIEdgeInsets.init(top:-imageHeight-space/2.0, left:-imageWith, bottom: 0, right: 0)
|
||||
break;
|
||||
case .right:
|
||||
imageEdgeInsets = UIEdgeInsets.init(top:0, left:labelWidth+space/2.0, bottom: 0, right: -labelWidth-space/2.0)
|
||||
labelEdgeInsets = UIEdgeInsets.init(top:0, left:-imageWith-space/2.0, bottom: 0, right:imageWith+space/2.0)
|
||||
break;
|
||||
}
|
||||
|
||||
self.titleEdgeInsets = labelEdgeInsets
|
||||
self.imageEdgeInsets = imageEdgeInsets
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: 扩大按钮的点击范围
|
||||
public extension UIButton {
|
||||
@objc func dd_point(inside point: CGPoint, with event: UIEvent?) -> Bool {
|
||||
var bounds = self.bounds
|
||||
let widthDelta = max(44.0 - bounds.size.width, 0)
|
||||
let heightDelta = max(44.0 - bounds.size.height, 0)
|
||||
bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta)
|
||||
return CGRectContainsPoint(bounds, point)
|
||||
}
|
||||
}
|
||||
18
Pods/DDUIKit/DDUIKit/Classes/UICollectionView/DDUICollectionView.swift
generated
Normal file
18
Pods/DDUIKit/DDUIKit/Classes/UICollectionView/DDUICollectionView.swift
generated
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// DDUICollectionView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUICollectionView : UICollectionView {
|
||||
public override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
|
||||
super.init(frame: frame, collectionViewLayout: layout)
|
||||
contentInsetAdjustmentBehavior = .never
|
||||
}
|
||||
|
||||
public required init?(coder: NSCoder) {
|
||||
super.init(coder: coder)
|
||||
}
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UICollectionView/UICollectionView.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UICollectionView/UICollectionView.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UICollectionView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UICollectionViewCell/DDUICollectionViewCell.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UICollectionViewCell/DDUICollectionViewCell.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUICollectionViewCell.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUICollectionViewCell : UICollectionViewCell {
|
||||
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UICollectionViewCell/UICollectionViewCell.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UICollectionViewCell/UICollectionViewCell.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UICollectionViewCell.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
59
Pods/DDUIKit/DDUIKit/Classes/UIColor/UIColor.swift
generated
Normal file
59
Pods/DDUIKit/DDUIKit/Classes/UIColor/UIColor.swift
generated
Normal file
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// UIColor.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIColor {
|
||||
|
||||
/// 添加一个颜色值
|
||||
/// - Parameter string: 颜色值
|
||||
/// - Returns: 颜色
|
||||
public class func dd_hex(_ string: String) -> UIColor {
|
||||
return UIColor(hex: string)
|
||||
}
|
||||
|
||||
/// 添加一个可以根据手机白天和黑色模式切换的颜色
|
||||
/// - Parameters:
|
||||
/// - lightColorString: 白天模式的颜色值
|
||||
/// - darkColorString: 黑夜模式的颜色值
|
||||
/// - Returns: 颜色
|
||||
public class func dd_hex(light lightColorString: String, dark darkColorString: String? = nil) -> UIColor {
|
||||
return UIColor.init { traintCollection in
|
||||
if traintCollection.userInterfaceStyle == .dark {
|
||||
return dd_hex(darkColorString ?? lightColorString)
|
||||
}
|
||||
return dd_hex(lightColorString)
|
||||
}
|
||||
}
|
||||
|
||||
/// Constructing color from hex string
|
||||
///
|
||||
/// - Parameter hex: A hex string, can either contain # or not
|
||||
public convenience init(hex string: String) {
|
||||
var hex = string.hasPrefix("#")
|
||||
? String(string.dropFirst())
|
||||
: string
|
||||
guard hex.count == 3 || hex.count == 6
|
||||
else {
|
||||
self.init(white: 1.0, alpha: 0.0)
|
||||
return
|
||||
}
|
||||
if hex.count == 3 {
|
||||
for (index, char) in hex.enumerated() {
|
||||
hex.insert(char, at: hex.index(hex.startIndex, offsetBy: index * 2))
|
||||
}
|
||||
}
|
||||
|
||||
guard let intCode = Int(hex, radix: 16) else {
|
||||
self.init(white: 1.0, alpha: 0.0)
|
||||
return
|
||||
}
|
||||
|
||||
self.init(
|
||||
red: CGFloat((intCode >> 16) & 0xFF) / 255.0,
|
||||
green: CGFloat((intCode >> 8) & 0xFF) / 255.0,
|
||||
blue: CGFloat((intCode) & 0xFF) / 255.0, alpha: 1.0)}
|
||||
}
|
||||
23
Pods/DDUIKit/DDUIKit/Classes/UIFont/UIFont.swift
generated
Normal file
23
Pods/DDUIKit/DDUIKit/Classes/UIFont/UIFont.swift
generated
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// UIFont.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIFont {
|
||||
|
||||
public class func dd_systemFont(ofSize fontSize: CGFloat, weight: UIFont.Weight = .regular) -> UIFont {
|
||||
return UIFont.systemFont(ofSize: fontSize, weight: weight)
|
||||
}
|
||||
|
||||
/// 返回一个可以跟随手机字体大小变化的字体
|
||||
/// - Parameters:
|
||||
/// - style: 字体类型
|
||||
/// - traitCollection: 手机状态
|
||||
/// - Returns: 字体
|
||||
public class func dd_preferredFont(forTextStyle style: UIFont.TextStyle,compatibleWith traitCollection: UITraitCollection? = nil) -> UIFont {
|
||||
return UIFont.preferredFont(forTextStyle: style,compatibleWith: traitCollection)
|
||||
}
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UIGestureRecognizer/DDUIGestureRecognizer.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UIGestureRecognizer/DDUIGestureRecognizer.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// DDUIGestureRecognizer.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
184
Pods/DDUIKit/DDUIKit/Classes/UIGestureRecognizer/DDUIPanGestureRecognizer.swift
generated
Normal file
184
Pods/DDUIKit/DDUIKit/Classes/UIGestureRecognizer/DDUIPanGestureRecognizer.swift
generated
Normal file
@@ -0,0 +1,184 @@
|
||||
//
|
||||
// DDUIPanGestureRecognizer.swift
|
||||
// DDUIGestureRecognizer
|
||||
// Created by DDIsFriend on 2023/12/19.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIPanGestureRecognizer : UIPanGestureRecognizer {
|
||||
public enum PanGestureFromType {
|
||||
case bottom,top
|
||||
}
|
||||
|
||||
public enum ExpandLevel {
|
||||
case min,`default`,max
|
||||
}
|
||||
|
||||
public struct PanGesValue {
|
||||
/// 从什么位置弹出
|
||||
public var from : PanGestureFromType = .bottom
|
||||
/// 最小显示的高度
|
||||
public var minDisplayHeight : CGFloat = 0
|
||||
/// 默认弹出的高度
|
||||
public var defaultDisplayHeight : CGFloat = 0
|
||||
/// 最大显示的高度
|
||||
public var maxDisplayHeight : CGFloat = 0
|
||||
/// 标记当前需要完全展开时的拖动比例(0,1]
|
||||
public var dragScale : CGFloat = 0.5
|
||||
/// 标记当前是否是展开的状态
|
||||
public var expandLevel : ExpandLevel = .min
|
||||
|
||||
internal var translationY : CGFloat = 0
|
||||
internal var currentY : CGFloat = 0
|
||||
}
|
||||
|
||||
public var panGesValue = PanGesValue.init()
|
||||
|
||||
public var expandLevelChangedHandler : ((_ oldExpandLevel: ExpandLevel, _ newExpandLevel: ExpandLevel) -> Void)?
|
||||
|
||||
/// 会执行默认方法
|
||||
/// - Parameter target: target
|
||||
public init() {
|
||||
super.init(target: nil, action: nil)
|
||||
self.addTarget(self, action: #selector(panGesAction(ges: )))
|
||||
}
|
||||
|
||||
/// 需要自己添加target和action
|
||||
public override init(target: Any?, action: Selector?) {
|
||||
super.init(target: target, action: action)
|
||||
}
|
||||
|
||||
@objc fileprivate func panGesAction(ges: DDUIPanGestureRecognizer) {
|
||||
baseAction(duration: 0.1) { viewFrame, minY, defaultY, maxY, currentY in
|
||||
switch ges.state {
|
||||
case .began:
|
||||
currentY = viewFrame.origin.y
|
||||
break
|
||||
case .changed:
|
||||
/// 拖动时的移动距离是当前changed与上一次changed的差值,即deltaY
|
||||
let translationPoint = ges.translation(in: ges.view)
|
||||
let deltaY = translationPoint.y - ges.panGesValue.translationY
|
||||
ges.panGesValue.translationY = translationPoint.y
|
||||
|
||||
currentY = (viewFrame.origin.y) + deltaY
|
||||
break
|
||||
case .ended:
|
||||
/// 当currentY在maxY和defaultY之间时的临界值
|
||||
let criticalYBetweenOfMaxYAndDefaultY = maxY - (maxY - defaultY) * ges.panGesValue.dragScale
|
||||
if ges.panGesValue.currentY <= maxY && ges.panGesValue.currentY > criticalYBetweenOfMaxYAndDefaultY {
|
||||
currentY = maxY
|
||||
}else if ges.panGesValue.currentY > defaultY && ges.panGesValue.currentY <= criticalYBetweenOfMaxYAndDefaultY {
|
||||
currentY = defaultY
|
||||
}
|
||||
|
||||
/// 当currentY在minY和defaultY之间时
|
||||
let criticalYBetweenOfMinYAndDefaultY = defaultY - (defaultY - minY) * ges.panGesValue.dragScale
|
||||
if ges.panGesValue.currentY <= defaultY && ges.panGesValue.currentY > criticalYBetweenOfMinYAndDefaultY {
|
||||
currentY = defaultY
|
||||
}else if ges.panGesValue.currentY > minY && ges.panGesValue.currentY <= criticalYBetweenOfMinYAndDefaultY {
|
||||
currentY = minY
|
||||
}
|
||||
|
||||
ges.panGesValue.translationY = 0
|
||||
break
|
||||
default:
|
||||
currentY = viewFrame.origin.y
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func baseAction(duration: TimeInterval,baseActionHandler: (_ viewFrame: CGRect, _ minY: CGFloat, _ defaultY: CGFloat, _ maxY: CGFloat,_ currentY: inout CGFloat) -> Void) {
|
||||
guard let superView = view?.superview else {
|
||||
assert(false,"父类都没有,拖什么拖")
|
||||
return
|
||||
}
|
||||
|
||||
let superViewFrame = superView.frame
|
||||
let viewFrame = view?.frame ?? .zero
|
||||
let superViewH = superViewFrame.size.height
|
||||
let viewH = viewFrame.size.height
|
||||
|
||||
switch panGesValue.from {
|
||||
case .bottom:
|
||||
/// 拖动的view的最小y值,这个值和view的高度有关,view的最大y值要和它的superView的最大y值相等,所以minY可能等于deltaH
|
||||
var minY = superViewH - panGesValue.maxDisplayHeight
|
||||
let deltaH = superViewH - viewH
|
||||
if deltaH > minY {
|
||||
minY = deltaH
|
||||
}
|
||||
|
||||
/// 拖动的view的最大y值
|
||||
var maxY = superViewH - panGesValue.minDisplayHeight
|
||||
if deltaH > maxY {
|
||||
maxY = deltaH
|
||||
}
|
||||
|
||||
/// 默认弹出的y值
|
||||
var defaultY = superViewH - panGesValue.defaultDisplayHeight
|
||||
if deltaH > defaultY {
|
||||
defaultY = deltaH
|
||||
}
|
||||
|
||||
var currentY : CGFloat = 0.0
|
||||
|
||||
/// 计算值
|
||||
baseActionHandler(viewFrame,minY,defaultY,maxY,¤tY)
|
||||
|
||||
/// 当到达最小y值时返回
|
||||
if currentY < minY {
|
||||
return
|
||||
}
|
||||
|
||||
/// 当到达最大y值时返回
|
||||
if currentY > maxY {
|
||||
return
|
||||
}
|
||||
|
||||
/// 记录当前的currentY
|
||||
panGesValue.currentY = currentY
|
||||
|
||||
/// 上一次expandLevel
|
||||
let oldExpandLevel = panGesValue.expandLevel
|
||||
|
||||
/// 记录当前的expandLevel
|
||||
if panGesValue.currentY == minY {
|
||||
panGesValue.expandLevel = .max
|
||||
}else if panGesValue.currentY == maxY {
|
||||
panGesValue.expandLevel = .min
|
||||
}else if panGesValue.currentY == defaultY {
|
||||
panGesValue.expandLevel = .default
|
||||
}
|
||||
|
||||
/// 新的expandLevel
|
||||
let newExpandLevel = panGesValue.expandLevel
|
||||
|
||||
/// expandLevel改变时回调
|
||||
if oldExpandLevel != newExpandLevel {
|
||||
if let expandLevelChangedHandler = expandLevelChangedHandler {
|
||||
expandLevelChangedHandler(oldExpandLevel,newExpandLevel)
|
||||
}
|
||||
}
|
||||
|
||||
UIView.animate(withDuration: duration, animations: {[weak self] in
|
||||
self?.view?.frame = CGRectMake(viewFrame.origin.x, currentY, viewFrame.size.width, viewFrame.size.height)
|
||||
})
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
public func expand(_ expand: ExpandLevel) {
|
||||
baseAction(duration: 0.25) { viewFrame, minY, defaultY, maxY, currentY in
|
||||
if expand == .max {
|
||||
currentY = minY
|
||||
}else if expand == .min {
|
||||
currentY = maxY
|
||||
}else if expand == .default {
|
||||
currentY = defaultY
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UIGestureRecognizer/UIGestureRecognizer.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UIGestureRecognizer/UIGestureRecognizer.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// UIGestureRecognizer.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIGestureRecognizer : UITapGestureRecognizer {
|
||||
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UIImage/DDUIImage.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UIImage/DDUIImage.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUIImage.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIImage : UIImage {
|
||||
|
||||
}
|
||||
193
Pods/DDUIKit/DDUIKit/Classes/UIImage/UIImage.swift
generated
Normal file
193
Pods/DDUIKit/DDUIKit/Classes/UIImage/UIImage.swift
generated
Normal file
@@ -0,0 +1,193 @@
|
||||
//
|
||||
// UIImage.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
// MARK: Compress
|
||||
public extension UIImage {
|
||||
|
||||
/// 图片压缩方法
|
||||
/// - Parameter bytes: 要压缩成的大小
|
||||
/// - Returns: 图片的data
|
||||
/// - warning: 图片的压缩不是无止尽的,一定是有一个极限,当到达极限时可能会一直循环下去,所以请注意.
|
||||
func dd_compress(bytes: Int) -> Data? {
|
||||
let maxBytes = bytes
|
||||
var compressionQuality : CGFloat = 1.0
|
||||
guard var data = UIImageJPEGRepresentation(self, compressionQuality) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
if data.count < maxBytes {
|
||||
return data
|
||||
}
|
||||
|
||||
var max : CGFloat = 1.0
|
||||
var min : CGFloat = 0.0
|
||||
for _ in 0..<6 {
|
||||
compressionQuality = (max + min) / 2
|
||||
guard let compressData = UIImageJPEGRepresentation(self, compressionQuality) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
data = compressData
|
||||
|
||||
if CGFloat(data.count) < CGFloat(maxBytes) * 0.9 {
|
||||
min = compressionQuality
|
||||
}else if data.count > maxBytes {
|
||||
max = compressionQuality
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if data.count < maxBytes {
|
||||
return data
|
||||
}
|
||||
|
||||
var dataCount : Int = 0
|
||||
/// 至多循环100次
|
||||
var loopCount = 0
|
||||
while data.count > maxBytes && data.count != dataCount && loopCount < 100 {
|
||||
loopCount+=1
|
||||
|
||||
dataCount = data.count
|
||||
let ratio : Float = Float(maxBytes) / Float(dataCount)
|
||||
let size : CGSize = CGSizeMake(self.size.width * CGFloat(sqrtf(ratio)), self.size.height * CGFloat(sqrtf(ratio)))
|
||||
UIGraphicsBeginImageContext(size)
|
||||
self.draw(in: CGRectMake(0, 0, size.width, size.height))
|
||||
let resultImage : UIImage? = UIGraphicsGetImageFromCurrentImageContext()
|
||||
UIGraphicsEndImageContext()
|
||||
if let resultImage,let resultData = UIImageJPEGRepresentation(resultImage, compressionQuality) {
|
||||
data = resultData
|
||||
}else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return data
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: WaterMark
|
||||
public extension UIImage {
|
||||
|
||||
/// 图片水印方法
|
||||
/// - Parameters:
|
||||
/// - attributedString: 富文本
|
||||
/// - rect: 富文本的rect
|
||||
/// - Returns: 生成失败的话会返回原图
|
||||
/// - Warning: 先通过boundingRect计算富文本的尺寸,然后再计算富文本在图片中的位置
|
||||
func dd_addWaterMarkWith(attributedString: NSAttributedString, rect: CGRect) -> UIImage {
|
||||
UIGraphicsBeginImageContextWithOptions(size, true, scale)
|
||||
draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: size))
|
||||
attributedString.draw(in: rect)
|
||||
let resultImage = UIGraphicsGetImageFromCurrentImageContext()
|
||||
UIGraphicsEndImageContext()
|
||||
return resultImage ?? self
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: LoadImageWithTrait
|
||||
public extension UIImage {
|
||||
@available(iOS 12.0, *)
|
||||
static func dd_imageWithUserInerfaceStyle(lightImage: UIImage?, darkImage: UIImage?) -> UIImage? {
|
||||
let imageAsset = UIImageAsset()
|
||||
if let lightImage {
|
||||
imageAsset.register(lightImage, with: UITraitCollection(userInterfaceStyle: .light))
|
||||
}
|
||||
if let darkImage {
|
||||
imageAsset.register(darkImage, with: UITraitCollection(userInterfaceStyle: .dark))
|
||||
}
|
||||
return imageAsset.image(with: UITraitCollection(userInterfaceStyle: .unspecified))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: LoadImageWithImageBundle
|
||||
public extension UIImage {
|
||||
|
||||
/// 加载图片,此方法加载的图片在应用生命周期内无法销毁
|
||||
/// - Parameters:
|
||||
/// - named: 图片名称
|
||||
/// - aClass: 调用此方法的类
|
||||
/// - bundleName: 与调用类所关联的bundle名称
|
||||
convenience init?(named: String, bundleName: String?, aClass: AnyClass) {
|
||||
var bundlePath = Bundle.main.bundlePath
|
||||
if let bundleName {
|
||||
bundlePath = Bundle(for: aClass.self).bundlePath.appending("/\(bundleName).bundle")
|
||||
}
|
||||
let bundle = Bundle.init(path: bundlePath)
|
||||
if #available(iOS 12.0, *) {
|
||||
self.init(named: named, in: bundle, compatibleWith: UITraitCollection(userInterfaceStyle: .unspecified))
|
||||
}else{
|
||||
self.init(named: named, in: bundle, compatibleWith: nil)
|
||||
}
|
||||
}
|
||||
|
||||
/// pathForResource加载图片的方法,此方法加载的图片可以在内存中被销毁
|
||||
/// - Parameters:
|
||||
/// - forResource: 资源名称
|
||||
/// - ofType: 类型
|
||||
/// - aClass: 调用此方法的类
|
||||
/// - bundleName: 与调用类所关联的bundle名称
|
||||
/// - Warning: 此方法加载图片无法适配userInterfaceStyle
|
||||
convenience init?(forResource: String, ofType: String? = nil, bundleName: String?, aClass: AnyClass) {
|
||||
var bundlePath = Bundle.main.bundlePath
|
||||
if let bundleName {
|
||||
bundlePath = Bundle(for: aClass.self).bundlePath.appending("/\(bundleName).bundle")
|
||||
}
|
||||
let bundle = Bundle.init(path: bundlePath)
|
||||
|
||||
/// 如果是gif图的话
|
||||
let gif = "gif"
|
||||
|
||||
if forResource.hasSuffix(".\(gif)") == true || ofType == gif {
|
||||
var url : URL?
|
||||
if forResource.hasSuffix(".\(gif)") == true {
|
||||
url = bundle?.url(forResource: forResource, withExtension: nil)
|
||||
}else if ofType == gif {
|
||||
url = bundle?.url(forResource: forResource, withExtension: ".\(gif)")
|
||||
}
|
||||
if let url, let data = try? Data(contentsOf: url) {
|
||||
self.init(data: data)
|
||||
}else{
|
||||
self.init(named: "")
|
||||
}
|
||||
}else if let path = bundle?.path(forResource: forResource, ofType: ofType) {
|
||||
self.init(contentsOfFile: path)
|
||||
}else{
|
||||
self.init(named: "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: QRCode
|
||||
public extension UIImage {
|
||||
static func dd_generatorQRCode(content: String, size: CGFloat) -> UIImage? {
|
||||
let filter = CIFilter(name: "CIQRCodeGenerator")
|
||||
filter?.setDefaults()
|
||||
filter?.setValue(content.data(using: .utf8), forKey: "inputMessage")
|
||||
return dd_generatorHDUIImageFromCGImage(filter?.outputImage ?? CIImage(), size: size)
|
||||
}
|
||||
|
||||
private static func dd_generatorHDUIImageFromCGImage(_ ciImage: CIImage, size: CGFloat) -> UIImage? {
|
||||
let extent = ciImage.extent.integral
|
||||
let scale = min(size / extent.width, size / extent.height)
|
||||
|
||||
let width: size_t = size_t(extent.width * scale)
|
||||
let height: size_t = size_t(extent.height * scale)
|
||||
let cs: CGColorSpace = CGColorSpaceCreateDeviceGray()
|
||||
let bitmap: CGContext = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: cs, bitmapInfo: 1)!
|
||||
|
||||
let context = CIContext.init()
|
||||
let bitmapImage = context.createCGImage(ciImage, from: extent)
|
||||
bitmap.interpolationQuality = .none
|
||||
bitmap.scaleBy(x: scale, y: scale)
|
||||
bitmap.draw(bitmapImage!, in: extent)
|
||||
|
||||
let scaledImage = bitmap.makeImage()
|
||||
return UIImage.init(cgImage: scaledImage!)
|
||||
}
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UIImageView/DDUIImageView.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UIImageView/DDUIImageView.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUIImageView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/19.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIImageView : UIImageView {
|
||||
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UIImageView/UIImageView.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UIImageView/UIImageView.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// UIImageView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/19.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIImageView {
|
||||
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UILabel/DDUILabel.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UILabel/DDUILabel.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUILabel.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUILabel : UILabel {
|
||||
|
||||
}
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UILabel/UILabel.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UILabel/UILabel.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// UILabel.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UILabel {
|
||||
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UINavigationBar/DDUINavigationBar.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UINavigationBar/DDUINavigationBar.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// DDUINavigationBar.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
152
Pods/DDUIKit/DDUIKit/Classes/UINavigationBar/UINavigationBar.swift
generated
Normal file
152
Pods/DDUIKit/DDUIKit/Classes/UINavigationBar/UINavigationBar.swift
generated
Normal file
@@ -0,0 +1,152 @@
|
||||
//
|
||||
// UINavigationBar.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
public extension UINavigationBar {
|
||||
static func dd_methodSwizzlingUINavigationBar() {
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(setter: UINavigationBar.barTintColor), swizzledSelector: #selector(self.dd_setBarTintColor(navigationBarBackgroundColor:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UINavigationBar.setBackgroundImage(_:for:barMetrics:)), swizzledSelector: #selector(self.dd_setBackgroundImage(_:for:barMetrics:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UINavigationBar.setBackgroundImage(_:for:)), swizzledSelector: #selector(self.dd_setBackgroundImage(_:for:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(setter: UINavigationBar.shadowImage), swizzledSelector: #selector(self.dd_setShadowImage(shadowImage:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(setter: UINavigationBar.titleTextAttributes), swizzledSelector: #selector(self.dd_setTitleTextAttributes(navigationBarTitleTextAttributes:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(setter: UINavigationBar.backIndicatorImage), swizzledSelector: #selector(self.dd_setBackIndicatorImage(backIndicatorImage:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(setter: UINavigationBar.backIndicatorTransitionMaskImage), swizzledSelector: #selector(self.dd_setBackIndicatorTransitionMaskImage(backIndicatorTransitionMaskImage:)))
|
||||
if #available(iOS 13.0, *) {
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(setter: UINavigationBar.standardAppearance), swizzledSelector: #selector(self.dd_setStandardAppearance(standardAppearance:)))
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setBarTintColor(navigationBarBackgroundColor: UIColor?) {
|
||||
dd_saveBarBackgroundColor(navigationBarBackgroundColor:navigationBarBackgroundColor)
|
||||
dd_setBarTintColor(navigationBarBackgroundColor:navigationBarBackgroundColor)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setBackgroundImage(_ backgroundImage: UIImage?, for barPosition: UIBarPosition, barMetrics: UIBarMetrics) {
|
||||
dd_saveBarBackgroundImage(navigationBarBackgroundImage: backgroundImage)
|
||||
dd_setBackgroundImage(backgroundImage, for: barPosition, barMetrics: barMetrics)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setBackgroundImage(_ backgroundImage: UIImage?, for barMetrics: UIBarMetrics) {
|
||||
dd_saveBarBackgroundImage(navigationBarBackgroundImage: backgroundImage)
|
||||
dd_setBackgroundImage(backgroundImage, for: barMetrics)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setTitleTextAttributes(navigationBarTitleTextAttributes: Dictionary<NSAttributedStringKey,Any>) {
|
||||
dd_saveBarTitleTextAttributes(navigationBarTitleTextAttributes: navigationBarTitleTextAttributes)
|
||||
dd_setTitleTextAttributes(navigationBarTitleTextAttributes: navigationBarTitleTextAttributes)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setShadowImage(shadowImage: UIImage?) {
|
||||
dd_saveShadowImage(shadowImage: shadowImage)
|
||||
dd_setShadowImage(shadowImage: shadowImage)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setBackIndicatorImage(backIndicatorImage: UIImage?) {
|
||||
dd_saveBackIndicatorImage(backIndicatorImage: backIndicatorImage)
|
||||
dd_setBackIndicatorImage(backIndicatorImage: backIndicatorImage)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setBackIndicatorTransitionMaskImage(backIndicatorTransitionMaskImage: UIImage?) {
|
||||
dd_saveBackIndicatorTransitionMaskImage(backIndicatorTransitionMaskImage: backIndicatorTransitionMaskImage)
|
||||
dd_setBackIndicatorTransitionMaskImage(backIndicatorTransitionMaskImage: backIndicatorTransitionMaskImage)
|
||||
}
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
@objc
|
||||
func dd_setStandardAppearance(standardAppearance: UINavigationBarAppearance) {
|
||||
dd_saveBarBackgroundColor(navigationBarBackgroundColor: standardAppearance.backgroundColor)
|
||||
dd_saveBarBackgroundImage(navigationBarBackgroundImage: standardAppearance.backgroundImage)
|
||||
dd_setStandardAppearance(standardAppearance: standardAppearance)
|
||||
}
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
@objc
|
||||
func dd_setCompactAppearance(compactAppearance: UINavigationBarAppearance) {
|
||||
dd_saveBarBackgroundColor(navigationBarBackgroundColor: compactAppearance.backgroundColor)
|
||||
dd_saveBarBackgroundImage(navigationBarBackgroundImage: compactAppearance.backgroundImage)
|
||||
dd_setCompactAppearance(compactAppearance: compactAppearance)
|
||||
}
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
@objc
|
||||
func dd_setScrollEdgeAppearance(scrollEdgeAppearance: UINavigationBarAppearance) {
|
||||
dd_saveBarBackgroundColor(navigationBarBackgroundColor: scrollEdgeAppearance.backgroundColor)
|
||||
dd_saveBarBackgroundImage(navigationBarBackgroundImage: scrollEdgeAppearance.backgroundImage)
|
||||
dd_setScrollEdgeAppearance(scrollEdgeAppearance: scrollEdgeAppearance)
|
||||
}
|
||||
|
||||
@available(iOS 15.0, *)
|
||||
@objc
|
||||
func dd_setCompactScrollEdgeAppearance(compactScrollEdgeAppearance: UINavigationBarAppearance) {
|
||||
dd_saveBarBackgroundColor(navigationBarBackgroundColor: compactScrollEdgeAppearance.backgroundColor)
|
||||
dd_saveBarBackgroundImage(navigationBarBackgroundImage: compactScrollEdgeAppearance.backgroundImage)
|
||||
dd_setCompactScrollEdgeAppearance(compactScrollEdgeAppearance: compactScrollEdgeAppearance)
|
||||
}
|
||||
|
||||
func dd_saveBarBackgroundColor(navigationBarBackgroundColor: UIColor?) {
|
||||
guard let navigationController = delegate as? UINavigationController, let viewController = navigationController.topViewController else {
|
||||
return
|
||||
}
|
||||
if viewController.responds(to: #selector(UIViewController.dd_setAssociatedNavigationBarBackgroundColor(navigationBarBackgroundColor:))) == true {
|
||||
viewController.dd_setAssociatedNavigationBarBackgroundColor(navigationBarBackgroundColor: navigationBarBackgroundColor)
|
||||
}
|
||||
}
|
||||
|
||||
func dd_saveBarBackgroundImage(navigationBarBackgroundImage: UIImage?) {
|
||||
guard let navigationController = delegate as? UINavigationController, let viewController = navigationController.topViewController else {
|
||||
return
|
||||
}
|
||||
if viewController.responds(to: #selector(UIViewController.dd_setAssociatedNavigationBarBackgroundImage(navigationBarBackgroundImage:))) == true {
|
||||
viewController.dd_setAssociatedNavigationBarBackgroundImage(navigationBarBackgroundImage:navigationBarBackgroundImage)
|
||||
}
|
||||
}
|
||||
|
||||
func dd_saveBarTitleTextAttributes(navigationBarTitleTextAttributes: Dictionary<NSAttributedStringKey,Any>) {
|
||||
guard let navigationController = delegate as? UINavigationController, let viewController = navigationController.topViewController else {
|
||||
return
|
||||
}
|
||||
if viewController.responds(to: #selector(UIViewController.dd_setAssociatedNavigationBarTitleTextAttributes(navigationBarTitleTextAttributes:))) {
|
||||
viewController.dd_setAssociatedNavigationBarTitleTextAttributes(navigationBarTitleTextAttributes: navigationBarTitleTextAttributes)
|
||||
}
|
||||
}
|
||||
|
||||
func dd_saveShadowImage(shadowImage: UIImage?) {
|
||||
guard let navigationController = delegate as? UINavigationController, let viewController = navigationController.topViewController else {
|
||||
return
|
||||
}
|
||||
if viewController.responds(to: #selector(UIViewController.dd_setAssociatedNavigationBarShadowImage(navigationBarShadowImage:))) == true {
|
||||
viewController.dd_setAssociatedNavigationBarShadowImage(navigationBarShadowImage: shadowImage)
|
||||
}
|
||||
}
|
||||
|
||||
func dd_saveBackIndicatorImage(backIndicatorImage: UIImage?) {
|
||||
guard let navigationController = delegate as? UINavigationController, let viewController = navigationController.topViewController else {
|
||||
return
|
||||
}
|
||||
if viewController.responds(to: #selector(UIViewController.dd_setAssociatedBackIndicatorImage(backIndicatorImage:))) == true {
|
||||
viewController.dd_setAssociatedBackIndicatorImage(backIndicatorImage: backIndicatorImage)
|
||||
}
|
||||
}
|
||||
|
||||
func dd_saveBackIndicatorTransitionMaskImage(backIndicatorTransitionMaskImage: UIImage?) {
|
||||
guard let navigationController = delegate as? UINavigationController, let viewController = navigationController.topViewController else {
|
||||
return
|
||||
}
|
||||
if viewController.responds(to: #selector(UIViewController.dd_setAssociatedBackIndicatorImageTransitionMaskImage(backIndicatorTransitionMaskImage:))) == true {
|
||||
viewController.dd_setAssociatedBackIndicatorImageTransitionMaskImage(backIndicatorTransitionMaskImage: backIndicatorTransitionMaskImage)
|
||||
}
|
||||
}
|
||||
}
|
||||
37
Pods/DDUIKit/DDUIKit/Classes/UINavigationController/DDUINavigationController.swift
generated
Normal file
37
Pods/DDUIKit/DDUIKit/Classes/UINavigationController/DDUINavigationController.swift
generated
Normal file
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// DDUINavigationController.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUINavigationController : UINavigationController {
|
||||
open override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
dd_addScreenEdgePanGestureRecognizer()
|
||||
}
|
||||
|
||||
// MARK: UIStatusBarStyle
|
||||
open override var childViewControllerForStatusBarStyle: UIViewController? {
|
||||
return topViewController
|
||||
}
|
||||
|
||||
open override var childViewControllerForStatusBarHidden: UIViewController? {
|
||||
return topViewController
|
||||
}
|
||||
|
||||
|
||||
// MARK: Orientations
|
||||
open override var shouldAutorotate: Bool {
|
||||
return topViewController?.shouldAutorotate ?? false
|
||||
}
|
||||
|
||||
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
|
||||
return topViewController?.supportedInterfaceOrientations ?? .portrait
|
||||
}
|
||||
|
||||
open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
|
||||
return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
|
||||
}
|
||||
}
|
||||
151
Pods/DDUIKit/DDUIKit/Classes/UINavigationController/UINavigationController.swift
generated
Normal file
151
Pods/DDUIKit/DDUIKit/Classes/UINavigationController/UINavigationController.swift
generated
Normal file
@@ -0,0 +1,151 @@
|
||||
//
|
||||
// UINavigationController.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
// MARK: MethodSwizzling
|
||||
public extension UINavigationController {
|
||||
static func dd_methodSwizzlingUINavigationController() {
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UINavigationController.pushViewController(_:animated:)), swizzledSelector: #selector(self.dd_pushViewController(_:animated:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UINavigationController.popViewController(animated:)), swizzledSelector: #selector(self.dd_popViewController(animated:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UINavigationController.popToRootViewController(animated:)), swizzledSelector: #selector(self.dd_popToRootViewController(animated:)))
|
||||
}
|
||||
|
||||
@objc func dd_pushViewController(_ controller: UIViewController, animated: Bool) {
|
||||
view.endEditing(true)
|
||||
dd_endEditingAtController(topViewController)
|
||||
if dd_hidesBottomBarWhenPushed == true {
|
||||
dd_hidesBottomBarWhenPushedAtChildController(controller)
|
||||
}
|
||||
dd_pushViewController(controller, animated: animated)
|
||||
}
|
||||
|
||||
@objc func dd_popViewController(animated: Bool) -> UIViewController? {
|
||||
view.endEditing(true)
|
||||
let vc = dd_popViewController(animated: animated)
|
||||
dd_endEditingAtController(vc)
|
||||
return vc
|
||||
}
|
||||
|
||||
@objc func dd_popToRootViewController(animated: Bool) -> [UIViewController]? {
|
||||
view.endEditing(true)
|
||||
let vcs = dd_popToRootViewController(animated: animated)
|
||||
dd_endEditingAtController(vcs?.last)
|
||||
return vcs
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: AssociatedKey
|
||||
extension UINavigationController {
|
||||
struct DDUINavigationControllerKey {
|
||||
static var hidesBottomBarWhenPushed : UInt8 = 1 << 0
|
||||
static var screenEdgePanGestureRecognizer : UInt8 = 1 << 1
|
||||
static var percentDrivenInteractiveTransition : UInt8 = 1 << 2
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Push optimise
|
||||
public extension UINavigationController {
|
||||
var dd_hidesBottomBarWhenPushed : Bool {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDUINavigationControllerKey.hidesBottomBarWhenPushed) as? Bool) ?? false
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUINavigationControllerKey.hidesBottomBarWhenPushed, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
/// push控制器时,需要将当前view的键盘去掉
|
||||
func dd_endEditingAtController(_ controller: UIViewController?) {
|
||||
controller?.view.endEditing(true)
|
||||
}
|
||||
|
||||
/// push控制器时,需要将子控制器的tabbar去掉
|
||||
func dd_hidesBottomBarWhenPushedAtChildController(_ controller: UIViewController?) {
|
||||
if viewControllers.count > 1 {
|
||||
controller?.hidesBottomBarWhenPushed = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: ScreenEdgePanGestureRecognizer
|
||||
extension UINavigationController {
|
||||
public var dd_screenEdgePanGestureRecognizer : UIScreenEdgePanGestureRecognizer? {
|
||||
get {
|
||||
objc_getAssociatedObject(self, &DDUINavigationControllerKey.screenEdgePanGestureRecognizer) as? UIScreenEdgePanGestureRecognizer
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUINavigationControllerKey.screenEdgePanGestureRecognizer, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
public var dd_percentDrivenInteractiveTransition : UIPercentDrivenInteractiveTransition? {
|
||||
get {
|
||||
objc_getAssociatedObject(self, &DDUINavigationControllerKey.percentDrivenInteractiveTransition) as? UIPercentDrivenInteractiveTransition
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUINavigationControllerKey.percentDrivenInteractiveTransition, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
public func dd_addScreenEdgePanGestureRecognizer() {
|
||||
dd_screenEdgePanGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(dd_panGestureRecognizerToPop))
|
||||
dd_screenEdgePanGestureRecognizer?.edges = .left
|
||||
guard let dd_screenEdgePanGestureRecognizer else {
|
||||
return
|
||||
}
|
||||
view.addGestureRecognizer(dd_screenEdgePanGestureRecognizer)
|
||||
|
||||
delegate = self
|
||||
interactivePopGestureRecognizer?.isEnabled = false
|
||||
}
|
||||
|
||||
@objc public func dd_panGestureRecognizerToPop(ges:UIPanGestureRecognizer) {
|
||||
if ges.state == .began {
|
||||
if viewControllers.count == 1 {
|
||||
return
|
||||
}
|
||||
|
||||
dd_percentDrivenInteractiveTransition = UIPercentDrivenInteractiveTransition()
|
||||
popViewController(animated: true)
|
||||
}
|
||||
|
||||
let progress : CGFloat = ges.translation(in: view).x / view.frame.size.width
|
||||
|
||||
if ges.state == .changed {
|
||||
dd_percentDrivenInteractiveTransition?.update(progress)
|
||||
}else if ges.state == .ended || ges.state == .cancelled {
|
||||
if progress >= 0.5 {
|
||||
dd_percentDrivenInteractiveTransition?.finish()
|
||||
}else{
|
||||
dd_percentDrivenInteractiveTransition?.cancel()
|
||||
}
|
||||
dd_percentDrivenInteractiveTransition = nil
|
||||
}else if ges.state == .failed {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
public func dd_screenEdgePanGestureRecognizerEnable(_ isEnable: Bool) {
|
||||
dd_screenEdgePanGestureRecognizer?.isEnabled = isEnable
|
||||
}
|
||||
}
|
||||
|
||||
extension UINavigationController : UINavigationControllerDelegate{
|
||||
public func navigationController(_ navigationController: UINavigationController, interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
|
||||
return dd_percentDrivenInteractiveTransition
|
||||
}
|
||||
|
||||
public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
|
||||
if operation == .push {
|
||||
return DDFullScreenTransition.init(transitionType: .push)
|
||||
}
|
||||
if operation == .pop {
|
||||
return DDFullScreenTransition.init(transitionType: .pop)
|
||||
}
|
||||
return DDFullScreenTransition.init(transitionType: .none)
|
||||
}
|
||||
}
|
||||
23
Pods/DDUIKit/DDUIKit/Classes/UIResponder/UIResponder.swift
generated
Normal file
23
Pods/DDUIKit/DDUIKit/Classes/UIResponder/UIResponder.swift
generated
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// UIResponder.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIResponder {
|
||||
class func dd_methodSwizzling(targetClass: AnyClass,originalSelector: Selector, swizzledSelector: Selector) {
|
||||
let originalMethod = class_getInstanceMethod(targetClass, originalSelector)
|
||||
let swizzledMethod = class_getInstanceMethod(targetClass, swizzledSelector)
|
||||
|
||||
if let originalMethod, let swizzledMethod {
|
||||
let result = class_addMethod(targetClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
|
||||
if result == true {
|
||||
class_replaceMethod(targetClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
|
||||
}else{
|
||||
method_exchangeImplementations(originalMethod, swizzledMethod)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
18
Pods/DDUIKit/DDUIKit/Classes/UIScrollView/DDUIScrollView.swift
generated
Normal file
18
Pods/DDUIKit/DDUIKit/Classes/UIScrollView/DDUIScrollView.swift
generated
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// DDUIScrollView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIScrollView : UIScrollView {
|
||||
public override init(frame: CGRect) {
|
||||
super.init(frame: frame)
|
||||
contentInsetAdjustmentBehavior = .never
|
||||
}
|
||||
|
||||
public required init?(coder: NSCoder) {
|
||||
super.init(coder: coder)
|
||||
}
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UIScrollView/UIScrollView.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UIScrollView/UIScrollView.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UIScrollView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UISwitch/DDUISwitch.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UISwitch/DDUISwitch.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUISwitch.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUISwitch : UISwitch {
|
||||
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UISwitch/UISwitch.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UISwitch/UISwitch.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UISwitch.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
35
Pods/DDUIKit/DDUIKit/Classes/UITableBarController/DDUITabBarController.swift
generated
Normal file
35
Pods/DDUIKit/DDUIKit/Classes/UITableBarController/DDUITabBarController.swift
generated
Normal file
@@ -0,0 +1,35 @@
|
||||
//
|
||||
// DDUITabBarController.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUITabBarController : UITabBarController {
|
||||
open override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
}
|
||||
|
||||
// MARK: UIStatusBarStyle
|
||||
open override var childViewControllerForStatusBarStyle: UIViewController? {
|
||||
return selectedViewController
|
||||
}
|
||||
|
||||
open override var childViewControllerForStatusBarHidden: UIViewController? {
|
||||
return selectedViewController
|
||||
}
|
||||
|
||||
// MARK: Orientations
|
||||
open override var shouldAutorotate: Bool {
|
||||
return selectedViewController?.shouldAutorotate ?? false
|
||||
}
|
||||
|
||||
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
|
||||
return selectedViewController?.supportedInterfaceOrientations ?? .portrait
|
||||
}
|
||||
|
||||
open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
|
||||
return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
|
||||
}
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UITableBarController/UITabBarController.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UITableBarController/UITabBarController.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UITabBarController.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
24
Pods/DDUIKit/DDUIKit/Classes/UITableView/DDUITableView.swift
generated
Normal file
24
Pods/DDUIKit/DDUIKit/Classes/UITableView/DDUITableView.swift
generated
Normal file
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// DDUITableView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUITableView : UITableView {
|
||||
|
||||
public override init(frame: CGRect, style: UITableViewStyle) {
|
||||
super.init(frame: frame, style: style)
|
||||
contentInsetAdjustmentBehavior = .never
|
||||
separatorStyle = .none
|
||||
|
||||
if #available(iOS 15.0, *) {
|
||||
sectionHeaderTopPadding = 0
|
||||
}
|
||||
}
|
||||
|
||||
public required init?(coder: NSCoder) {
|
||||
super.init(coder: coder)
|
||||
}
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UITableView/UITableView.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UITableView/UITableView.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UITableView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UITableViewCell/DDUITableViewCell.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UITableViewCell/DDUITableViewCell.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUITableViewCell.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUITableViewCell : UITableViewCell {
|
||||
|
||||
}
|
||||
7
Pods/DDUIKit/DDUIKit/Classes/UITableViewCell/UITableViewCell.swift
generated
Normal file
7
Pods/DDUIKit/DDUIKit/Classes/UITableViewCell/UITableViewCell.swift
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// UITableViewCell.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UITextField/DDUITextField.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UITextField/DDUITextField.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUITextField.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUITextField : UITextField {
|
||||
|
||||
}
|
||||
5
Pods/DDUIKit/DDUIKit/Classes/UITextField/UITextField.swift
generated
Normal file
5
Pods/DDUIKit/DDUIKit/Classes/UITextField/UITextField.swift
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
//
|
||||
// UITextField.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UITextView/DDUITextView.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UITextView/DDUITextView.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUITextView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUITextView : UITextView {
|
||||
|
||||
}
|
||||
5
Pods/DDUIKit/DDUIKit/Classes/UITextView/UITextView.swift
generated
Normal file
5
Pods/DDUIKit/DDUIKit/Classes/UITextView/UITextView.swift
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
//
|
||||
// UITextView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
11
Pods/DDUIKit/DDUIKit/Classes/UIView/DDUIView.swift
generated
Normal file
11
Pods/DDUIKit/DDUIKit/Classes/UIView/DDUIView.swift
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// DDUIView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/19.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIView : UIView {
|
||||
|
||||
}
|
||||
101
Pods/DDUIKit/DDUIKit/Classes/UIView/UIView.swift
generated
Normal file
101
Pods/DDUIKit/DDUIKit/Classes/UIView/UIView.swift
generated
Normal file
@@ -0,0 +1,101 @@
|
||||
//
|
||||
// UIView.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/19.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIView {
|
||||
fileprivate struct DDUIViewAssociatedKey {
|
||||
static var x : UInt8 = 1 << 0
|
||||
static var y : UInt8 = 1 << 1
|
||||
static var width : UInt8 = 1 << 2
|
||||
static var height : UInt8 = 1 << 3
|
||||
}
|
||||
|
||||
public var dd_x : CGFloat {
|
||||
get {
|
||||
(objc_getAssociatedObject(self, &DDUIViewAssociatedKey.x) as? CGFloat) ?? 0.0
|
||||
}
|
||||
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUIViewAssociatedKey.x, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
public var dd_y : CGFloat {
|
||||
get {
|
||||
(objc_getAssociatedObject(self, &DDUIViewAssociatedKey.y) as? CGFloat) ?? 0.0
|
||||
}
|
||||
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUIViewAssociatedKey.y, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
public var dd_width : CGFloat {
|
||||
get {
|
||||
(objc_getAssociatedObject(self, &DDUIViewAssociatedKey.width) as? CGFloat) ?? 0.0
|
||||
}
|
||||
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUIViewAssociatedKey.width, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
public var dd_height : CGFloat {
|
||||
get {
|
||||
(objc_getAssociatedObject(self, &DDUIViewAssociatedKey.height) as? CGFloat) ?? 0.0
|
||||
}
|
||||
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUIViewAssociatedKey.height, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension UIView {
|
||||
/// 当前view所属的控制器
|
||||
public var dd_currentViewController : UIViewController? {
|
||||
return UIView.dd_viewControllerOfView(view: self)
|
||||
}
|
||||
|
||||
/// 返回view
|
||||
public class func dd_viewControllerOfView(view: UIView) -> UIViewController? {
|
||||
let responder = view as UIResponder
|
||||
while let nextResponder = responder.next {
|
||||
if nextResponder.isKind(of: UIViewController.self) == true {
|
||||
return nextResponder as? UIViewController
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
/// 给view添加tap
|
||||
extension UIView {
|
||||
internal struct DDUITapGestureRecognizerAssociatedObject {
|
||||
static var tapActionHandler : UInt8 = 1 << 0
|
||||
}
|
||||
|
||||
internal var tapActionHandler : () -> Void {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDUITapGestureRecognizerAssociatedObject.tapActionHandler) as? () -> Void) ?? {}
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUITapGestureRecognizerAssociatedObject.tapActionHandler, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
public func dd_addTapGesture(actionHandler: @escaping () -> Void) {
|
||||
tapActionHandler = actionHandler
|
||||
let tapGes = UITapGestureRecognizer.init(target: self, action: #selector(tapAction))
|
||||
addGestureRecognizer(tapGes)
|
||||
}
|
||||
|
||||
@objc private func tapAction() {
|
||||
tapActionHandler()
|
||||
}
|
||||
}
|
||||
|
||||
51
Pods/DDUIKit/DDUIKit/Classes/UIViewController/DDUIViewController.swift
generated
Normal file
51
Pods/DDUIKit/DDUIKit/Classes/UIViewController/DDUIViewController.swift
generated
Normal file
@@ -0,0 +1,51 @@
|
||||
//
|
||||
// DDUIViewController.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDUIViewController : UIViewController {
|
||||
/// 默认返回上一页,可以自定义
|
||||
public lazy var backButtonHandler : (() -> Void) = {[weak self] in
|
||||
self?.navigationController?.popViewController(animated: true)
|
||||
}
|
||||
|
||||
open override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
addBackButton()
|
||||
}
|
||||
|
||||
/// navigationController在viewDidLoad及之前都还未被赋值,在viewWillAppear开始才有值
|
||||
open func addBackButton(handler: (() -> Void)? = nil) {
|
||||
if let handler {
|
||||
backButtonHandler = handler
|
||||
}
|
||||
/// 第一个页面不需要返回按钮
|
||||
if navigationController?.viewControllers.count == nil || navigationController?.viewControllers.count == 1 {
|
||||
}else{
|
||||
/// 这里自定义按钮后,导航栏的interactivePopGestureRecognizer就会失效
|
||||
navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "chevron.backward")?.withRenderingMode(.alwaysOriginal).withTintColor(UIColor.init(dynamicProvider: { traintCollection in
|
||||
return traintCollection.userInterfaceStyle == .light ? .black : .white
|
||||
})), style: .plain, target: self, action: #selector(self.backButtonDefaultAction))
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func backButtonDefaultAction() {
|
||||
backButtonHandler()
|
||||
}
|
||||
|
||||
// MARK: Orientations
|
||||
open override var shouldAutorotate: Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
|
||||
return .portrait
|
||||
}
|
||||
|
||||
open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
|
||||
return .portrait
|
||||
}
|
||||
}
|
||||
289
Pods/DDUIKit/DDUIKit/Classes/UIViewController/UIViewController.swift
generated
Normal file
289
Pods/DDUIKit/DDUIKit/Classes/UIViewController/UIViewController.swift
generated
Normal file
@@ -0,0 +1,289 @@
|
||||
//
|
||||
// UIViewController.swift
|
||||
// DDUIKit
|
||||
// Created by ddisfriend on 2024/4/18.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIViewController {
|
||||
fileprivate struct DDUIViewControllerKey {
|
||||
static var navigationBarBackgroundColor : UInt8 = 1 << 0
|
||||
static var navigationBarBackgroundImage : UInt8 = 1 << 1
|
||||
static var navigationBarShadowColor : UInt8 = 1 << 2
|
||||
static var navigationBarShadowImage : UInt8 = 1 << 3
|
||||
static var navigationBarTitleTextAttributes : UInt8 = 1 << 4
|
||||
static var navigationBarBarButtonItemAttributes : UInt8 = 1 << 5
|
||||
static var backIndicatorImage : UInt8 = 1 << 6
|
||||
static var backIndicatorTransitionMaskImage : UInt8 = 1 << 7
|
||||
static var backButtonTitle : UInt8 = 1 << 8
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: MethodSwizzling
|
||||
public extension UIViewController {
|
||||
static func dd_methodSwizzlingUIViewController() {
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.loadView), swizzledSelector: #selector(self.dd_loadView))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewDidLoad), swizzledSelector: #selector(self.dd_viewDidLoad))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewWillAppear(_:)), swizzledSelector: #selector(self.dd_viewWillAppear(animated:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewDidAppear(_:)), swizzledSelector: #selector(self.dd_viewDidAppear(animated:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewWillDisappear(_:)), swizzledSelector: #selector(self.dd_viewWillDisappear(animated:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewDidDisappear(_:)), swizzledSelector: #selector(self.dd_viewDidDisappear(animated:)))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewWillLayoutSubviews), swizzledSelector: #selector(self.dd_viewWillLayoutSubviews))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewSafeAreaInsetsDidChange), swizzledSelector: #selector(self.dd_viewSafeAreaInsetsDidChange))
|
||||
dd_methodSwizzling(targetClass: self, originalSelector: #selector(UIViewController.viewDidLayoutSubviews), swizzledSelector: #selector(self.dd_viewDidLayoutSubviews))
|
||||
}
|
||||
|
||||
@objc func dd_loadView() {
|
||||
dd_loadView()
|
||||
}
|
||||
|
||||
@objc func dd_viewDidLoad() {
|
||||
dd_viewDidLoad()
|
||||
}
|
||||
|
||||
@objc func dd_viewWillAppear(animated: Bool) {
|
||||
// When the interface is displayed, the color or image of the navigationBar at the current controller needs to be updated.
|
||||
dd_alterNavigationAttributes()
|
||||
|
||||
dd_alter(navigationBarBarButtonItemAttributes: dd_navigationBarBarButtonItemAttributes ?? [:])
|
||||
|
||||
dd_viewWillAppear(animated: animated)
|
||||
}
|
||||
|
||||
@objc func dd_viewDidAppear(animated: Bool) {
|
||||
dd_viewDidAppear(animated: animated)
|
||||
}
|
||||
|
||||
@objc func dd_viewWillDisappear(animated: Bool) {
|
||||
dd_viewWillDisappear(animated: animated)
|
||||
}
|
||||
|
||||
@objc func dd_viewDidDisappear(animated: Bool) {
|
||||
dd_viewDidDisappear(animated: animated)
|
||||
}
|
||||
|
||||
@objc func dd_viewWillLayoutSubviews() {
|
||||
dd_viewWillLayoutSubviews()
|
||||
}
|
||||
|
||||
@objc func dd_viewSafeAreaInsetsDidChange() {
|
||||
dd_viewSafeAreaInsetsDidChange()
|
||||
}
|
||||
|
||||
@objc func dd_viewDidLayoutSubviews() {
|
||||
dd_viewDidLayoutSubviews()
|
||||
}
|
||||
}
|
||||
|
||||
public extension UIViewController {
|
||||
var dd_navigationBarBackgroundColor : UIColor? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.navigationBarBackgroundColor) as? UIColor
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedNavigationBarBackgroundColor(navigationBarBackgroundColor: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_navigationBarBackgroundImage : UIImage? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.navigationBarBackgroundImage) as? UIImage
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedNavigationBarBackgroundImage(navigationBarBackgroundImage: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_navigationBarShadowColor : UIColor? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.navigationBarShadowColor) as? UIColor
|
||||
}
|
||||
set {
|
||||
if #available(iOS 13.0, *) {
|
||||
dd_setAssociatedNavigationBarShadowColor(navigationBarShadowColor: newValue)
|
||||
}
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_navigationBarShadowImage : UIImage? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.navigationBarShadowImage) as? UIImage
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedNavigationBarShadowImage(navigationBarShadowImage: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_navigationBarTitleTextAttributes : Dictionary<NSAttributedStringKey,Any> {
|
||||
get {
|
||||
return (objc_getAssociatedObject(self, &DDUIViewControllerKey.navigationBarTitleTextAttributes) as? Dictionary<NSAttributedStringKey,Any>) ?? [:]
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedNavigationBarTitleTextAttributes(navigationBarTitleTextAttributes: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_navigationBarBarButtonItemAttributes : Dictionary<NSAttributedStringKey,Any>? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.navigationBarBarButtonItemAttributes) as? Dictionary<NSAttributedStringKey,Any>
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedNavigationBarBarButtonItemAttributes(navigationBarBarButtonItemAttributes: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_backIndicatorImage : UIImage? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.backIndicatorImage) as? UIImage
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedBackIndicatorImage(backIndicatorImage: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_backIndicatorTransitionMaskImage : UIImage? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.backIndicatorTransitionMaskImage) as? UIImage
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedBackIndicatorImageTransitionMaskImage(backIndicatorTransitionMaskImage: newValue)
|
||||
dd_alterNavigationAttributes()
|
||||
}
|
||||
}
|
||||
|
||||
var dd_backButtonTitle : String? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.backButtonTitle) as? String
|
||||
}
|
||||
set {
|
||||
dd_setAssociatedBackButtonTitle(backButtonTitle: newValue)
|
||||
navigationItem.backButtonTitle = newValue
|
||||
}
|
||||
}
|
||||
|
||||
/// 将保存属性和赋值分开的原因是navigationBar的调用,这里@objc的原因是直接修改navigationBar属性需要调用
|
||||
@objc
|
||||
func dd_setAssociatedNavigationBarBackgroundColor(navigationBarBackgroundColor: UIColor?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.navigationBarBackgroundColor, navigationBarBackgroundColor, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setAssociatedNavigationBarBackgroundImage(navigationBarBackgroundImage: UIImage?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.navigationBarBackgroundImage, navigationBarBackgroundImage, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
func dd_setAssociatedNavigationBarShadowColor(navigationBarShadowColor: UIColor?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.navigationBarShadowColor, navigationBarShadowColor, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setAssociatedNavigationBarShadowImage(navigationBarShadowImage: UIImage?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.navigationBarShadowImage, navigationBarShadowImage, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setAssociatedNavigationBarTitleTextAttributes(navigationBarTitleTextAttributes: Dictionary<NSAttributedStringKey,Any>?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.navigationBarTitleTextAttributes, navigationBarTitleTextAttributes, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
func dd_setAssociatedNavigationBarBarButtonItemAttributes(navigationBarBarButtonItemAttributes: Dictionary<NSAttributedStringKey,Any>?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.navigationBarBarButtonItemAttributes, navigationBarBarButtonItemAttributes, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setAssociatedBackIndicatorImage(backIndicatorImage: UIImage?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.backIndicatorImage, backIndicatorImage, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
@objc
|
||||
func dd_setAssociatedBackIndicatorImageTransitionMaskImage(backIndicatorTransitionMaskImage: UIImage?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.backIndicatorTransitionMaskImage, backIndicatorTransitionMaskImage, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
func dd_setAssociatedBackButtonTitle(backButtonTitle: String?) {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.backButtonTitle, backButtonTitle, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
|
||||
func dd_alterNavigationAttributes() {
|
||||
if #available(iOS 13.0, *) {
|
||||
dd_alter(navigationBarBackgroundImage: dd_navigationBarBackgroundImage, navigationBarBackgroundColor: dd_navigationBarBackgroundColor, navigationBarShadowImage: dd_navigationBarShadowImage, navigationBarShadowColor: dd_navigationBarShadowColor, navigationBarTitleTextAttributes: dd_navigationBarTitleTextAttributes, backIndicatorImage: dd_backIndicatorImage, backIndicatorTransitionMaskImage: dd_backIndicatorTransitionMaskImage)
|
||||
}else{
|
||||
dd_alter(navigationBarBackgroundImage: dd_navigationBarBackgroundImage, navigationBarBackgroundColor: dd_navigationBarBackgroundColor, navigationBarShadowImage: dd_navigationBarShadowImage, navigationBarShadowColor: nil, navigationBarTitleTextAttributes: dd_navigationBarTitleTextAttributes, backIndicatorImage: dd_backIndicatorImage, backIndicatorTransitionMaskImage: dd_backIndicatorTransitionMaskImage)
|
||||
}
|
||||
}
|
||||
|
||||
func dd_alter(navigationBarBackgroundImage: UIImage?, navigationBarBackgroundColor: UIColor?, navigationBarShadowImage: UIImage?, navigationBarShadowColor: UIColor?, navigationBarTitleTextAttributes: Dictionary<NSAttributedStringKey,Any>, backIndicatorImage: UIImage?, backIndicatorTransitionMaskImage: UIImage?) {
|
||||
if #available(iOS 13.0, *) {
|
||||
let navigationBarAppearance = UINavigationBarAppearance()
|
||||
navigationBarAppearance.configureWithTransparentBackground()
|
||||
navigationBarAppearance.backgroundImage = navigationBarBackgroundImage
|
||||
navigationBarAppearance.backgroundColor = navigationBarBackgroundColor
|
||||
navigationBarAppearance.shadowImage = navigationBarShadowImage
|
||||
navigationBarAppearance.shadowColor = navigationBarShadowColor
|
||||
navigationBarAppearance.titleTextAttributes = navigationBarTitleTextAttributes
|
||||
navigationBarAppearance.setBackIndicatorImage(backIndicatorImage, transitionMaskImage: backIndicatorTransitionMaskImage)
|
||||
navigationController?.navigationBar.standardAppearance = navigationBarAppearance
|
||||
navigationController?.navigationBar.compactAppearance = navigationBarAppearance
|
||||
navigationController?.navigationBar.scrollEdgeAppearance = navigationBarAppearance
|
||||
if #available(iOS 15.0, *) {
|
||||
navigationController?.navigationBar.compactScrollEdgeAppearance = navigationBarAppearance
|
||||
}
|
||||
}else{
|
||||
navigationController?.navigationBar.barTintColor = navigationBarBackgroundColor
|
||||
navigationController?.navigationBar.setBackgroundImage(navigationBarBackgroundImage, for: .default)
|
||||
navigationController?.navigationBar.setBackgroundImage(navigationBarBackgroundImage, for: .compact)
|
||||
navigationController?.navigationBar.setBackgroundImage(navigationBarBackgroundImage, for: .defaultPrompt)
|
||||
navigationController?.navigationBar.setBackgroundImage(navigationBarBackgroundImage, for: .compactPrompt)
|
||||
navigationController?.navigationBar.shadowImage = navigationBarShadowImage
|
||||
navigationController?.navigationBar.titleTextAttributes = navigationBarTitleTextAttributes
|
||||
navigationController?.navigationBar.backIndicatorImage = backIndicatorImage
|
||||
navigationController?.navigationBar.backIndicatorTransitionMaskImage = backIndicatorTransitionMaskImage
|
||||
}
|
||||
}
|
||||
|
||||
func dd_alter(navigationBarBarButtonItemAttributes: Dictionary<NSAttributedStringKey,Any>) {
|
||||
if let leftBarButtonItemsCount = navigationItem.leftBarButtonItems?.count, leftBarButtonItemsCount > 0 {
|
||||
for i in 0..<leftBarButtonItemsCount {
|
||||
let barButtonItem = navigationItem.leftBarButtonItems?[i]
|
||||
barButtonItem?.setTitleTextAttributes(navigationBarBarButtonItemAttributes, for: .normal)
|
||||
barButtonItem?.setTitleTextAttributes(navigationBarBarButtonItemAttributes, for: .highlighted)
|
||||
}
|
||||
}
|
||||
|
||||
if let rightBarButtonItemsCount = navigationItem.rightBarButtonItems?.count, rightBarButtonItemsCount > 0 {
|
||||
for i in 0..<rightBarButtonItemsCount {
|
||||
let barButtonItem = navigationItem.rightBarButtonItems?[i]
|
||||
barButtonItem?.setTitleTextAttributes(navigationBarBarButtonItemAttributes, for: .normal)
|
||||
barButtonItem?.setTitleTextAttributes(navigationBarBarButtonItemAttributes, for: .highlighted)
|
||||
}
|
||||
}
|
||||
|
||||
/// update system backBarButtonItem's color, but this item's font we didn't modify it,usually we will replace this item by our custom items,so the problem of font is unimportant.
|
||||
let tintColor = navigationBarBarButtonItemAttributes[NSAttributedStringKey.foregroundColor] as? UIColor
|
||||
if tintColor != nil && tintColor != navigationController?.navigationBar.tintColor {
|
||||
navigationController?.navigationBar.tintColor = navigationBarBarButtonItemAttributes[NSAttributedStringKey.foregroundColor] as? UIColor
|
||||
/// self.navigationController.navigationBar.backItem's title font didn't modified.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: 屏幕方向
|
||||
public extension UIViewController {
|
||||
/// 设置屏幕方向1.appDelegate return .all (这里优先级高于info.plist) 2.launchScreen初始化方向设置info.plist的Initial interface orientation 3.设置NavigationController和TabBarController的方向为topViewController的方向 4.设置topViewController的方向
|
||||
/// - Parameter interfaceOrientation: 方向
|
||||
func dd_setInterfaceOrientation(interfaceOrientation: UIInterfaceOrientation) {
|
||||
let resetOrientationTargert = NSNumber(integerLiteral: UIInterfaceOrientation.unknown.rawValue)
|
||||
UIDevice.current.setValue(resetOrientationTargert, forKey: "orientation")
|
||||
|
||||
let orientationTarget = NSNumber(integerLiteral: interfaceOrientation.rawValue)
|
||||
UIDevice.current.setValue(orientationTarget, forKey: "orientation")
|
||||
}
|
||||
}
|
||||
224
Pods/DDUIKit/DDUIKit/Classes/UIViewControllerAnimatedTransitioning/DDFullScreenTransition.swift
generated
Normal file
224
Pods/DDUIKit/DDUIKit/Classes/UIViewControllerAnimatedTransitioning/DDFullScreenTransition.swift
generated
Normal file
@@ -0,0 +1,224 @@
|
||||
//
|
||||
// DDFullScreenTransition.swift
|
||||
// DDContextTransitioning
|
||||
// Created by DDIsFriend on 2023/12/5.
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
open class DDFullScreenTransition : NSObject, UIViewControllerAnimatedTransitioning {
|
||||
|
||||
public enum DDFullScreenTransitionType {
|
||||
case none,push,pop
|
||||
}
|
||||
|
||||
private var transitionType : DDFullScreenTransitionType
|
||||
|
||||
public init(transitionType: DDFullScreenTransitionType) {
|
||||
self.transitionType = transitionType
|
||||
super.init()
|
||||
}
|
||||
|
||||
public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
|
||||
return 0.25
|
||||
}
|
||||
|
||||
public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
switch transitionType {
|
||||
case .none:
|
||||
|
||||
break
|
||||
case .push:
|
||||
pushAnimation(using: transitionContext)
|
||||
break
|
||||
case .pop:
|
||||
popAnimation(using: transitionContext)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func pushAnimation(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
let fromVc = transitionContext.viewController(forKey: .from)
|
||||
let toVc = transitionContext.viewController(forKey: .to)
|
||||
let container = transitionContext.containerView
|
||||
guard let fromVc, let toVc else {
|
||||
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
|
||||
return
|
||||
}
|
||||
|
||||
var fromVcRect = transitionContext.initialFrame(for: fromVc)
|
||||
fromVcRect.origin.x = 0
|
||||
fromVcRect.origin.y = 0
|
||||
fromVcRect.size = container.frame.size
|
||||
fromVc.view.frame = fromVcRect
|
||||
|
||||
var fromVcToRect = fromVc.view.frame
|
||||
fromVcToRect.origin.x = container.frame.size.width * 1 * (-0.5)
|
||||
|
||||
var toVcRect = transitionContext.initialFrame(for: fromVc)
|
||||
toVcRect.origin.x = container.frame.size.width
|
||||
toVcRect.origin.y = 0
|
||||
toVcRect.size = container.frame.size
|
||||
toVc.view.frame = toVcRect
|
||||
|
||||
var toVcToRect = toVc.view.frame
|
||||
toVcToRect.origin.x = 0
|
||||
|
||||
let path = UIBezierPath(rect: toVc.view.bounds)
|
||||
path.lineWidth = 3
|
||||
toVc.view.layer.shadowPath = path.cgPath
|
||||
toVc.view.layer.shadowColor = UIColor.darkGray.cgColor
|
||||
toVc.view.layer.shadowOpacity = 3
|
||||
|
||||
if let navigationBarSnapshot = fromVc.navigationController?.view.resizableSnapshotView(from: CGRectMake(0, 0, container.frame.size.width, CGRectGetMaxY(fromVc.navigationController?.navigationBar.frame ?? .zero)), afterScreenUpdates: false, withCapInsets: .zero) {
|
||||
fromVc.dd_transitionNavigationBarSnapshot = navigationBarSnapshot
|
||||
fromVc.view.addSubview(navigationBarSnapshot)
|
||||
}
|
||||
|
||||
if fromVc.navigationController?.parent?.isKind(of: UITabBarController.self) == true && fromVc.navigationController?.viewControllers.count == 2 {
|
||||
let tabBarController = fromVc.navigationController?.parent as? UITabBarController
|
||||
if let tabBarSnapshot = tabBarController?.tabBar.resizableSnapshotView(from: CGRectMake(0, 0, container.frame.size.width, CGRectGetMaxY(tabBarController?.tabBar.frame ?? .zero) - CGRectGetMinY(tabBarController?.tabBar.frame ?? .zero)), afterScreenUpdates: false, withCapInsets: .zero) {
|
||||
fromVc.dd_transitionTabBarSnapshot = tabBarSnapshot
|
||||
tabBarSnapshot.frame = CGRectMake(0, CGRectGetMaxY(fromVc.view.frame) - tabBarSnapshot.bounds.size.height, tabBarSnapshot.bounds.size.width, tabBarSnapshot.bounds.size.height)
|
||||
fromVc.view.addSubview(tabBarSnapshot)
|
||||
}
|
||||
}
|
||||
|
||||
if fromVc.dd_transitionTabBarSnapshot != nil {
|
||||
fromVc.tabBarController?.tabBar.isHidden = true
|
||||
}
|
||||
|
||||
fromVc.navigationController?.view.insertSubview(fromVc.view, at: 0)
|
||||
fromVc.navigationController?.view.insertSubview(toVc.view, aboveSubview: fromVc.view)
|
||||
|
||||
UIView.animate(withDuration: transitionDuration(using: transitionContext)) {
|
||||
fromVc.view.frame = fromVcToRect
|
||||
toVc.view.frame = toVcToRect
|
||||
} completion: { finished in
|
||||
if !transitionContext.transitionWasCancelled {
|
||||
fromVc.dd_transitionNavigationBarSnapshot?.removeFromSuperview()
|
||||
fromVc.dd_transitionTabBarSnapshot?.removeFromSuperview()
|
||||
fromVc.view.removeFromSuperview()
|
||||
toVc.view.removeFromSuperview()
|
||||
container.addSubview(toVc.view)
|
||||
}else{
|
||||
fromVc.dd_transitionNavigationBarSnapshot?.removeFromSuperview()
|
||||
fromVc.dd_transitionNavigationBarSnapshot = nil
|
||||
if fromVc.dd_transitionTabBarSnapshot != nil {
|
||||
fromVc.dd_transitionTabBarSnapshot?.removeFromSuperview()
|
||||
fromVc.dd_transitionTabBarSnapshot = nil
|
||||
}
|
||||
fromVc.view.removeFromSuperview()
|
||||
toVc.view.removeFromSuperview()
|
||||
container.addSubview(fromVc.view)
|
||||
}
|
||||
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func popAnimation(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
let fromVc = transitionContext.viewController(forKey: .from)
|
||||
let toVc = transitionContext.viewController(forKey: .to)
|
||||
let container = transitionContext.containerView
|
||||
guard let fromVc, let toVc else {
|
||||
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
|
||||
return
|
||||
}
|
||||
|
||||
var fromVcRect = transitionContext.initialFrame(for: fromVc)
|
||||
fromVcRect.origin.x = 0
|
||||
fromVcRect.origin.y = 0
|
||||
fromVcRect.size = container.frame.size
|
||||
fromVc.view.frame = fromVcRect
|
||||
|
||||
var fromVcToRect = fromVc.view.frame
|
||||
fromVcToRect.origin.x = container.frame.size.width
|
||||
|
||||
var toVcRect = transitionContext.initialFrame(for: fromVc)
|
||||
toVcRect.origin.x = container.frame.size.width * 1 * (-0.5)
|
||||
toVcRect.origin.y = 0
|
||||
toVcRect.size = container.frame.size
|
||||
toVc.view.frame = toVcRect
|
||||
|
||||
var toVcToRect = toVc.view.frame
|
||||
toVcToRect.origin.x = 0
|
||||
|
||||
let path = UIBezierPath(rect: toVc.view.bounds)
|
||||
path.lineWidth = 3
|
||||
toVc.view.layer.shadowPath = path.cgPath
|
||||
toVc.view.layer.shadowColor = UIColor.darkGray.cgColor
|
||||
toVc.view.layer.shadowOpacity = 3
|
||||
|
||||
if let navigationBarSnapshot = fromVc.navigationController?.view.resizableSnapshotView(from: CGRectMake(0, 0, container.frame.size.width, CGRectGetMaxY(fromVc.navigationController?.navigationBar.frame ?? .zero)), afterScreenUpdates: false, withCapInsets: .zero) {
|
||||
fromVc.dd_transitionNavigationBarSnapshot = navigationBarSnapshot
|
||||
fromVc.view.addSubview(navigationBarSnapshot)
|
||||
}
|
||||
|
||||
if let transitionNavigationBarSnapshot = toVc.dd_transitionNavigationBarSnapshot {
|
||||
toVc.view.addSubview(transitionNavigationBarSnapshot)
|
||||
}
|
||||
|
||||
if let transitionTabBarSnapshot = toVc.dd_transitionTabBarSnapshot {
|
||||
toVc.view.addSubview(transitionTabBarSnapshot)
|
||||
toVc.tabBarController?.tabBar.isHidden = true
|
||||
}
|
||||
|
||||
fromVc.navigationController?.view.addSubview(toVc.view)
|
||||
fromVc.navigationController?.view.addSubview(fromVc.view)
|
||||
|
||||
UIView.animate(withDuration: transitionDuration(using: transitionContext)) {
|
||||
fromVc.view.frame = fromVcToRect
|
||||
toVc.view.frame = toVcToRect
|
||||
} completion: { finished in
|
||||
if !transitionContext.transitionWasCancelled {
|
||||
fromVc.dd_transitionNavigationBarSnapshot?.removeFromSuperview()
|
||||
fromVc.dd_transitionNavigationBarSnapshot = nil
|
||||
fromVc.view.removeFromSuperview()
|
||||
toVc.dd_transitionNavigationBarSnapshot?.removeFromSuperview()
|
||||
toVc.dd_transitionNavigationBarSnapshot = nil
|
||||
if toVc.dd_transitionTabBarSnapshot != nil {
|
||||
toVc.dd_transitionTabBarSnapshot?.removeFromSuperview()
|
||||
toVc.dd_transitionTabBarSnapshot = nil
|
||||
toVc.tabBarController?.tabBar.isHidden = false
|
||||
}
|
||||
toVc.view.removeFromSuperview()
|
||||
container.addSubview(toVc.view)
|
||||
toVc.view.frame = container.bounds
|
||||
}else{
|
||||
fromVc.dd_transitionNavigationBarSnapshot?.removeFromSuperview()
|
||||
fromVc.dd_transitionNavigationBarSnapshot = nil
|
||||
fromVc.view.removeFromSuperview()
|
||||
toVc.view.removeFromSuperview()
|
||||
container.addSubview(fromVc.view)
|
||||
fromVc.view.frame = container.bounds
|
||||
}
|
||||
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate extension UIViewController {
|
||||
struct DDUIViewControllerKey {
|
||||
static var transitionNavigationBarSnapshot : UInt8 = 1 << 0
|
||||
static var transitionTabBarSnapshot : UInt8 = 1 << 1
|
||||
}
|
||||
|
||||
var dd_transitionNavigationBarSnapshot: UIView? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.transitionNavigationBarSnapshot) as? UIView
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.transitionNavigationBarSnapshot, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
|
||||
var dd_transitionTabBarSnapshot : UIView? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &DDUIViewControllerKey.transitionTabBarSnapshot) as? UIView
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &DDUIViewControllerKey.transitionTabBarSnapshot, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
}
|
||||
}
|
||||
}
|
||||
19
Pods/DDUIKit/LICENSE
generated
Normal file
19
Pods/DDUIKit/LICENSE
generated
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2024 ddisfriend <chemailaddress2@gmail.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.
|
||||
29
Pods/DDUIKit/README.md
generated
Normal file
29
Pods/DDUIKit/README.md
generated
Normal file
@@ -0,0 +1,29 @@
|
||||
# DDUIKit
|
||||
|
||||
[](https://travis-ci.org/ddisfriend/DDUIKit)
|
||||
[](https://cocoapods.org/pods/DDUIKit)
|
||||
[](https://cocoapods.org/pods/DDUIKit)
|
||||
[](https://cocoapods.org/pods/DDUIKit)
|
||||
|
||||
## Example
|
||||
|
||||
To run the example project, clone the repo, and run `pod install` from the Example directory first.
|
||||
|
||||
## Requirements
|
||||
|
||||
## Installation
|
||||
|
||||
DDUIKit is available through [CocoaPods](https://cocoapods.org). To install
|
||||
it, simply add the following line to your Podfile:
|
||||
|
||||
```ruby
|
||||
pod 'DDUIKit'
|
||||
```
|
||||
|
||||
## Author
|
||||
|
||||
ddisfriend, chemailaddress2@gmail.com
|
||||
|
||||
## License
|
||||
|
||||
DDUIKit is available under the MIT license. See the LICENSE file for more info.
|
||||
Reference in New Issue
Block a user