@bm-fe/react-native-ui-components 1.0.1 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/android/design/build.gradle +51 -0
  2. package/android/design/consumer-rules.pro +1 -0
  3. package/android/design/proguard-rules.pro +1 -0
  4. package/android/design/src/main/AndroidManifest.xml +2 -0
  5. package/android/design/src/main/java/com/bitmart/react/design/DataUriFetcher.kt +42 -0
  6. package/android/design/src/main/java/com/bitmart/react/design/DesignComponentPackage.kt +35 -0
  7. package/android/design/src/main/java/com/bitmart/react/design/PrimaryXLargeViewManager.kt +785 -0
  8. package/android/design/src/main/java/com/bitmart/react/design/TextButtonViewManager.kt +294 -0
  9. package/ios/DemoProject/NativeDesign/PrimaryButtonViewManager.m +25 -0
  10. package/ios/DemoProject/NativeDesign/PrimaryButtonViewManager.swift +321 -0
  11. package/ios/DemoProject/NativeDesign/TextButtonViewManager.m +21 -0
  12. package/ios/DemoProject/NativeDesign/TextButtonViewManager.swift +184 -0
  13. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Bitmart Card.imageset/Contents.json +21 -0
  14. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Bitmart Card.imageset/Property 1=Bitmart Card.svg +3 -0
  15. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Contents.json +6 -0
  16. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Credit Debit Card.imageset/Contents.json +21 -0
  17. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Credit Debit Card.imageset/Property 1=Credit Debit Card.svg +3 -0
  18. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Crypto Prepaid Card.imageset/Contents.json +21 -0
  19. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Crypto Prepaid Card.imageset/Property 1=Crypto Prepaid Card.svg +3 -0
  20. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Mobile Recharge.imageset/Contents.json +21 -0
  21. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Mobile Recharge.imageset/Mobile Recharge.svg +3 -0
  22. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/P2P Trading.imageset/Contents.json +21 -0
  23. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/P2P Trading.imageset/Property 1=P2P Trading.svg +3 -0
  24. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/SEPA Deposit.imageset/Contents.json +21 -0
  25. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/SEPA Deposit.imageset/SEPA Deposit.svg +3 -0
  26. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Third-Party Payment.imageset/Contents.json +21 -0
  27. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/BuyCrypto/Third-Party Payment.imageset/Property 1=Third-Party Payment.svg +3 -0
  28. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Components/Contents.json +6 -0
  29. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/Contents.json +6 -0
  30. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/checkmark.imageset/Contents.json +21 -0
  31. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/checkmark.imageset/checkmark.pdf +0 -0
  32. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/close_icon.imageset/Contents.json +22 -0
  33. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/close_icon.imageset/close_icon@2x.png +0 -0
  34. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/close_icon.imageset/close_icon@3x.png +0 -0
  35. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/cross.imageset/Contents.json +21 -0
  36. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/cross.imageset/cross.pdf +0 -0
  37. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/progress.imageset/Contents.json +21 -0
  38. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/progress.imageset/progress.pdf +0 -0
  39. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/progress_circular.imageset/Contents.json +21 -0
  40. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/progress_circular.imageset/progress_circular.pdf +0 -0
  41. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/refresh_footer_dark.imageset/Contents.json +22 -0
  42. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/refresh_footer_dark.imageset/refresh_footer_dark@2x.png +0 -0
  43. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/refresh_footer_dark.imageset/refresh_footer_dark@3x.png +0 -0
  44. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/refresh_footer_light.imageset/Contents.json +22 -0
  45. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/refresh_footer_light.imageset/refresh_footer_light@2x.png +0 -0
  46. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/refresh_footer_light.imageset/refresh_footer_light@3x.png +0 -0
  47. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/search_icon.imageset/Contents.json +21 -0
  48. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/search_icon.imageset/Group 13994.svg +7 -0
  49. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_dark_chose.imageset/Contents.json +21 -0
  50. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_dark_chose.imageset/Frame.svg +3 -0
  51. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_arrow.imageset/Contents.json +22 -0
  52. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_arrow.imageset/sheet_list_arrow@2x.png +0 -0
  53. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_arrow.imageset/sheet_list_arrow@3x.png +0 -0
  54. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_cell_checkbox.imageset/Contents.json +21 -0
  55. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_cell_checkbox.imageset/Frame (1).svg +3 -0
  56. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_chose.imageset/Contents.json +21 -0
  57. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/sheet_list_chose.imageset/Frame.png +0 -0
  58. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/slider_bubble.imageset/Contents.json +22 -0
  59. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/slider_bubble.imageset/slider_bubble@2x.png +0 -0
  60. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/slider_bubble.imageset/slider_bubble@3x.png +0 -0
  61. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/spot_second_floor_refresh_arrow.imageset/Contents.json +21 -0
  62. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Assets.xcassets/spot_second_floor_refresh_arrow.imageset/spot_second_floor_refresh_arrow.svg +8 -0
  63. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Font/Alexandria-Medium.ttf +0 -0
  64. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Font/Alexandria-Regular.ttf +0 -0
  65. package/ios/Modules/BMUIComponents/BMUIComponents/Assets/Font/Alexandria-SemiBold.ttf +0 -0
  66. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/BMFont/BMFont.swift +82 -0
  67. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/BMFont/UIFontExtensions.swift +120 -0
  68. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/AlertView/BMComponentAlertController.swift +574 -0
  69. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/Buttons/BMComponentButton+Examples.swift +77 -0
  70. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/Buttons/BMComponentButton.swift +373 -0
  71. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/Buttons/BMComponentButtonConfiguration.swift +181 -0
  72. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/Popup/BMComponentPopupController.swift +312 -0
  73. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/SegmentView/BMComponentSegmentedTitleCell.swift +294 -0
  74. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/SegmentView/BMComponentSegmentedTitleDataSource.swift +49 -0
  75. package/ios/Modules/BMUIComponents/BMUIComponents/Classes/Components/SegmentView/BMComponentSegmentedView.swift +292 -0
  76. package/ios/Modules/BMUIComponents/LICENSE +19 -0
  77. package/ios/Modules/BMUIComponents/README.md +29 -0
  78. package/package.json +10 -1
  79. package/react-native-ui-components.podspec +52 -0
  80. package/react-native.config.js +16 -0
  81. package/src/screens/NativeButtonsScreen.tsx +0 -335
