From 06122c3142ec720880cfaf6fb518386c99bcd691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E8=A7=89=E6=96=B0?= Date: Fri, 18 Apr 2025 08:57:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=A1=B5=E9=9D=A2=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShortPlay/AppDelegate/AppDelegate.swift | 5 +- ShortPlay/Base/Extension/UIColor+SPAdd.swift | 9 +- .../Base/Networking/API/SPVideoAPI.swift | 5 +- ShortPlay/Base/View/SPTextField.swift | 142 ++++++++++++++++++ .../Controller/SPHomePageController.swift | 23 +++ .../Controller/SPSearchViewController.swift | 72 +++++++++ .../Class/Home/View/SPHomeSearchButton.swift | 50 ++++++ .../Class/Home/View/SPSearchHomeView.swift | 14 ++ .../Class/Home/View/SPSearchInputView.swift | 70 +++++++++ .../Player/View/SPPlayerControlView.swift | 3 +- ShortPlay/Libs/Login/SPLoginManager.swift | 56 ++++++- .../search_icon_01.imageset/Contents.json | 22 +++ .../search_icon_01.imageset/搜索图标@2x.png | Bin 0 -> 1508 bytes .../search_icon_01.imageset/搜索图标@3x.png | Bin 0 -> 2846 bytes .../search_icon_02.imageset/Contents.json | 22 +++ .../search_icon_02.imageset/搜索图标@2x.png | Bin 0 -> 1000 bytes .../search_icon_02.imageset/搜索图标@3x.png | Bin 0 -> 1883 bytes 17 files changed, 479 insertions(+), 14 deletions(-) create mode 100644 ShortPlay/Base/View/SPTextField.swift create mode 100644 ShortPlay/Class/Home/Controller/SPSearchViewController.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeSearchButton.swift create mode 100644 ShortPlay/Class/Home/View/SPSearchHomeView.swift create mode 100644 ShortPlay/Class/Home/View/SPSearchInputView.swift create mode 100644 ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/搜索图标@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/搜索图标@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/搜索图标@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/搜索图标@3x.png diff --git a/ShortPlay/AppDelegate/AppDelegate.swift b/ShortPlay/AppDelegate/AppDelegate.swift index c8d5fa8..fcb5809 100644 --- a/ShortPlay/AppDelegate/AppDelegate.swift +++ b/ShortPlay/AppDelegate/AppDelegate.swift @@ -10,7 +10,7 @@ import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { - + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { @@ -18,6 +18,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { SPLoginManager.manager.requestVisitorLogin(completer: nil) + + + return true } diff --git a/ShortPlay/Base/Extension/UIColor+SPAdd.swift b/ShortPlay/Base/Extension/UIColor+SPAdd.swift index b6c0919..9bc54c8 100644 --- a/ShortPlay/Base/Extension/UIColor+SPAdd.swift +++ b/ShortPlay/Base/Extension/UIColor+SPAdd.swift @@ -21,10 +21,11 @@ extension UIColor { static func themeColor() -> UIColor { return color000000() } -// -// static func placeholderColor() -> UIColor { -// return color868C92() -// } + + + static func placeholderColor() -> UIColor { + return .colorFFFFFF(alpha: 0.22) + } } extension UIColor { diff --git a/ShortPlay/Base/Networking/API/SPVideoAPI.swift b/ShortPlay/Base/Networking/API/SPVideoAPI.swift index 862bb85..46a6633 100644 --- a/ShortPlay/Base/Networking/API/SPVideoAPI.swift +++ b/ShortPlay/Base/Networking/API/SPVideoAPI.swift @@ -43,7 +43,7 @@ class SPVideoAPI: NSObject { } ///收藏短剧 - static func requestCollectShort(isCollect: Bool, shortPlayId: String, success: (() -> Void)?) { + static func requestCollectShort(isCollect: Bool, shortPlayId: String, videoId: String, success: (() -> Void)?) { let path: String if isCollect { path = "/collect" @@ -54,7 +54,8 @@ class SPVideoAPI: NSObject { var param = SPNetworkParameters(path: path) param.isLoding = true param.parameters = [ - "short_play_id" : shortPlayId + "short_play_id" : shortPlayId, + "video_id" : videoId ] SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in diff --git a/ShortPlay/Base/View/SPTextField.swift b/ShortPlay/Base/View/SPTextField.swift new file mode 100644 index 0000000..6736e3b --- /dev/null +++ b/ShortPlay/Base/View/SPTextField.swift @@ -0,0 +1,142 @@ +// +// SPTextField.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/17. +// + +import UIKit + +class SPTextField: UITextField { + + ///0 不限制字数 + var maxNumber = 0 + + var currentNumber = 0 + + ///是否为手机格式 + var isPhone: Bool = false + + var textDidChange: ((_ text: String) -> Void)? + + var sp_placeholder: String? { + set { + _createAttributedPlaceholder() + let newStr = NSMutableAttributedString(string: newValue ?? "") + newStr.font = self.sp_placeholderFont + newStr.color = self.sp_placeholderColor + _attributedPlaceholder = newStr + self.attributedPlaceholder = _attributedPlaceholder + } + get { + return _attributedPlaceholder?.string + } + } + + var sp_placeholderFont: UIFont? { + + set { + _createAttributedPlaceholder() + _attributedPlaceholder?.font = newValue + self.attributedPlaceholder = _attributedPlaceholder + } + get { + if let font = _attributedPlaceholder?.font { + return font + } else { + return self.font + } + } + } + + var sp_placeholderColor: UIColor? { + set { + _createAttributedPlaceholder() + _attributedPlaceholder?.color = newValue + self.attributedPlaceholder = _attributedPlaceholder + } + get { + if let color = _attributedPlaceholder?.color { + return color + } else { + return .placeholderColor() + } + } + } + + private var _attributedPlaceholder: NSMutableAttributedString? + + + private func _createAttributedPlaceholder() { + if self._attributedPlaceholder == nil { + _attributedPlaceholder = NSMutableAttributedString(string: "") + _attributedPlaceholder?.font = self.font + _attributedPlaceholder?.color = .placeholderColor() + self.attributedPlaceholder = _attributedPlaceholder + } + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + override init(frame: CGRect) { + super.init(frame: frame) + NotificationCenter.default.addObserver(self, selector: #selector(textDidChangeNotification(sender:)), name: UITextField.textDidChangeNotification, object: nil) + +// var iq = self.iq +// iq.enableMode = .enabled + + self.textColor = .colorFFFFFF(alpha: 0.9) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPTextField { + + @objc func textDidChangeNotification(sender: Notification){ + + guard let object = sender.object else { return } + if !(object is UITextField) {return} + if (object as! UITextField) != self {return} + + + let selectedRange: UITextRange? = self.markedTextRange + + + if selectedRange == nil { + + if !self.isPhone { + if maxNumber > 0 { + if self.text?.count ?? 0 > self.maxNumber { + var string = self.text + string?.removeLast(self.text!.count - self.maxNumber) + self.text = string + } + } + if let textDidChange = textDidChange { + textDidChange(self.text ?? "") + } + } else { +// var newString = self.text?.replacingOccurrences(of: " ", with: "") ?? "" +// +// if newString.count > self.maxNumber { +// newString.removeLast(newString.count - self.maxNumber) +// } +// +// self.text = newString.formatToPhone() +// if let textDidChange = textDidChange { +// textDidChange(newString) +// } + } + + self.currentNumber = self.text?.count ?? 0 + } + + } +} + diff --git a/ShortPlay/Class/Home/Controller/SPHomePageController.swift b/ShortPlay/Class/Home/Controller/SPHomePageController.swift index 0d62450..612aa20 100644 --- a/ShortPlay/Class/Home/Controller/SPHomePageController.swift +++ b/ShortPlay/Class/Home/Controller/SPHomePageController.swift @@ -21,6 +21,12 @@ class SPHomePageController: SPViewController { return arr }() + private lazy var searchButton: SPHomeSearchButton = { + let button = SPHomeSearchButton() + button.addTarget(self, action: #selector(handleSearchButton), for: .touchUpInside) + return button + }() + private lazy var pageView: JYPageController = { let customIndicatorImage = UIImage(named: "page_indicator_icon_01") let customIndicator = UIImageView(image: customIndicatorImage) @@ -68,15 +74,32 @@ extension SPHomePageController { private func sp_setupUI() { addChild(pageView) view.addSubview(pageView.view) + view.addSubview(searchButton) pageView.view.snp.makeConstraints { make in // make.edges.equalToSuperview() make.top.equalToSuperview().offset(kSPStatusbarHeight + 66) make.left.right.bottom.equalToSuperview() } + + searchButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(kSPStatusbarHeight + 10) + } } } +extension SPHomePageController { + + @objc private func handleSearchButton() { + let vc = SPSearchViewController() + self.navigationController?.pushViewController(vc, animated: true) + } + + +} + //MARK: -------------- JYPageControllerDelegate & JYPageControllerDataSource -------------- extension SPHomePageController: JYPageControllerDelegate, JYPageControllerDataSource { func pageController(_ pageController: JYPageController, frameForSegmentedView segmentedView: JYSegmentedView) -> CGRect { diff --git a/ShortPlay/Class/Home/Controller/SPSearchViewController.swift b/ShortPlay/Class/Home/Controller/SPSearchViewController.swift new file mode 100644 index 0000000..0454167 --- /dev/null +++ b/ShortPlay/Class/Home/Controller/SPSearchViewController.swift @@ -0,0 +1,72 @@ +// +// SPSearchViewController.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/17. +// + +import UIKit + +class SPSearchViewController: SPViewController { + + private lazy var backButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "arrow_left_icon_01"), for: .normal) + button.addTarget(self, action: #selector(handleBack), for: .touchUpInside) + return button + }() + + private lazy var searchInputView: SPSearchInputView = { + let view = SPSearchInputView() + view.textField.delegate = self + return view + }() + + override func viewDidLoad() { + super.viewDidLoad() + + _setupUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + +} + +extension SPSearchViewController { + + private func _setupUI() { + view.addSubview(backButton) + view.addSubview(searchInputView) + + backButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(5) + make.centerY.equalTo(searchInputView) + make.width.height.equalTo(37) + } + + searchInputView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-15) + make.top.equalToSuperview().offset(kSPStatusbarHeight + 10) + make.left.equalTo(backButton.snp.right).offset(5) + } + + } + +} + +//MARK: -------------- UITextFieldDelegate -------------- +extension SPSearchViewController: UITextFieldDelegate { + + func textFieldDidBeginEditing(_ textField: UITextField) { + spLog(message: "开始编辑") + } + + func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) { + spLog(message: "结束编辑") + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeSearchButton.swift b/ShortPlay/Class/Home/View/SPHomeSearchButton.swift new file mode 100644 index 0000000..ad58549 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeSearchButton.swift @@ -0,0 +1,50 @@ +// +// SPHomeSearchButton.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/17. +// + +import UIKit + +class SPHomeSearchButton: UIControl { + + + override var intrinsicContentSize: CGSize { + return CGSize(width: kSPScreenWidth, height: 38) + } + + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "search_icon_01")) + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + layer.cornerRadius = 19 + layer.masksToBounds = true + + backgroundColor = .colorFFFFFF(alpha: 0.1) + + _setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeSearchButton { + + private func _setupUI() { + addSubview(iconImageView) + + iconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(15) + } + } + + +} diff --git a/ShortPlay/Class/Home/View/SPSearchHomeView.swift b/ShortPlay/Class/Home/View/SPSearchHomeView.swift new file mode 100644 index 0000000..9679ef1 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPSearchHomeView.swift @@ -0,0 +1,14 @@ +// +// SPSearchHomeView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/17. +// + +import UIKit + +class SPSearchHomeView: UIView { + + + +} diff --git a/ShortPlay/Class/Home/View/SPSearchInputView.swift b/ShortPlay/Class/Home/View/SPSearchInputView.swift new file mode 100644 index 0000000..73983f5 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPSearchInputView.swift @@ -0,0 +1,70 @@ +// +// SPSearchInputView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/17. +// + +import UIKit + +class SPSearchInputView: UIView { + + override var intrinsicContentSize: CGSize { + return CGSize(width: kSPScreenWidth, height: 38) + } + + var placeholder: String? { + didSet { + textField.sp_placeholder = placeholder + } + } + + //MARK: UI属性 + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "search_icon_02")) + imageView.setContentHuggingPriority(.required, for: .horizontal) + imageView.setContentCompressionResistancePriority(.required, for: .horizontal) + return imageView + }() + + private(set) lazy var textField: SPTextField = { + let textField = SPTextField() + textField.font = .fontRegular(ofSize: 12) + return textField + }() + + override init(frame: CGRect) { + super.init(frame: frame) + layer.cornerRadius = 19 + layer.masksToBounds = true + backgroundColor = .colorFFFFFF(alpha: 0.1) + + _setupUI() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPSearchInputView { + + private func _setupUI() { + addSubview(iconImageView) + addSubview(textField) + + iconImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.centerY.equalToSuperview() + } + + textField.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.left.equalTo(iconImageView.snp.right).offset(7) + make.right.equalToSuperview().offset(-15) + } + } + +} diff --git a/ShortPlay/Class/Player/View/SPPlayerControlView.swift b/ShortPlay/Class/Player/View/SPPlayerControlView.swift index 8e16b61..344e5bf 100644 --- a/ShortPlay/Class/Player/View/SPPlayerControlView.swift +++ b/ShortPlay/Class/Player/View/SPPlayerControlView.swift @@ -203,10 +203,11 @@ extension SPPlayerControlView { @objc private func handleCollectButton() { guard let shortPlayId = self.videoInfo?.short_play_id else { return } + guard let videoId = self.videoInfo?.short_play_video_id else { return } let isCollect = !(self.shortModel?.is_collect ?? false) - SPVideoAPI.requestCollectShort(isCollect: isCollect, shortPlayId: shortPlayId) { + SPVideoAPI.requestCollectShort(isCollect: isCollect, shortPlayId: shortPlayId, videoId: videoId) { } } diff --git a/ShortPlay/Libs/Login/SPLoginManager.swift b/ShortPlay/Libs/Login/SPLoginManager.swift index a8c3af0..85c45ff 100644 --- a/ShortPlay/Libs/Login/SPLoginManager.swift +++ b/ShortPlay/Libs/Login/SPLoginManager.swift @@ -37,8 +37,6 @@ extension SPLoginManager { return } isRefreshingToken = true -// var loding = true - let param = SPNetworkParameters(path: "/customer/register") SPNetwork.request(parameters: param) { [weak self] (response: SPNetworkResponse) in guard let self = self else { return } @@ -46,12 +44,58 @@ extension SPLoginManager { self.setLoginToken(token: token) } self.isRefreshingToken = false -// loding = false completer?() } -// while loding { -// RunLoop.current.run(mode: .default, before: Date.distantFuture) -// } } + + func performDependentRequestsWithOperations() { + let queue = OperationQueue() + + // 1. 创建初始请求操作 + let initialOperation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + +// initialRequest { result in +// defer { semaphore.signal() } +// +// if result.isSuccess { +// print("初始请求成功") +// } +// } + + semaphore.wait() + } + + // 2. 创建依赖操作 + let request1Operation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + +// request1 { +// print("请求1完成") +// semaphore.signal() +// } + + semaphore.wait() + } + + let request2Operation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + +// request2 { +// print("请求2完成") +// semaphore.signal() +// } + + semaphore.wait() + } + + // 3. 设置依赖关系 + request1Operation.addDependency(initialOperation) + request2Operation.addDependency(initialOperation) + + // 4. 添加操作到队列 + queue.addOperations([initialOperation, request1Operation, request2Operation], waitUntilFinished: false) + } + } diff --git a/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/Contents.json new file mode 100644 index 0000000..d4fc1b3 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "搜索图标@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "搜索图标@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/搜索图标@2x.png b/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/搜索图标@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..efd888e0115f635432946fcc91999790f3915dd6 GIT binary patch literal 1508 zcmVPx)o=HSOR9Hv7n0ri9cNE9J=iY)$%LHW;6dV}bP|?v0%v83}jKprs5{+zTnI_$^ z52{ILvOip8(M8R+Y{^*0qb(|AbB_!X(U8n+CdJ_cT~!P^5KyWEHK-G_>X6cV#=W#i zc?c@?m$d1<_x#TN{J!V+IH!bhwl@8ih-by=uQ4H;ftLv!4?zCN?FN8$Fx3NGGsP=b z({~$gj?=YbMq?R!)|Jj+csDV44S<-j?EOx=8K@RSal6`XJ~Pffqnq6}IIPUlRsy1i zSk;5Li5MOxbVGs~L@5NMF%U7>mH`|0{`YZo`NpmX0gb50E&bO~q>B8B!McIYgnE*s zBKF;_9L=d5zNulevI)rT3)71Gec274xFULY?x^Yv1L@S4#j3*K1ak_A0OocEHcsF9 zLFITP4%pl>IMNuZZ<&#)xB)yQ3A$;!^hZYW69m%vc9B|`8hH$aRKIcczh2+kr1JM4 zDC=l|&a5q}MajvVnRu(;#v=-p8Es!XOqn2%>xLiqGI)i2lfab?EiLbAYd-CL7$rus zy=nNt>H`Y=&)j#sJ({6|8vwa(sCZ9;Z;vwTi4L4={_CxYfCzwf8h_r*jP3nvmG;bV ztX?}9S^;U(mqkQ`tJ}a73-FC@FE30gf9KlcDlxSGHDl%P%$%+0?L)@Q-8rs+jRJDT zu+IvT6zLd}VU}an&WVPQ{r#Q$OR^}2HG-i6p=zdM<;ozC4&(kt2IPIf-Q0X~?nH)U z=zuy5`^%W1SME#Rg!rAS+LdTs&aF;`NDcCZ0LqVdys;w`Y6N^Cws@X)>SQETR7l;BIf+g7U=^zO@e>+&NQyBN3QkAp0CzBBt-lDvNXnSf&>LeHlQQF~KOe1IXqz9>CESqL z_$8P>Qs#$`HJZ`|^$LjmbtbQQ;31KawWwt7p-`yeGM&%Lcrt$bzD zf(l+Ld2ZuGs&dNgUe%X^DtRvfHJXydpsivcLv!leA|jts{R#NMWf(#9ZMIyGImNx{ShUL1o2=1=exX z^>h}6y>e~K+`rW^$QJGs3)3A@7aj$u&T`Y*r*whhkKlnox+Q~PMy-9F#*Uat;*?Sl z?pJKeL`FR^)c|NELYE{7-2$t`#69J!O!GNR;d4hi~#y$K<$pNXmaC za&x1*yGvUhJ?_%9*3x5@0@WYE^++HOk3MpbL+g1xL;9Q;U;Phf?I1Wou>bo20000< KMNUMnLSTYcT+y-s literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/搜索图标@3x.png b/ShortPlay/Source/Assets.xcassets/icon/search_icon_01.imageset/搜索图标@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2344ad540a1367000950eb7385a32c91f71e30b2 GIT binary patch literal 2846 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 literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/Contents.json new file mode 100644 index 0000000..d4fc1b3 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "搜索图标@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "搜索图标@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/搜索图标@2x.png b/ShortPlay/Source/Assets.xcassets/icon/search_icon_02.imageset/搜索图标@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e63fd6aea48f73ca748147349810fcb2e9df98bc GIT binary patch literal 1000 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