@@ -0,0 +1,22 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x"
6
+ },
7
+ {
8
+ "filename" : "sheet_list_arrow@2x.png",
9
+ "idiom" : "universal",
10
+ "scale" : "2x"
11
+ },
12
+ {
13
+ "filename" : "sheet_list_arrow@3x.png",
14
+ "idiom" : "universal",
15
+ "scale" : "3x"
16
+ }
17
+ ],
18
+ "info" : {
19
+ "author" : "xcode",
20
+ "version" : 1
21
+ }
22
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "filename" : "Frame (1).svg",
5
+ "idiom" : "universal",
6
+ "scale" : "1x"
7
+ },
8
+ {
9
+ "idiom" : "universal",
10
+ "scale" : "2x"
11
+ },
12
+ {
13
+ "idiom" : "universal",
14
+ "scale" : "3x"
15
+ }
16
+ ],
17
+ "info" : {
18
+ "author" : "xcode",
19
+ "version" : 1
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M12.0002 1.2C6.1202 1.2 1.2002 6.12 1.2002 12C1.2002 17.88 6.1202 22.8 12.0002 22.8C17.8802 22.8 22.8002 17.88 22.8002 12C22.8002 6.12 17.8802 1.2 12.0002 1.2ZM10.4402 16.2L6.6002 12.36L7.8002 11.16L10.4402 13.8L16.2002 8.04L17.4002 9.24L10.4402 16.2Z" fill="#1C1E1F"/>
3
+ </svg>
@@ -0,0 +1,21 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x"
6
+ },
7
+ {
8
+ "idiom" : "universal",
9
+ "scale" : "2x"
10
+ },
11
+ {
12
+ "filename" : "Frame.png",
13
+ "idiom" : "universal",
14
+ "scale" : "3x"
15
+ }
16
+ ],
17
+ "info" : {
18
+ "author" : "xcode",
19
+ "version" : 1
20
+ }
21
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x"
6
+ },
7
+ {
8
+ "filename" : "slider_bubble@2x.png",
9
+ "idiom" : "universal",
10
+ "scale" : "2x"
11
+ },
12
+ {
13
+ "filename" : "slider_bubble@3x.png",
14
+ "idiom" : "universal",
15
+ "scale" : "3x"
16
+ }
17
+ ],
18
+ "info" : {
19
+ "author" : "xcode",
20
+ "version" : 1
21
+ }
22
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "filename" : "spot_second_floor_refresh_arrow.svg",
5
+ "idiom" : "universal",
6
+ "scale" : "1x"
7
+ },
8
+ {
9
+ "idiom" : "universal",
10
+ "scale" : "2x"
11
+ },
12
+ {
13
+ "idiom" : "universal",
14
+ "scale" : "3x"
15
+ }
16
+ ],
17
+ "info" : {
18
+ "author" : "xcode",
19
+ "version" : 1
20
+ }
21
+ }
@@ -0,0 +1,8 @@
1
+ <svg width="16" height="21" viewBox="0 0 16 21" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g opacity="0.3">
3
+ <path d="M13.138 11.4713L8.00002 16.6094L2.862 11.4713L3.80471 10.5286L8.00002 14.7239L12.1953 10.5286L13.138 11.4713Z" fill="#0F0F0F"/>
4
+ </g>
5
+ <g opacity="0.3">
6
+ <path d="M13.138 6.47133L8.00002 11.6094L2.862 6.47133L3.80471 5.52863L8.00002 9.72394L12.1953 5.52863L13.138 6.47133Z" fill="#0F0F0F"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,82 @@
1
+
2
+ import Foundation
3
+ import BMCore
4
+
5
+ public extension UIFont {
6
+
7
+ /// H1Font - 64pt SemiBold
8
+ static let H1Font: UIFont = UIFont.AlexSemiBold(size: 64)
9
+
10
+ /// H2Font - 40pt SemiBold
11
+ static let H2Font: UIFont = UIFont.AlexSemiBold(size: 40)
12
+
13
+ /// H3Font - 32pt SemiBold
14
+ static let H3Font: UIFont = UIFont.AlexSemiBold(size: 32)
15
+
16
+ /// H4Font - 28pt SemiBold
17
+ static let H4Font: UIFont = UIFont.AlexSemiBold(size: 28)
18
+
19
+ /// H5Font - 24pt SemiBold
20
+ static let H5Font: UIFont = UIFont.AlexSemiBold(size: 24)
21
+
22
+ /// H6Font - 20pt SemiBold
23
+ static let H6Font: UIFont = UIFont.AlexSemiBold(size: 20)
24
+
25
+ /// H7Font - 18pt Medium
26
+ static let H7Font: UIFont = UIFont.AlexMedium(size: 18)
27
+
28
+ /// S1Font - 16pt SemiBold
29
+ static let S1Font: UIFont = UIFont.AlexSemiBold(size: 16)
30
+
31
+ /// S2Font - 16pt Medium
32
+ static let S2Font: UIFont = UIFont.AlexMedium(size: 16)
33
+
34
+ /// S3Font - 14pt SemiBold
35
+ static let S3Font: UIFont = UIFont.AlexSemiBold(size: 14)
36
+
37
+ /// S4Font - 14pt Medium
38
+ static let S4Font: UIFont = UIFont.AlexMedium(size: 14)
39
+
40
+ /// S5Font - 12pt Medium
41
+ static let S5Font: UIFont = UIFont.AlexMedium(size: 12)
42
+
43
+ /// B1Font - 16pt Regular
44
+ static let B1Font: UIFont = UIFont.AlexRegular(size: 16)
45
+
46
+ /// B2Font - 14pt Regular
47
+ static let B2Font: UIFont = UIFont.AlexRegular(size: 14)
48
+
49
+ /// B3Font - 12pt Regular
50
+ static let B3Font: UIFont = UIFont.AlexRegular(size: 12)
51
+
52
+ /// B4Font - 10pt Regular
53
+ static let B4Font: UIFont = UIFont.AlexRegular(size: 10)
54
+
55
+ }
56
+
57
+ //extension ComponentExtension where Base == UIFont {
58
+ // /// Regular
59
+ // static let b1_400_16: UIFont = UIFont.AlexRegular(size: 16)
60
+ // static let b1_400_14: UIFont = UIFont.AlexRegular(size: 14)
61
+ // static let b1_400_12: UIFont = UIFont.AlexRegular(size: 12)
62
+ // static let b1_400_10: UIFont = UIFont.AlexRegular(size: 10)
63
+ //
64
+ //
65
+ // /// Medium
66
+ // static let s1_500_18: UIFont = UIFont.AlexMedium(size: 18)
67
+ // static let s1_500_16: UIFont = UIFont.AlexMedium(size: 16)
68
+ // static let s1_500_14: UIFont = UIFont.AlexMedium(size: 14)
69
+ // static let s1_500_12: UIFont = UIFont.AlexMedium(size: 12)
70
+ //
71
+ //
72
+ // /// SemiBold
73
+ // static let h1_600_64: UIFont = UIFont.AlexSemiBold(size: 64)
74
+ // static let h2_600_40: UIFont = UIFont.AlexSemiBold(size: 40)
75
+ // static let h3_600_32: UIFont = UIFont.AlexSemiBold(size: 32)
76
+ // static let h4_600_28: UIFont = UIFont.AlexSemiBold(size: 28)
77
+ // static let h5_600_24: UIFont = UIFont.AlexSemiBold(size: 24)
78
+ // static let h6_600_20: UIFont = UIFont.AlexSemiBold(size: 20)
79
+ // static let h7_600_16: UIFont = UIFont.AlexSemiBold(size: 16)
80
+ // static let h7_600_14: UIFont = UIFont.AlexSemiBold(size: 14)
81
+ //}
82
+
@@ -0,0 +1,120 @@
1
+ //
2
+ // UIFontExtensions.swift
3
+ // BMCore
4
+ //
5
+ // Created by james on 2026/3/9.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: 用于在分类中获取Bundle
11
+ fileprivate class BMComponentsBundle { }
12
+
13
+ public enum BMAlexandriaFont: String {
14
+ /// Alexandria font
15
+ case AlexandriaRegular = "Alexandria-Regular"
16
+ case AlexandriaMedium = "Alexandria-Medium"
17
+ case AlexandriaSemiBold = "Alexandria-SemiBold"
18
+ }
19
+
20
+
21
+ // MARK: UIFont
22
+ extension UIFont {
23
+
24
+ /// 从 IBMRegular 初始化字体
25
+ /// - Parameter size: 字体大小
26
+ /// - Returns: 字体
27
+ static func AlexRegular(size: CGFloat) -> UIFont {
28
+ // 注册自定义字体,生命周期内,只执行一次
29
+ DispatchQueue.once(token: "bm.font.AlexRegular.token") {
30
+ registerAlexRegularFont()
31
+ }
32
+ return UIFont.font(name: BMAlexandriaFont.AlexandriaRegular.rawValue, size: size)
33
+ }
34
+
35
+ /// 从 IBMMedium 初始化字体
36
+ /// - Parameter size: 字体大小
37
+ /// - Returns: 字体
38
+ static func AlexMedium(size: CGFloat) -> UIFont {
39
+ // 注册自定义字体,生命周期内,只执行一次
40
+ DispatchQueue.once(token: "bm.font.AlexMedium.token") {
41
+ registerAlexMediumFont()
42
+ }
43
+ return UIFont.font(name: BMAlexandriaFont.AlexandriaMedium.rawValue, size: size)
44
+ }
45
+
46
+ /// 从 IBMSemiBold 初始化字体
47
+ /// - Parameter size: 字体大小
48
+ /// - Returns: 字体
49
+ static func AlexSemiBold(size: CGFloat) -> UIFont {
50
+ // 注册自定义字体,生命周期内,只执行一次
51
+ DispatchQueue.once(token: "bm.font.AlexSemiBold.token") {
52
+ registerAlexSemiBoldFont()
53
+ }
54
+ return UIFont.font(name: BMAlexandriaFont.AlexandriaSemiBold.rawValue, size: size)
55
+ }
56
+
57
+ /// 从指定字体类型初始化字体
58
+ /// - Parameters:
59
+ /// - name: 字体名称
60
+ /// - size: 字体大小
61
+ /// - Returns: 字体
62
+ static func font(name: String, size: CGFloat) -> UIFont {
63
+ guard let font = UIFont(name: name, size: size) else {
64
+ return UIFont.systemFont(ofSize: size)
65
+ }
66
+ return font
67
+ }
68
+ }
69
+
70
+ // MARK: 注册自定义字体
71
+ extension UIFont {
72
+
73
+ /// 注册 Alexandria-Regular 字体
74
+ private static func registerAlexRegularFont() {
75
+ registerFont(bundleName: "Font", resourceName: "Alexandria-Regular", resourceSuffix: ".ttf")
76
+ }
77
+
78
+ /// 注册 Alexandria-Medium 字体
79
+ private static func registerAlexMediumFont() {
80
+ registerFont(bundleName: "Font", resourceName: "Alexandria-Medium", resourceSuffix: ".ttf")
81
+ }
82
+
83
+ /// 注册 Alexandria-SemiBold 字体
84
+ private static func registerAlexSemiBoldFont() {
85
+ registerFont(bundleName: "Font", resourceName: "Alexandria-SemiBold", resourceSuffix: ".ttf")
86
+ }
87
+
88
+ /// 通过指定的bundle及资源文件注册自定义字体
89
+ /// - Parameters:
90
+ /// - bundleName: 字体资源文件所在的bundle名称
91
+ /// - resourceName: 字体资源文件名称
92
+ /// - resourceSuffix: 字体资源文件后缀
93
+ private static func registerFont(bundleName: String, resourceName: String, resourceSuffix: String) {
94
+ guard let bundle = Bundle.bundle(BMComponentsBundle.self)?.resourcesBundle(with: bundleName) else {
95
+ return
96
+ }
97
+ guard let fontURL = bundle.url(forResource: resourceName, withExtension: resourceSuffix) else {
98
+ return
99
+ }
100
+ UIFont.register(from: fontURL)
101
+ }
102
+
103
+ /// 通过指定的资源文件URL注册自定义字体
104
+ /// - Parameter url: 资源文件URL
105
+ public static func register(from url: URL) {
106
+ var error: Unmanaged<CFError>?
107
+ let success = CTFontManagerRegisterFontsForURL(url as CFURL, .process, &error)
108
+ if !success {
109
+ if let errorUnwrapped = error?.takeUnretainedValue() {
110
+ let errorDescription = CFErrorCopyDescription(errorUnwrapped)
111
+ debugPrint("Failed to register font: \(errorDescription ?? "unknown error" as CFString)")
112
+ } else {
113
+ debugPrint("Failed to register font")
114
+ }
115
+ }
116
+ }
117
+
118
+ }
119
+
120
+