Explorar el Código

商品列表筛选页面完成;
搜索分类页面开发

iOS-Abel hace 2 años
padre
commit
87703624d1
Se han modificado 98 ficheros con 3756 adiciones y 20 borrados
  1. 232 0
      Asteria.xcodeproj/project.pbxproj
  2. 1 0
      Asteria/ASUI/ColorDefine.h
  3. 2 0
      Asteria/ASUI/Extensions/UIView+PublicInit.h
  4. 9 0
      Asteria/ASUI/Extensions/UIView+PublicInit.m
  5. 2 0
      Asteria/ASUI/SizeDefine.h
  6. 1 1
      Asteria/AppDelegate.m
  7. 22 0
      Asteria/Assets.xcassets/tabbar/tab_cart.imageset/Contents.json
  8. BIN
      Asteria/Assets.xcassets/tabbar/tab_cart.imageset/购物车-未点击@2x.png
  9. BIN
      Asteria/Assets.xcassets/tabbar/tab_cart.imageset/购物车-未点击@3x.png
  10. 22 0
      Asteria/Assets.xcassets/tabbar/tab_cart_sel.imageset/Contents.json
  11. BIN
      Asteria/Assets.xcassets/tabbar/tab_cart_sel.imageset/购物车-点击@2x.png
  12. BIN
      Asteria/Assets.xcassets/tabbar/tab_cart_sel.imageset/购物车-点击@3x.png
  13. 22 0
      Asteria/Assets.xcassets/tabbar/tab_category.imageset/Contents.json
  14. BIN
      Asteria/Assets.xcassets/tabbar/tab_category.imageset/分类-未点击@2x.png
  15. BIN
      Asteria/Assets.xcassets/tabbar/tab_category.imageset/分类-未点击@3x.png
  16. 2 2
      Asteria/Assets.xcassets/tabbar/tab_search.imageset/Contents.json
  17. BIN
      Asteria/Assets.xcassets/tabbar/tab_category_sel.imageset/分类-点击@2x.png
  18. BIN
      Asteria/Assets.xcassets/tabbar/tab_category_sel.imageset/分类-点击@3x.png
  19. 2 2
      Asteria/Assets.xcassets/tabbar/tab_home.imageset/Contents.json
  20. BIN
      Asteria/Assets.xcassets/tabbar/tab_home.imageset/tab_home@2x.png
  21. BIN
      Asteria/Assets.xcassets/tabbar/tab_home.imageset/tab_home@3x.png
  22. BIN
      Asteria/Assets.xcassets/tabbar/tab_home.imageset/首页-未点击@2x.png
  23. BIN
      Asteria/Assets.xcassets/tabbar/tab_home.imageset/首页-未点击@3x.png
  24. 2 2
      Asteria/Assets.xcassets/tabbar/tab_mine.imageset/Contents.json
  25. BIN
      Asteria/Assets.xcassets/tabbar/tab_home_sel.imageset/首页-点击@2x.png
  26. BIN
      Asteria/Assets.xcassets/tabbar/tab_home_sel.imageset/首页-点击@3x.png
  27. 22 0
      Asteria/Assets.xcassets/tabbar/tab_me.imageset/Contents.json
  28. BIN
      Asteria/Assets.xcassets/tabbar/tab_me.imageset/我的-未选中@2x.png
  29. BIN
      Asteria/Assets.xcassets/tabbar/tab_me.imageset/我的-未选中@3x.png
  30. 22 0
      Asteria/Assets.xcassets/tabbar/tab_me_sel.imageset/Contents.json
  31. BIN
      Asteria/Assets.xcassets/tabbar/tab_me_sel.imageset/我的-选中@2x.png
  32. BIN
      Asteria/Assets.xcassets/tabbar/tab_me_sel.imageset/我的-选中@3x.png
  33. BIN
      Asteria/Assets.xcassets/tabbar/tab_mine.imageset/tab_mine@2x.png
  34. BIN
      Asteria/Assets.xcassets/tabbar/tab_mine.imageset/tab_mine@3x.png
  35. BIN
      Asteria/Assets.xcassets/tabbar/tab_search.imageset/tab_search@2x.png
  36. BIN
      Asteria/Assets.xcassets/tabbar/tab_search.imageset/tab_search@3x.png
  37. 24 0
      Asteria/Fuction/Category/Target_Category.h
  38. 31 0
      Asteria/Fuction/Category/Target_Category.m
  39. 24 0
      Asteria/Fuction/Category/v/KWMoneyTypeHeadView.h
  40. 139 0
      Asteria/Fuction/Category/v/KWMoneyTypeHeadView.m
  41. 21 0
      Asteria/Fuction/Category/v/KWSearchMainTypeCell.h
  42. 64 0
      Asteria/Fuction/Category/v/KWSearchMainTypeCell.m
  43. 25 0
      Asteria/Fuction/Category/v/KWSearchMainTypeTableView.h
  44. 83 0
      Asteria/Fuction/Category/v/KWSearchMainTypeTableView.m
  45. 22 0
      Asteria/Fuction/Category/v/KWSearchSubTypeCell.h
  46. 135 0
      Asteria/Fuction/Category/v/KWSearchSubTypeCell.m
  47. 25 0
      Asteria/Fuction/Category/v/KWSearchSubTypeHeadView.h
  48. 153 0
      Asteria/Fuction/Category/v/KWSearchSubTypeHeadView.m
  49. 24 0
      Asteria/Fuction/Category/v/KWSearchSubTypeTableView.h
  50. 128 0
      Asteria/Fuction/Category/v/KWSearchSubTypeTableView.m
  51. 22 0
      Asteria/Fuction/Category/vc/APCategoryViewController.h
  52. 87 0
      Asteria/Fuction/Category/vc/APCategoryViewController.m
  53. 16 0
      Asteria/Fuction/Category/vc/APOnlySearchViewController.h
  54. 68 0
      Asteria/Fuction/Category/vc/APOnlySearchViewController.m
  55. 31 0
      Asteria/Fuction/Category/vc/KWSearchViewController.h
  56. 404 0
      Asteria/Fuction/Category/vc/KWSearchViewController.m
  57. 29 0
      Asteria/Fuction/Category/vm/KWHisAndHotWordsViewModel.h
  58. 104 0
      Asteria/Fuction/Category/vm/KWHisAndHotWordsViewModel.m
  59. 26 0
      Asteria/Fuction/Category/vm/KWSearchViewModel.h
  60. 106 0
      Asteria/Fuction/Category/vm/KWSearchViewModel.m
  61. 8 0
      Asteria/Fuction/Home/ASProductListViewController.h
  62. 75 3
      Asteria/Fuction/Home/ASProductListViewController.m
  63. 22 0
      Asteria/Fuction/Home/Home.xcassets/productlist/productLsit_filter_close.imageset/Contents.json
  64. BIN
      Asteria/Fuction/Home/Home.xcassets/productlist/productLsit_filter_close.imageset/productLsit_filter_close@2x.png
  65. BIN
      Asteria/Fuction/Home/Home.xcassets/productlist/productLsit_filter_close.imageset/productLsit_filter_close@3x.png
  66. 22 0
      Asteria/Fuction/Home/Home.xcassets/productlist/product_menu_clear.imageset/Contents.json
  67. BIN
      Asteria/Fuction/Home/Home.xcassets/productlist/product_menu_clear.imageset/product_menu_clear@2x.png
  68. BIN
      Asteria/Fuction/Home/Home.xcassets/productlist/product_menu_clear.imageset/product_menu_clear@3x.png
  69. 41 0
      Asteria/Fuction/Home/Models/KWProductListFilterModel.h
  70. 81 0
      Asteria/Fuction/Home/Models/KWProductListFilterModel.m
  71. 11 0
      Asteria/Fuction/Home/Target_Home.h
  72. 30 0
      Asteria/Fuction/Home/Target_Home.m
  73. 1 1
      Asteria/Fuction/Home/Views/productList/ASProductListMenuHeaderView.h
  74. 1 1
      Asteria/Fuction/Home/Views/productList/ASProductListMenuHeaderView.m
  75. 20 0
      Asteria/Fuction/Home/Views/productList/ASProductListSortFilterCell.h
  76. 71 0
      Asteria/Fuction/Home/Views/productList/ASProductListSortFilterCell.m
  77. 22 0
      Asteria/Fuction/Home/Views/productList/ASProductSortFilterView.h
  78. 199 0
      Asteria/Fuction/Home/Views/productList/ASProductSortFilterView.m
  79. 20 0
      Asteria/Fuction/Home/Views/productList/ASProductlistFilterPriceCollectCell.h
  80. 129 0
      Asteria/Fuction/Home/Views/productList/ASProductlistFilterPriceCollectCell.m
  81. 21 0
      Asteria/Fuction/Home/Views/productList/KWProductFilterItemCell.h
  82. 85 0
      Asteria/Fuction/Home/Views/productList/KWProductFilterItemCell.m
  83. 18 0
      Asteria/Fuction/Home/Views/productList/KWProductMenuFilterItemHeaderView.h
  84. 59 0
      Asteria/Fuction/Home/Views/productList/KWProductMenuFilterItemHeaderView.m
  85. 37 0
      Asteria/Fuction/Home/Views/productList/KWProductMenuFilterView.h
  86. 383 0
      Asteria/Fuction/Home/Views/productList/KWProductMenuFilterView.m
  87. 16 0
      Asteria/Fuction/Home/alert/ASHomeAlertViewController.h
  88. 23 0
      Asteria/Fuction/Home/alert/ASHomeAlertViewController.m
  89. 29 0
      Asteria/Fuction/Home/alert/ASHomeAlertWindow.h
  90. 67 0
      Asteria/Fuction/Home/alert/ASHomeAlertWindow.m
  91. 5 0
      Asteria/Fuction/Home/vm/ASProductListViewModel.h
  92. 31 0
      Asteria/Fuction/Home/vm/ASProductListViewModel.m
  93. 1 0
      Asteria/PreFixHeader.h
  94. 22 0
      Asteria/Product/CTMediatoaTargets/CTMediator+Categorys.h
  95. 25 0
      Asteria/Product/CTMediatoaTargets/CTMediator+Categorys.m
  96. 11 0
      Asteria/Product/CTMediatoaTargets/CTMediator+Home.h
  97. 4 0
      Asteria/Product/CTMediatoaTargets/CTMediator+Home.m
  98. 12 8
      Asteria/Tabber/AS_TabBarViewController.m

+ 232 - 0
Asteria.xcodeproj/project.pbxproj

@@ -65,6 +65,35 @@
 		8160201F2A2F11AB00E4A8F1 /* ASHomeTipCollectCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8160201E2A2F11AB00E4A8F1 /* ASHomeTipCollectCell.m */; };
 		816020222A2F1C6A00E4A8F1 /* ASHomeBestSellCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 816020212A2F1C6A00E4A8F1 /* ASHomeBestSellCell.m */; };
 		816020252A2F1C9E00E4A8F1 /* ASHomeMainListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 816020242A2F1C9E00E4A8F1 /* ASHomeMainListModel.m */; };
+		81717C912A3BE39C00648139 /* ASProductSortFilterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717C902A3BE39C00648139 /* ASProductSortFilterView.m */; };
+		81717C942A3BE4E000648139 /* ASProductListSortFilterCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717C932A3BE4E000648139 /* ASProductListSortFilterCell.m */; };
+		81717C992A3BF1DD00648139 /* ASHomeAlertWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717C982A3BF1DD00648139 /* ASHomeAlertWindow.m */; };
+		81717C9C2A3BF1F100648139 /* ASHomeAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717C9B2A3BF1F100648139 /* ASHomeAlertViewController.m */; };
+		81717CA12A3C0A3500648139 /* KWProductMenuFilterItemHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717C9D2A3C0A3400648139 /* KWProductMenuFilterItemHeaderView.m */; };
+		81717CA22A3C0A3500648139 /* KWProductMenuFilterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717C9F2A3C0A3500648139 /* KWProductMenuFilterView.m */; };
+		81717CA52A3C0A5000648139 /* KWProductFilterItemCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CA42A3C0A5000648139 /* KWProductFilterItemCell.m */; };
+		81717CA82A3C0AAA00648139 /* KWProductListFilterModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CA62A3C0AA900648139 /* KWProductListFilterModel.m */; };
+		81717CAB2A3C359E00648139 /* ASProductlistFilterPriceCollectCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CAA2A3C359E00648139 /* ASProductlistFilterPriceCollectCell.m */; };
+		81717D102A3C4AE000648139 /* KWHisAndHotWordsViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CE62A3C4ADE00648139 /* KWHisAndHotWordsViewModel.m */; };
+		81717D112A3C4AE000648139 /* KWSearchViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CE72A3C4ADE00648139 /* KWSearchViewModel.m */; };
+		81717D122A3C4AE000648139 /* APOnlySearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CEB2A3C4ADE00648139 /* APOnlySearchViewController.m */; };
+		81717D132A3C4AE000648139 /* KWSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CEF2A3C4ADE00648139 /* KWSearchViewController.m */; };
+		81717D142A3C4AE000648139 /* APCategoryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CF02A3C4ADE00648139 /* APCategoryViewController.m */; };
+		81717D152A3C4AE000648139 /* KWHisKeyWordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CF32A3C4ADF00648139 /* KWHisKeyWordCell.m */; };
+		81717D162A3C4AE000648139 /* KWHisAndHotWordsView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CF62A3C4ADF00648139 /* KWHisAndHotWordsView.m */; };
+		81717D172A3C4AE000648139 /* KWHisCollectHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CF72A3C4ADF00648139 /* KWHisCollectHeaderView.m */; };
+		81717D182A3C4AE000648139 /* KWCustomLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CFA2A3C4ADF00648139 /* KWCustomLayout.m */; };
+		81717D192A3C4AE000648139 /* KWNoHisWordsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CFB2A3C4ADF00648139 /* KWNoHisWordsCell.m */; };
+		81717D1A2A3C4AE000648139 /* KWLenovoWordListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717CFC2A3C4ADF00648139 /* KWLenovoWordListView.m */; };
+		81717D1C2A3C4AE000648139 /* KWSearchSubTypeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D022A3C4ADF00648139 /* KWSearchSubTypeModel.m */; };
+		81717D1D2A3C4AE000648139 /* KWSearchSubTypeHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D042A3C4AE000648139 /* KWSearchSubTypeHeadView.m */; };
+		81717D1E2A3C4AE000648139 /* KWSearchMainTypeTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D062A3C4AE000648139 /* KWSearchMainTypeTableView.m */; };
+		81717D1F2A3C4AE000648139 /* KWMoneyTypeHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D072A3C4AE000648139 /* KWMoneyTypeHeadView.m */; };
+		81717D202A3C4AE000648139 /* KWSearchSubTypeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D0B2A3C4AE000648139 /* KWSearchSubTypeCell.m */; };
+		81717D212A3C4AE000648139 /* KWSearchSubTypeTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D0E2A3C4AE000648139 /* KWSearchSubTypeTableView.m */; };
+		81717D222A3C4AE000648139 /* KWSearchMainTypeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D0F2A3C4AE000648139 /* KWSearchMainTypeCell.m */; };
+		81717D252A3C512700648139 /* Target_Category.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D242A3C512700648139 /* Target_Category.m */; };
+		81717D282A3C55CC00648139 /* CTMediator+Categorys.m in Sources */ = {isa = PBXBuildFile; fileRef = 81717D272A3C55CC00648139 /* CTMediator+Categorys.m */; };
 		8172449F29F3B2ED005FA9C9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8172449E29F3B2ED005FA9C9 /* AppDelegate.m */; };
 		817244AA29F3B2EE005FA9C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 817244A929F3B2EE005FA9C9 /* Assets.xcassets */; };
 		817244AD29F3B2EE005FA9C9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 817244AB29F3B2EE005FA9C9 /* LaunchScreen.storyboard */; };
@@ -292,6 +321,64 @@
 		816020212A2F1C6A00E4A8F1 /* ASHomeBestSellCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASHomeBestSellCell.m; sourceTree = "<group>"; };
 		816020232A2F1C9E00E4A8F1 /* ASHomeMainListModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASHomeMainListModel.h; sourceTree = "<group>"; };
 		816020242A2F1C9E00E4A8F1 /* ASHomeMainListModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASHomeMainListModel.m; sourceTree = "<group>"; };
+		81717C8F2A3BE39C00648139 /* ASProductSortFilterView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASProductSortFilterView.h; sourceTree = "<group>"; };
+		81717C902A3BE39C00648139 /* ASProductSortFilterView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASProductSortFilterView.m; sourceTree = "<group>"; };
+		81717C922A3BE4E000648139 /* ASProductListSortFilterCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASProductListSortFilterCell.h; sourceTree = "<group>"; };
+		81717C932A3BE4E000648139 /* ASProductListSortFilterCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASProductListSortFilterCell.m; sourceTree = "<group>"; };
+		81717C972A3BF1DD00648139 /* ASHomeAlertWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASHomeAlertWindow.h; sourceTree = "<group>"; };
+		81717C982A3BF1DD00648139 /* ASHomeAlertWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASHomeAlertWindow.m; sourceTree = "<group>"; };
+		81717C9A2A3BF1F100648139 /* ASHomeAlertViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASHomeAlertViewController.h; sourceTree = "<group>"; };
+		81717C9B2A3BF1F100648139 /* ASHomeAlertViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASHomeAlertViewController.m; sourceTree = "<group>"; };
+		81717C9D2A3C0A3400648139 /* KWProductMenuFilterItemHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWProductMenuFilterItemHeaderView.m; sourceTree = "<group>"; };
+		81717C9E2A3C0A3500648139 /* KWProductMenuFilterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWProductMenuFilterView.h; sourceTree = "<group>"; };
+		81717C9F2A3C0A3500648139 /* KWProductMenuFilterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWProductMenuFilterView.m; sourceTree = "<group>"; };
+		81717CA02A3C0A3500648139 /* KWProductMenuFilterItemHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWProductMenuFilterItemHeaderView.h; sourceTree = "<group>"; };
+		81717CA32A3C0A5000648139 /* KWProductFilterItemCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWProductFilterItemCell.h; sourceTree = "<group>"; };
+		81717CA42A3C0A5000648139 /* KWProductFilterItemCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWProductFilterItemCell.m; sourceTree = "<group>"; };
+		81717CA62A3C0AA900648139 /* KWProductListFilterModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWProductListFilterModel.m; sourceTree = "<group>"; };
+		81717CA72A3C0AAA00648139 /* KWProductListFilterModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWProductListFilterModel.h; sourceTree = "<group>"; };
+		81717CA92A3C359E00648139 /* ASProductlistFilterPriceCollectCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASProductlistFilterPriceCollectCell.h; sourceTree = "<group>"; };
+		81717CAA2A3C359E00648139 /* ASProductlistFilterPriceCollectCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASProductlistFilterPriceCollectCell.m; sourceTree = "<group>"; };
+		81717CE62A3C4ADE00648139 /* KWHisAndHotWordsViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWHisAndHotWordsViewModel.m; sourceTree = "<group>"; };
+		81717CE72A3C4ADE00648139 /* KWSearchViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchViewModel.m; sourceTree = "<group>"; };
+		81717CE82A3C4ADE00648139 /* KWSearchViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchViewModel.h; sourceTree = "<group>"; };
+		81717CE92A3C4ADE00648139 /* KWHisAndHotWordsViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWHisAndHotWordsViewModel.h; sourceTree = "<group>"; };
+		81717CEB2A3C4ADE00648139 /* APOnlySearchViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APOnlySearchViewController.m; sourceTree = "<group>"; };
+		81717CEC2A3C4ADE00648139 /* APCategoryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCategoryViewController.h; sourceTree = "<group>"; };
+		81717CED2A3C4ADE00648139 /* KWSearchViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchViewController.h; sourceTree = "<group>"; };
+		81717CEE2A3C4ADE00648139 /* APOnlySearchViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APOnlySearchViewController.h; sourceTree = "<group>"; };
+		81717CEF2A3C4ADE00648139 /* KWSearchViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchViewController.m; sourceTree = "<group>"; };
+		81717CF02A3C4ADE00648139 /* APCategoryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCategoryViewController.m; sourceTree = "<group>"; };
+		81717CF32A3C4ADF00648139 /* KWHisKeyWordCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWHisKeyWordCell.m; sourceTree = "<group>"; };
+		81717CF42A3C4ADF00648139 /* KWNoHisWordsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWNoHisWordsCell.h; sourceTree = "<group>"; };
+		81717CF52A3C4ADF00648139 /* KWCustomLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWCustomLayout.h; sourceTree = "<group>"; };
+		81717CF62A3C4ADF00648139 /* KWHisAndHotWordsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWHisAndHotWordsView.m; sourceTree = "<group>"; };
+		81717CF72A3C4ADF00648139 /* KWHisCollectHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWHisCollectHeaderView.m; sourceTree = "<group>"; };
+		81717CF82A3C4ADF00648139 /* KWLenovoWordListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWLenovoWordListView.h; sourceTree = "<group>"; };
+		81717CF92A3C4ADF00648139 /* KWHisKeyWordCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWHisKeyWordCell.h; sourceTree = "<group>"; };
+		81717CFA2A3C4ADF00648139 /* KWCustomLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWCustomLayout.m; sourceTree = "<group>"; };
+		81717CFB2A3C4ADF00648139 /* KWNoHisWordsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWNoHisWordsCell.m; sourceTree = "<group>"; };
+		81717CFC2A3C4ADF00648139 /* KWLenovoWordListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWLenovoWordListView.m; sourceTree = "<group>"; };
+		81717CFD2A3C4ADF00648139 /* KWHisCollectHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWHisCollectHeaderView.h; sourceTree = "<group>"; };
+		81717CFE2A3C4ADF00648139 /* KWHisAndHotWordsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWHisAndHotWordsView.h; sourceTree = "<group>"; };
+		81717D012A3C4ADF00648139 /* KWSearchSubTypeModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchSubTypeModel.h; sourceTree = "<group>"; };
+		81717D022A3C4ADF00648139 /* KWSearchSubTypeModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchSubTypeModel.m; sourceTree = "<group>"; };
+		81717D042A3C4AE000648139 /* KWSearchSubTypeHeadView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchSubTypeHeadView.m; sourceTree = "<group>"; };
+		81717D052A3C4AE000648139 /* KWSearchSubTypeTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchSubTypeTableView.h; sourceTree = "<group>"; };
+		81717D062A3C4AE000648139 /* KWSearchMainTypeTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchMainTypeTableView.m; sourceTree = "<group>"; };
+		81717D072A3C4AE000648139 /* KWMoneyTypeHeadView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWMoneyTypeHeadView.m; sourceTree = "<group>"; };
+		81717D082A3C4AE000648139 /* KWSearchSubTypeCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchSubTypeCell.h; sourceTree = "<group>"; };
+		81717D092A3C4AE000648139 /* KWSearchMainTypeCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchMainTypeCell.h; sourceTree = "<group>"; };
+		81717D0A2A3C4AE000648139 /* KWSearchSubTypeHeadView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchSubTypeHeadView.h; sourceTree = "<group>"; };
+		81717D0B2A3C4AE000648139 /* KWSearchSubTypeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchSubTypeCell.m; sourceTree = "<group>"; };
+		81717D0C2A3C4AE000648139 /* KWMoneyTypeHeadView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWMoneyTypeHeadView.h; sourceTree = "<group>"; };
+		81717D0D2A3C4AE000648139 /* KWSearchMainTypeTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSearchMainTypeTableView.h; sourceTree = "<group>"; };
+		81717D0E2A3C4AE000648139 /* KWSearchSubTypeTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchSubTypeTableView.m; sourceTree = "<group>"; };
+		81717D0F2A3C4AE000648139 /* KWSearchMainTypeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSearchMainTypeCell.m; sourceTree = "<group>"; };
+		81717D232A3C512700648139 /* Target_Category.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Target_Category.h; sourceTree = "<group>"; };
+		81717D242A3C512700648139 /* Target_Category.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Target_Category.m; sourceTree = "<group>"; };
+		81717D262A3C55CC00648139 /* CTMediator+Categorys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CTMediator+Categorys.h"; sourceTree = "<group>"; };
+		81717D272A3C55CC00648139 /* CTMediator+Categorys.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "CTMediator+Categorys.m"; sourceTree = "<group>"; };
 		8172449A29F3B2ED005FA9C9 /* Asteria.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Asteria.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		8172449D29F3B2ED005FA9C9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
 		8172449E29F3B2ED005FA9C9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@@ -643,6 +730,7 @@
 		81601FE32A2D938B00E4A8F1 /* Home */ = {
 			isa = PBXGroup;
 			children = (
+				81717C962A3BF1AD00648139 /* alert */,
 				81C326672A36F019002EF442 /* vm */,
 				816020142A2F065700E4A8F1 /* Home.xcassets */,
 				81601FE42A2DB19300E4A8F1 /* ASHomeViewController.h */,
@@ -722,6 +810,8 @@
 				816020172A2F070B00E4A8F1 /* ASHomeCategoryModel.m */,
 				816020232A2F1C9E00E4A8F1 /* ASHomeMainListModel.h */,
 				816020242A2F1C9E00E4A8F1 /* ASHomeMainListModel.m */,
+				81717CA72A3C0AAA00648139 /* KWProductListFilterModel.h */,
+				81717CA62A3C0AA900648139 /* KWProductListFilterModel.m */,
 			);
 			path = Models;
 			sourceTree = "<group>";
@@ -743,6 +833,104 @@
 			path = someViews;
 			sourceTree = "<group>";
 		};
+		81717C962A3BF1AD00648139 /* alert */ = {
+			isa = PBXGroup;
+			children = (
+				81717C972A3BF1DD00648139 /* ASHomeAlertWindow.h */,
+				81717C982A3BF1DD00648139 /* ASHomeAlertWindow.m */,
+				81717C9A2A3BF1F100648139 /* ASHomeAlertViewController.h */,
+				81717C9B2A3BF1F100648139 /* ASHomeAlertViewController.m */,
+			);
+			path = alert;
+			sourceTree = "<group>";
+		};
+		81717CAC2A3C453900648139 /* Category */ = {
+			isa = PBXGroup;
+			children = (
+				81717D002A3C4ADF00648139 /* m */,
+				81717CF22A3C4ADF00648139 /* tipV */,
+				81717D032A3C4AE000648139 /* v */,
+				81717CEA2A3C4ADE00648139 /* vc */,
+				81717CE52A3C4ADE00648139 /* vm */,
+				81717D232A3C512700648139 /* Target_Category.h */,
+				81717D242A3C512700648139 /* Target_Category.m */,
+			);
+			path = Category;
+			sourceTree = "<group>";
+		};
+		81717CE52A3C4ADE00648139 /* vm */ = {
+			isa = PBXGroup;
+			children = (
+				81717CE92A3C4ADE00648139 /* KWHisAndHotWordsViewModel.h */,
+				81717CE62A3C4ADE00648139 /* KWHisAndHotWordsViewModel.m */,
+				81717CE82A3C4ADE00648139 /* KWSearchViewModel.h */,
+				81717CE72A3C4ADE00648139 /* KWSearchViewModel.m */,
+			);
+			path = vm;
+			sourceTree = "<group>";
+		};
+		81717CEA2A3C4ADE00648139 /* vc */ = {
+			isa = PBXGroup;
+			children = (
+				81717CEE2A3C4ADE00648139 /* APOnlySearchViewController.h */,
+				81717CEB2A3C4ADE00648139 /* APOnlySearchViewController.m */,
+				81717CEC2A3C4ADE00648139 /* APCategoryViewController.h */,
+				81717CF02A3C4ADE00648139 /* APCategoryViewController.m */,
+				81717CED2A3C4ADE00648139 /* KWSearchViewController.h */,
+				81717CEF2A3C4ADE00648139 /* KWSearchViewController.m */,
+			);
+			path = vc;
+			sourceTree = "<group>";
+		};
+		81717CF22A3C4ADF00648139 /* tipV */ = {
+			isa = PBXGroup;
+			children = (
+				81717CF32A3C4ADF00648139 /* KWHisKeyWordCell.m */,
+				81717CF42A3C4ADF00648139 /* KWNoHisWordsCell.h */,
+				81717CF52A3C4ADF00648139 /* KWCustomLayout.h */,
+				81717CF62A3C4ADF00648139 /* KWHisAndHotWordsView.m */,
+				81717CF72A3C4ADF00648139 /* KWHisCollectHeaderView.m */,
+				81717CF82A3C4ADF00648139 /* KWLenovoWordListView.h */,
+				81717CF92A3C4ADF00648139 /* KWHisKeyWordCell.h */,
+				81717CFA2A3C4ADF00648139 /* KWCustomLayout.m */,
+				81717CFB2A3C4ADF00648139 /* KWNoHisWordsCell.m */,
+				81717CFC2A3C4ADF00648139 /* KWLenovoWordListView.m */,
+				81717CFD2A3C4ADF00648139 /* KWHisCollectHeaderView.h */,
+				81717CFE2A3C4ADF00648139 /* KWHisAndHotWordsView.h */,
+			);
+			name = tipV;
+			path = ../../../../AP/westkissMob/westkissMob/Fuction/Search/tipV;
+			sourceTree = "<group>";
+		};
+		81717D002A3C4ADF00648139 /* m */ = {
+			isa = PBXGroup;
+			children = (
+				81717D012A3C4ADF00648139 /* KWSearchSubTypeModel.h */,
+				81717D022A3C4ADF00648139 /* KWSearchSubTypeModel.m */,
+			);
+			name = m;
+			path = ../../../../AP/westkissMob/westkissMob/Fuction/Search/m;
+			sourceTree = "<group>";
+		};
+		81717D032A3C4AE000648139 /* v */ = {
+			isa = PBXGroup;
+			children = (
+				81717D0A2A3C4AE000648139 /* KWSearchSubTypeHeadView.h */,
+				81717D042A3C4AE000648139 /* KWSearchSubTypeHeadView.m */,
+				81717D052A3C4AE000648139 /* KWSearchSubTypeTableView.h */,
+				81717D0E2A3C4AE000648139 /* KWSearchSubTypeTableView.m */,
+				81717D0D2A3C4AE000648139 /* KWSearchMainTypeTableView.h */,
+				81717D062A3C4AE000648139 /* KWSearchMainTypeTableView.m */,
+				81717D0C2A3C4AE000648139 /* KWMoneyTypeHeadView.h */,
+				81717D072A3C4AE000648139 /* KWMoneyTypeHeadView.m */,
+				81717D082A3C4AE000648139 /* KWSearchSubTypeCell.h */,
+				81717D0B2A3C4AE000648139 /* KWSearchSubTypeCell.m */,
+				81717D092A3C4AE000648139 /* KWSearchMainTypeCell.h */,
+				81717D0F2A3C4AE000648139 /* KWSearchMainTypeCell.m */,
+			);
+			path = v;
+			sourceTree = "<group>";
+		};
 		8172449129F3B2EC005FA9C9 = {
 			isa = PBXGroup;
 			children = (
@@ -836,6 +1024,18 @@
 				815DA3DB2A39625200616EF7 /* ASProductListTypeDesCell.m */,
 				815DA3DD2A396BD300616EF7 /* ASMoreBtCell.h */,
 				815DA3DE2A396BD300616EF7 /* ASMoreBtCell.m */,
+				81717C8F2A3BE39C00648139 /* ASProductSortFilterView.h */,
+				81717C902A3BE39C00648139 /* ASProductSortFilterView.m */,
+				81717C922A3BE4E000648139 /* ASProductListSortFilterCell.h */,
+				81717C932A3BE4E000648139 /* ASProductListSortFilterCell.m */,
+				81717CA02A3C0A3500648139 /* KWProductMenuFilterItemHeaderView.h */,
+				81717C9D2A3C0A3400648139 /* KWProductMenuFilterItemHeaderView.m */,
+				81717CA32A3C0A5000648139 /* KWProductFilterItemCell.h */,
+				81717CA42A3C0A5000648139 /* KWProductFilterItemCell.m */,
+				81717C9E2A3C0A3500648139 /* KWProductMenuFilterView.h */,
+				81717C9F2A3C0A3500648139 /* KWProductMenuFilterView.m */,
+				81717CA92A3C359E00648139 /* ASProductlistFilterPriceCollectCell.h */,
+				81717CAA2A3C359E00648139 /* ASProductlistFilterPriceCollectCell.m */,
 			);
 			path = productList;
 			sourceTree = "<group>";
@@ -1033,6 +1233,8 @@
 				816020092A2DD59E00E4A8F1 /* CTMediator+Home.m */,
 				8160200B2A2DD5C000E4A8F1 /* CTMediator+UserCenter.h */,
 				8160200C2A2DD5C000E4A8F1 /* CTMediator+UserCenter.m */,
+				81717D262A3C55CC00648139 /* CTMediator+Categorys.h */,
+				81717D272A3C55CC00648139 /* CTMediator+Categorys.m */,
 			);
 			path = CTMediatoaTargets;
 			sourceTree = "<group>";
@@ -1233,6 +1435,7 @@
 		9AD364CC2A05EBE800452C7A /* Fuction */ = {
 			isa = PBXGroup;
 			children = (
+				81717CAC2A3C453900648139 /* Category */,
 				81601FE32A2D938B00E4A8F1 /* Home */,
 				9A5C64522A11E58F00CBB185 /* Login */,
 				81D484DD2A0F40510075DC43 /* UserCenter */,
@@ -1530,10 +1733,12 @@
 				9AD345F82A08D60F005CA070 /* ZFPlayerGestureControl.m in Sources */,
 				81C326712A37020A002EF442 /* ASProductListMenuHeaderView.m in Sources */,
 				81601FF92A2DC78300E4A8F1 /* WMZBannerControl.m in Sources */,
+				81717C912A3BE39C00648139 /* ASProductSortFilterView.m in Sources */,
 				9AD345FA2A08D60F005CA070 /* ZFLandscapeWindow.m in Sources */,
 				81E257EE2A120756004EEF71 /* ASUserCenterTopView.m in Sources */,
 				81C326622A36B33B002EF442 /* ASHomeActiveView.m in Sources */,
 				9AD346042A08D60F005CA070 /* ZFKVOController.m in Sources */,
+				81717CA12A3C0A3500648139 /* KWProductMenuFilterItemHeaderView.m in Sources */,
 				81C326662A36B794002EF442 /* VerScrollTextView.m in Sources */,
 				9A8DD8C82A0B93F700573324 /* GoodsDetailsVM.m in Sources */,
 				9AD346132A08D60F005CA070 /* ZFLoadingView.m in Sources */,
@@ -1546,17 +1751,22 @@
 				81EC47722A3402CA00516573 /* ASHomeFlashDealCell.m in Sources */,
 				81601FF82A2DC78300E4A8F1 /* WMZBannerView.m in Sources */,
 				817244B029F3B2EE005FA9C9 /* main.m in Sources */,
+				81717D202A3C4AE000648139 /* KWSearchSubTypeCell.m in Sources */,
 				816020252A2F1C9E00E4A8F1 /* ASHomeMainListModel.m in Sources */,
+				81717CA82A3C0AAA00648139 /* KWProductListFilterModel.m in Sources */,
+				81717D252A3C512700648139 /* Target_Category.m in Sources */,
 				9AD346102A08D60F005CA070 /* ZFSliderView.m in Sources */,
 				9A337E4E2A04F46600D058A5 /* AViewController.m in Sources */,
 				81601FFA2A2DC78300E4A8F1 /* WMZBannerFadeLayout.m in Sources */,
 				816020182A2F070B00E4A8F1 /* ASHomeCategoryModel.m in Sources */,
 				8134C1B72A1359E6006EB0EC /* ASSignDayView.m in Sources */,
 				81601FF72A2DC78300E4A8F1 /* WMZBannerParam.m in Sources */,
+				81717CA22A3C0A3500648139 /* KWProductMenuFilterView.m in Sources */,
 				9AD346112A08D60F005CA070 /* ZFPlayerControlView.m in Sources */,
 				9AD345B12A08D5ED005CA070 /* GoodsBannerCollectionViewCell.m in Sources */,
 				9AD345B22A08D5ED005CA070 /* GoodsVideoCollectionViewCell.m in Sources */,
 				814F5CEF2A11B1F2003847A9 /* ASUserCenterViewController.m in Sources */,
+				81717D1C2A3C4AE000648139 /* KWSearchSubTypeModel.m in Sources */,
 				8160201F2A2F11AB00E4A8F1 /* ASHomeTipCollectCell.m in Sources */,
 				816020042A2DCC0200E4A8F1 /* ASHomeBannerModel.m in Sources */,
 				819900222A020A6F006FE68C /* LYTools.m in Sources */,
@@ -1568,37 +1778,48 @@
 				81EC476F2A33F82C00516573 /* ASHomeImgCell.m in Sources */,
 				81354BE72A28786C0082C93A /* ASProductBaseModel.m in Sources */,
 				9A8DD8C52A0B8F1700573324 /* As_GoodsSizeC.m in Sources */,
+				81717D152A3C4AE000648139 /* KWHisKeyWordCell.m in Sources */,
 				8134C1BD2A1372D5006EB0EC /* ASUserCenterTableHeadView.m in Sources */,
 				9AD346002A08D60F005CA070 /* ZFPresentTransition.m in Sources */,
+				81717D112A3C4AE000648139 /* KWSearchViewModel.m in Sources */,
 				9A337E3B2A04EE1A00D058A5 /* BViewController.m in Sources */,
 				9AD345A72A08D571005CA070 /* TYPageControl.m in Sources */,
 				81354C0A2A289C350082C93A /* KWScrollOffsetView.m in Sources */,
 				81354C032A289A070082C93A /* HomeFilterModel.m in Sources */,
+				81717CAB2A3C359E00648139 /* ASProductlistFilterPriceCollectCell.m in Sources */,
 				9AD364D12A05EC7800452C7A /* AS_TabBarViewController.m in Sources */,
 				9AD345FB2A08D60F005CA070 /* ZFOrientationObserver.m in Sources */,
 				9AD346192A08D679005CA070 /* GoodsBannerModel.m in Sources */,
+				81717C942A3BE4E000648139 /* ASProductListSortFilterCell.m in Sources */,
 				9AD346082A08D60F005CA070 /* ZFIJKPlayerManager.m in Sources */,
 				9AD3459E2A08D545005CA070 /* GoodsDetailSrcView.m in Sources */,
 				9AD346022A08D60F005CA070 /* ZFPlayerView.m in Sources */,
 				81BEA6832A2D7CF3009D36C4 /* UITableView+ASBase.m in Sources */,
+				81717D162A3C4AE000648139 /* KWHisAndHotWordsView.m in Sources */,
+				81717C992A3BF1DD00648139 /* ASHomeAlertWindow.m in Sources */,
 				81C3B44429F6612800D79294 /* ASBaseViewController.m in Sources */,
 				81C3266A2A36F035002EF442 /* ASProductListViewModel.m in Sources */,
 				815DA3DF2A396BD300616EF7 /* ASMoreBtCell.m in Sources */,
 				9A1247942A1B082300126226 /* Fuction_Tool.m in Sources */,
 				81601FFF2A2DC8E700E4A8F1 /* ASHomeBannerCell.m in Sources */,
+				81717D132A3C4AE000648139 /* KWSearchViewController.m in Sources */,
 				9AD6A5442A1218E8001DE3D9 /* PassWordSecureBtnV.m in Sources */,
 				81C3B44A29F6661500D79294 /* ASBaseNavController.m in Sources */,
 				9AD3460C2A08D60F005CA070 /* ZFVolumeBrightnessView.m in Sources */,
 				9AD346072A08D60F005CA070 /* UIViewController+ZFPlayerRotation.m in Sources */,
 				8160200D2A2DD5C000E4A8F1 /* CTMediator+UserCenter.m in Sources */,
 				9ACBEC2B2A14CCA300A8F97A /* ThirdPartService.m in Sources */,
+				81717D1A2A3C4AE000648139 /* KWLenovoWordListView.m in Sources */,
 				81C3265F2A36B284002EF442 /* ASProductListViewController.m in Sources */,
 				9AD346142A08D60F005CA070 /* ZFSpeedLoadingView.m in Sources */,
 				9AD346062A08D60F005CA070 /* ZFReachabilityManager.m in Sources */,
+				81717CA52A3C0A5000648139 /* KWProductFilterItemCell.m in Sources */,
 				9AD345FE2A08D60F005CA070 /* UIScrollView+ZFPlayer.m in Sources */,
 				9A65DE512A132FB700BB1269 /* LoginThirdAuthV.m in Sources */,
+				81717D142A3C4AE000648139 /* APCategoryViewController.m in Sources */,
 				9A788C442A08A663003E0025 /* Target_Goods.m in Sources */,
 				81EC47692A33073100516573 /* ASHomeNewInProductItemView.m in Sources */,
+				81717D212A3C4AE000648139 /* KWSearchSubTypeTableView.m in Sources */,
 				9AD3461D2A08D6F0005CA070 /* GoodsInformationM.m in Sources */,
 				9A1247972A1B0A2800126226 /* AS_ForgotC.m in Sources */,
 				81EC476C2A33131100516573 /* ASHomeNewInSubCollectCell.m in Sources */,
@@ -1606,6 +1827,7 @@
 				9AD345A82A08D571005CA070 /* TYCyclePagerView.m in Sources */,
 				9AD346202A08E30E005CA070 /* SelectVCollectionViewCell.m in Sources */,
 				81601FFB2A2DC78300E4A8F1 /* WMZBannerOverLayout.m in Sources */,
+				81717D172A3C4AE000648139 /* KWHisCollectHeaderView.m in Sources */,
 				81354C002A2899CB0082C93A /* KWMineMoreProductModel.m in Sources */,
 				8134C1BA2A1372A7006EB0EC /* ASUserCenterEnterItemV.m in Sources */,
 				9AD3460A2A08D60F005CA070 /* ZFUtilities.m in Sources */,
@@ -1614,35 +1836,45 @@
 				9A337E3A2A04EE1A00D058A5 /* Target_B.m in Sources */,
 				9AD6A5452A1218E8001DE3D9 /* EamilTFmatchV.m in Sources */,
 				9AD345FF2A08D60F005CA070 /* ZFPlayerNotification.m in Sources */,
+				81717D282A3C55CC00648139 /* CTMediator+Categorys.m in Sources */,
 				9AD346092A08D60F005CA070 /* ZFAVPlayerManager.m in Sources */,
 				8134C1B42A1358F3006EB0EC /* ASSginView.m in Sources */,
 				9AD346122A08D60F005CA070 /* ZFSmallFloatControlView.m in Sources */,
 				81EC47752A3423FC00516573 /* ASHomeLookingCell.m in Sources */,
 				9AD3460E2A08D60F005CA070 /* ZFNetworkSpeedMonitor.m in Sources */,
 				9AD346052A08D60F005CA070 /* ZFLandscapeViewController.m in Sources */,
+				81717D222A3C4AE000648139 /* KWSearchMainTypeCell.m in Sources */,
 				81601FF62A2DC78300E4A8F1 /* WMZBannerFlowLayout.m in Sources */,
 				814F5CF52A11B37E003847A9 /* ASUserAvaterView.m in Sources */,
 				81354C0B2A289C350082C93A /* KWTimeEndView.m in Sources */,
 				9AD346032A08D60F005CA070 /* ZFPortraitViewController.m in Sources */,
 				81354BED2A287AB50082C93A /* KWMineHomeOrderHeadView.m in Sources */,
+				81717D102A3C4AE000648139 /* KWHisAndHotWordsViewModel.m in Sources */,
 				9AD3460D2A08D60F005CA070 /* ZFLandScapeControlView.m in Sources */,
 				9AD364C62A05E73E00452C7A /* AS_GoodsDetailsC.m in Sources */,
+				81717D182A3C4AE000648139 /* KWCustomLayout.m in Sources */,
 				816020102A2EE55F00E4A8F1 /* ASCategaryListCell.m in Sources */,
 				9AD3460B2A08D60F005CA070 /* UIView+ZFFrame.m in Sources */,
 				81E257FD2A12340E004EEF71 /* ASEnterItemV.m in Sources */,
 				81C3B45529F66C1700D79294 /* UIView+PublicInit.m in Sources */,
 				8134C1C52A145172006EB0EC /* ASProductItemView.m in Sources */,
 				9A5C64582A12064300CBB185 /* AS_LoginC.m in Sources */,
+				81717D122A3C4AE000648139 /* APOnlySearchViewController.m in Sources */,
 				9AD345FD2A08D60F005CA070 /* ZFPersentInteractiveTransition.m in Sources */,
+				81717D192A3C4AE000648139 /* KWNoHisWordsCell.m in Sources */,
 				8160200A2A2DD59E00E4A8F1 /* CTMediator+Home.m in Sources */,
+				81717C9C2A3BF1F100648139 /* ASHomeAlertViewController.m in Sources */,
 				9AD345FC2A08D60F005CA070 /* ZFPlayerLogManager.m in Sources */,
 				81354C0E2A297D6A0082C93A /* HomeFlashDealSubCollectCell.m in Sources */,
 				81354BFD2A28998B0082C93A /* KWMineMoreProductsCell.m in Sources */,
 				9ACBEC252A14707400A8F97A /* AS_SignUpC.m in Sources */,
+				81717D1F2A3C4AE000648139 /* KWMoneyTypeHeadView.m in Sources */,
 				81EC47782A3426CE00516573 /* ASHomeLookingCollCell.m in Sources */,
 				8160201C2A2F101C00E4A8F1 /* ASHomeTipCell.m in Sources */,
+				81717D1E2A3C4AE000648139 /* KWSearchMainTypeTableView.m in Sources */,
 				81EC47662A33035D00516573 /* ASHomeNewInCellTableViewCell.m in Sources */,
 				9AD346162A08D60F005CA070 /* UIImageView+ZFCache.m in Sources */,
+				81717D1D2A3C4AE000648139 /* KWSearchSubTypeHeadView.m in Sources */,
 				9AD345A92A08D571005CA070 /* TYCyclePagerTransformLayout.m in Sources */,
 				815DA3D92A39575100616EF7 /* ASProductListImageCell.m in Sources */,
 				815DA3DC2A39625200616EF7 /* ASProductListTypeDesCell.m in Sources */,

+ 1 - 0
Asteria/ASUI/ColorDefine.h

@@ -43,6 +43,7 @@
 #define _B1B1B1 ([UIColor colorWithHexString:@"#B1B1B1"])
 #define _E0FFF5 ([UIColor colorWithHexString:@"#E0FFF5"])
 
+#define _1CBC9D ([UIColor colorWithHexString:@"#1CBC9D"])
 // as主题色 绿色
 #define _32CFB0 ([UIColor colorWithHexString:@"#32CFB0"])
 

+ 2 - 0
Asteria/ASUI/Extensions/UIView+PublicInit.h

@@ -30,6 +30,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 + (void)viewAddHorColorBg:(UIView *)bgV colorArr:(NSArray *)colors startP:(CGPoint)start endP:(CGPoint)end;
 
+- (void)setLayerShadow:(UIColor*)color offset:(CGSize)offset radius:(CGFloat)radius;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 9 - 0
Asteria/ASUI/Extensions/UIView+PublicInit.m

@@ -93,4 +93,13 @@
     return effectView;
 }
 
+- (void)setLayerShadow:(UIColor*)color offset:(CGSize)offset radius:(CGFloat)radius {
+    self.layer.shadowColor = color.CGColor;
+    self.layer.shadowOffset = offset;
+    self.layer.shadowRadius = radius;
+    self.layer.shadowOpacity = 1;
+    self.layer.shouldRasterize = YES;
+    self.layer.rasterizationScale = [UIScreen mainScreen].scale;
+}
+
 @end

+ 2 - 0
Asteria/ASUI/SizeDefine.h

@@ -17,4 +17,6 @@
 #define kStatusBarH ([LYTools getStatusBarHight])//([UIApplication sharedApplication].statusBarFrame.size.height)
 #define kCustomNavBarH (60)
 
+#define kBottomSafeSpace (kStatusBarH > 20 ? 34 : 0)
+
 #endif /* SizeDefine_h */

+ 1 - 1
Asteria/AppDelegate.m

@@ -24,7 +24,7 @@
     [self xxx_ytkNetConfig];
     self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
     AS_TabBarViewController *tab = [[AS_TabBarViewController alloc] init];
-    tab.selectedIndex = 1;
+    tab.selectedIndex = 0;
     self.window.rootViewController = tab;
     [self.window makeKeyAndVisible];
     

+ 22 - 0
Asteria/Assets.xcassets/tabbar/tab_cart.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
+  }
+}

BIN
Asteria/Assets.xcassets/tabbar/tab_cart.imageset/购物车-未点击@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_cart.imageset/购物车-未点击@3x.png


+ 22 - 0
Asteria/Assets.xcassets/tabbar/tab_cart_sel.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
+  }
+}

BIN
Asteria/Assets.xcassets/tabbar/tab_cart_sel.imageset/购物车-点击@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_cart_sel.imageset/购物车-点击@3x.png


+ 22 - 0
Asteria/Assets.xcassets/tabbar/tab_category.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
+  }
+}

BIN
Asteria/Assets.xcassets/tabbar/tab_category.imageset/分类-未点击@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_category.imageset/分类-未点击@3x.png


+ 2 - 2
Asteria/Assets.xcassets/tabbar/tab_search.imageset/Contents.json

@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "tab_search@2x.png",
+      "filename" : "分类-点击@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "tab_search@3x.png",
+      "filename" : "分类-点击@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
Asteria/Assets.xcassets/tabbar/tab_category_sel.imageset/分类-点击@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_category_sel.imageset/分类-点击@3x.png


+ 2 - 2
Asteria/Assets.xcassets/tabbar/tab_home.imageset/Contents.json

@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "tab_home@2x.png",
+      "filename" : "首页-未点击@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "tab_home@3x.png",
+      "filename" : "首页-未点击@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
Asteria/Assets.xcassets/tabbar/tab_home.imageset/tab_home@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_home.imageset/tab_home@3x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_home.imageset/首页-未点击@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_home.imageset/首页-未点击@3x.png


+ 2 - 2
Asteria/Assets.xcassets/tabbar/tab_mine.imageset/Contents.json

@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "tab_mine@2x.png",
+      "filename" : "首页-点击@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "tab_mine@3x.png",
+      "filename" : "首页-点击@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
Asteria/Assets.xcassets/tabbar/tab_home_sel.imageset/首页-点击@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_home_sel.imageset/首页-点击@3x.png


+ 22 - 0
Asteria/Assets.xcassets/tabbar/tab_me.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
+  }
+}

BIN
Asteria/Assets.xcassets/tabbar/tab_me.imageset/我的-未选中@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_me.imageset/我的-未选中@3x.png


+ 22 - 0
Asteria/Assets.xcassets/tabbar/tab_me_sel.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
+  }
+}

BIN
Asteria/Assets.xcassets/tabbar/tab_me_sel.imageset/我的-选中@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_me_sel.imageset/我的-选中@3x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_mine.imageset/tab_mine@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_mine.imageset/tab_mine@3x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_search.imageset/tab_search@2x.png


BIN
Asteria/Assets.xcassets/tabbar/tab_search.imageset/tab_search@3x.png


+ 24 - 0
Asteria/Fuction/Category/Target_Category.h

@@ -0,0 +1,24 @@
+//
+//  Target_Category.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface Target_Category : NSObject
+
+- (UIViewController *)Action_getCategoryListVc:(NSDictionary *)params;
+
+- (UIViewController *)Action_getSearchVc:(NSDictionary *)params;
+
+
+- (UIViewController *)Action_getCategoryAndSearchVc:(NSDictionary *)params;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 31 - 0
Asteria/Fuction/Category/Target_Category.m

@@ -0,0 +1,31 @@
+//
+//  Target_Category.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "Target_Category.h"
+#import "APCategoryViewController.h"
+#import "APOnlySearchViewController.h"
+
+@implementation Target_Category
+
+- (UIViewController *)Action_getCategoryListVc:(NSDictionary *)params {
+    APCategoryViewController *vc = [[APCategoryViewController alloc] init];
+    return  vc;
+}
+
+- (UIViewController *)Action_getSearchVc:(NSDictionary *)params {
+    APOnlySearchViewController *vc = [[APOnlySearchViewController alloc] init];
+    return  vc;
+}
+
+
+- (UIViewController *)Action_getCategoryAndSearchVc:(NSDictionary *)params {
+    KWSearchViewController *vc = [[KWSearchViewController alloc] init];
+    return  vc;
+}
+
+
+@end

+ 24 - 0
Asteria/Fuction/Category/v/KWMoneyTypeHeadView.h

@@ -0,0 +1,24 @@
+//
+//  KWMoneyTypeCell.h
+//  westkissMob
+//
+//  Created by iOS on 2022/11/10.
+//
+
+#import <UIKit/UIKit.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWMoneyTypeHeadView : UITableViewHeaderFooterView
+
+@property (nonatomic, strong) UILabel *titleLb;
+@property (nonatomic, strong) UIImageView *imgV;
+
+@property (nonatomic, copy) btnClickBlock callBack;
+
+- (void)setData:(KWSubTypeSectionModel *)m isSelect:(BOOL)isSelect;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 139 - 0
Asteria/Fuction/Category/v/KWMoneyTypeHeadView.m

@@ -0,0 +1,139 @@
+//
+//  KWMoneyTypeCell.m
+//  westkissMob
+//
+//  Created by iOS on 2022/11/10.
+//
+
+#import "KWMoneyTypeHeadView.h"
+//#import <SDWebImage/SDWebImage.h>
+
+@interface KWMoneyTypeHeadView ()
+
+@property (nonatomic,strong) UIStackView *stackV;
+@property (nonatomic, strong) UIButton *btn;
+
+@property (nonatomic, strong) UIImageView *typeImgV;
+
+@end
+
+@implementation KWMoneyTypeHeadView
+
+- (void)setData:(KWSubTypeSectionModel *)m isSelect:(BOOL)isSelect {
+    self.titleLb.text = m.Id;
+    self.typeImgV.image = [UIImage imageNamed:m.Id];
+    self.imgV.hidden = !isSelect;
+    
+    
+}
+
+- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithReuseIdentifier:reuseIdentifier];
+    if (self) {
+        [self configSubV];
+    }
+    return self;
+}
+
+- (void)configSubV {
+    self.contentView.backgroundColor = [UIColor colorWithHexString:@"#ffffff"];
+    self.backgroundColor = [UIColor colorWithHexString:@"#ffffff"];
+    self.imgV.image = [UIImage imageNamed:@"search_payMoneyType_select"];
+    
+    [self.contentView addSubview:self.stackV];
+    [self.stackV addArrangedSubview:self.typeImgV];
+    [self.stackV addArrangedSubview:self.titleLb];
+    [self.stackV addArrangedSubview:self.imgV];
+    [self.contentView addSubview:self.btn];
+    
+    [self.stackV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.contentView).offset(2.5);
+        make.left.equalTo(self.contentView).offset(10);
+        make.right.equalTo(self.contentView).offset(-10);
+        make.bottom.equalTo(self.contentView).offset(-2.5);
+    }];
+    
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.greaterThanOrEqualTo(@45);
+    }];
+    [self.imgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.equalTo(@26);
+        make.height.equalTo(@26);
+    }];
+    [self.typeImgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.equalTo(@26);
+        make.height.equalTo(@26);
+    }];
+    [self.btn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.contentView);
+    }];
+}
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+-(UIButton *)btn {
+    if (!_btn) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt addTarget:self action:@selector(clickAction) forControlEvents:UIControlEventTouchUpInside];
+        bt.backgroundColor = UIColor.clearColor;
+        [bt setTitle:@"" forState:UIControlStateNormal];
+        _btn = bt;
+    }
+    return  _btn;
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Bold size:12];
+        lb.textColor = [UIColor colorWithHexString:@"#0b0b0b"];
+        lb.textAlignment = NSTextAlignmentLeft;
+        lb.backgroundColor = [UIColor clearColor];
+        lb.numberOfLines = 0;
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+-(UIImageView *)imgV {
+    if (!_imgV) {
+        UIImageView *img = [[UIImageView alloc] init];
+        img.contentMode = UIViewContentModeScaleAspectFit;
+        
+        _imgV = img;
+    }
+    return _imgV;
+}
+
+-(UIImageView *)typeImgV {
+    if (!_typeImgV) {
+        UIImageView *img = [[UIImageView alloc] init];
+        img.contentMode = UIViewContentModeScaleAspectFit;
+        _typeImgV = img;
+    }
+    return _typeImgV;
+}
+
+- (UIStackView *)stackV {
+    if (!_stackV) {
+        UIStackView *stv = [[UIStackView alloc] init];
+        stv.axis = UILayoutConstraintAxisHorizontal;
+        stv.distribution = UIStackViewDistributionFill;
+        stv.alignment = UIStackViewAlignmentFill;
+        stv.spacing = 5;
+        _stackV = stv;
+    }
+    return _stackV;
+}
+
+- (void)clickAction {
+    if (self.callBack) {
+        self.callBack();
+    }
+}
+
+@end
+

+ 21 - 0
Asteria/Fuction/Category/v/KWSearchMainTypeCell.h

@@ -0,0 +1,21 @@
+//
+//  KWSearchMainTypeCell.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchMainTypeCell : UITableViewCell
+
+@property (nonatomic, strong) UILabel *titleLb;
+
+- (void)setData:(KWMainTypeModel *)model isSelect:(BOOL)isselect;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 64 - 0
Asteria/Fuction/Category/v/KWSearchMainTypeCell.m

@@ -0,0 +1,64 @@
+//
+//  KWSearchMainTypeCell.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWSearchMainTypeCell.h"
+
+@implementation KWSearchMainTypeCell
+
+- (void)setData:(KWMainTypeModel *)model isSelect:(BOOL)isselect {
+    self.titleLb.text = model.title;
+    self.titleLb.backgroundColor = isselect ? UIColor.blackColor : [UIColor whiteColor];
+    self.titleLb.textColor = isselect ? UIColor.whiteColor : [UIColor colorWithHexString:@"#0b0b0b"];
+}
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        [self configSubV];
+    }
+    return  self;
+}
+
+- (void)configSubV {
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+    self.contentView.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    self.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    
+    [self.contentView addSubview:self.titleLb];
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.contentView);//.offset(2.5);
+        make.left.equalTo(self.contentView);
+        make.right.equalTo(self.contentView).offset(-10);
+        make.bottom.equalTo(self.contentView);//.offset(-2.5);
+    }];
+}
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Bold size:14];
+        lb.textColor = [UIColor colorWithHexString:@"#0b0b0b"];
+        lb.textAlignment = NSTextAlignmentCenter;
+        lb.backgroundColor = [UIColor clearColor];
+        lb.numberOfLines = 0;
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+@end

+ 25 - 0
Asteria/Fuction/Category/v/KWSearchMainTypeTableView.h

@@ -0,0 +1,25 @@
+//
+//  KWSearchMainTypeTableView.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchMainTypeTableView : UITableView
+
+@property (nonatomic, strong) NSArray<KWMainTypeModel *> *arr;
+
+@property (nonatomic, strong) KWMainTypeModel *moneyType;
+
+@property (nonatomic, assign) NSInteger selectIndex;
+
+@property (nonatomic, copy) btnClickBlock callBack;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 83 - 0
Asteria/Fuction/Category/v/KWSearchMainTypeTableView.m

@@ -0,0 +1,83 @@
+//
+//  KWSearchMainTypeTableView.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWSearchMainTypeTableView.h"
+#import "KWSearchMainTypeCell.h"
+
+@interface KWSearchMainTypeTableView ()<UITableViewDelegate, UITableViewDataSource>
+
+@end
+
+@implementation KWSearchMainTypeTableView
+
+- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
+    self = [super initWithFrame:frame style:style];
+    if (self) {
+        [self configSelf];
+    }
+    return self;
+}
+
+- (void)configSelf {
+    self.selectIndex = 0;
+    self.delegate = self;
+    self.dataSource = self;
+    self.showsVerticalScrollIndicator = false;
+    self.separatorStyle = UITableViewCellSeparatorStyleNone;
+    self.rowHeight = 70;
+    [self registerClass:[KWSearchMainTypeCell class] forCellReuseIdentifier:@"KWSearchMainTypeCell"];
+}
+
+
+// MARK: - UITableViewDelegate
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.row >= self.arr.count) {
+        self.selectIndex = indexPath.row;
+        [self reloadData];
+        if (self.callBack) {
+            self.callBack();
+        }
+        return;
+    }
+    NSInteger tempSelect = self.selectIndex;
+    self.selectIndex = indexPath.row;
+    if (self.callBack) {
+        self.callBack();
+        KWMainTypeModel *tempM = self.arr[indexPath.row];
+        if (tempM.children.count == 0) {
+            self.selectIndex = tempSelect;
+        }
+    }
+    [self reloadData];
+}
+
+// MARK: - UITableViewDataSource
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+    return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.arr.count + (self.moneyType ? 1 : 0);
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    KWSearchMainTypeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"KWSearchMainTypeCell" forIndexPath:indexPath];
+    if (indexPath.row >= self.arr.count) {
+        [cell setData:self.moneyType isSelect:self.selectIndex == indexPath.row];
+        return cell;
+    }
+    KWMainTypeModel *tempM = self.arr[indexPath.row];
+    [cell setData:tempM isSelect:self.selectIndex == indexPath.row];
+    return  cell;
+}
+
+
+
+
+
+@end

+ 22 - 0
Asteria/Fuction/Category/v/KWSearchSubTypeCell.h

@@ -0,0 +1,22 @@
+//
+//  KWSearchSubTypeCell.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchSubTypeCell : UITableViewCell
+
+@property (nonatomic, strong) UILabel *titleLb;
+@property (nonatomic, strong) UIImageView *imgV;
+
+- (void)setData:(KWSearchSubTypeModel *)m;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 135 - 0
Asteria/Fuction/Category/v/KWSearchSubTypeCell.m

@@ -0,0 +1,135 @@
+//
+//  KWSearchSubTypeCell.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWSearchSubTypeCell.h"
+#import <SDWebImage/SDWebImage.h>
+
+@interface KWSearchSubTypeCell ()
+
+@property (nonatomic,strong) UIStackView *stackV;
+@property (nonatomic, strong) UIView *bgV;
+
+@end
+
+@implementation KWSearchSubTypeCell
+
+- (void)setData:(KWSearchSubTypeModel *)m {
+    self.titleLb.text = m.title;
+    if (!m.thumbnail_url || [m.thumbnail_url isEqualToString:@""] || ![[m.thumbnail_url lowercaseString] hasPrefix:@"http"] ) {
+        self.imgV.hidden = true;
+        [self.bgV mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.equalTo(@57);
+        }];
+    } else {
+        self.imgV.hidden = false;
+        [self.bgV mas_updateConstraints:^(MASConstraintMaker *make) {
+            make.height.equalTo(@76);
+        }];
+        [self.imgV sd_setImageWithURL:[NSURL URLWithString:m.thumbnail_url.urlEncode]];
+    }
+}
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        [self configSubV];
+    }
+    return  self;
+}
+
+- (void)configSubV {
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+    self.contentView.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    self.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    
+    [self.contentView addSubview:self.bgV];
+    [self.bgV addSubview:self.stackV];
+    [self.bgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.contentView).offset(3);
+        make.left.equalTo(self.contentView);
+        make.right.equalTo(self.contentView);
+        make.bottom.equalTo(self.contentView);
+        make.height.equalTo(@76);
+    }];
+    [self.stackV addArrangedSubview:self.titleLb];
+    [self.stackV addArrangedSubview:self.imgV];
+    
+    [self.bgV setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
+    [self.stackV setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
+    [self.stackV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.bgV);
+        make.left.equalTo(self.bgV).offset(10);
+        make.right.equalTo(self.bgV).offset(-10);
+        make.bottom.equalTo(self.bgV);
+    }];
+    [self.titleLb setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.greaterThanOrEqualTo(@57);
+    }];
+    [self.imgV setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
+    [self.imgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.equalTo(@76);
+        make.height.equalTo(@76);
+    }];
+}
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Bold size:12];
+        lb.textColor = [UIColor colorWithHexString:@"#0b0b0b"];
+        lb.textAlignment = NSTextAlignmentLeft;
+        lb.backgroundColor = [UIColor clearColor];
+        lb.numberOfLines = 0;
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+-(UIImageView *)imgV {
+    if (!_imgV) {
+        UIImageView *img = [[UIImageView alloc] init];
+        img.contentMode = UIViewContentModeScaleAspectFit;
+        
+        _imgV = img;
+    }
+    return _imgV;
+}
+
+- (UIView *)bgV {
+    if (!_bgV) {
+        UIView *v = [[UIView alloc] init];
+        v.backgroundColor = UIColor.whiteColor;
+        _bgV = v;
+    }
+    return _bgV;
+}
+
+- (UIStackView *)stackV {
+    if (!_stackV) {
+        UIStackView *stv = [[UIStackView alloc] init];
+        stv.axis = UILayoutConstraintAxisHorizontal;
+        stv.distribution = UIStackViewDistributionFill;
+        stv.alignment = UIStackViewAlignmentFill;
+        stv.spacing = 5;
+        _stackV = stv;
+    }
+    return _stackV;
+}
+
+@end

+ 25 - 0
Asteria/Fuction/Category/v/KWSearchSubTypeHeadView.h

@@ -0,0 +1,25 @@
+//
+//  KWSearchSubTypeHeadView.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchSubTypeHeadView : UITableViewHeaderFooterView
+
+@property (nonatomic, strong) UILabel *titleLb;
+@property (nonatomic, strong) UIImageView *imgV;
+@property (nonatomic, copy) btnClickBlock callBack;
+
+@property (nonatomic, copy) btnClickBlock titleTapBack;
+
+- (void)setData:(KWSubTypeSectionModel *)m;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 153 - 0
Asteria/Fuction/Category/v/KWSearchSubTypeHeadView.m

@@ -0,0 +1,153 @@
+//
+//  KWSearchSubTypeHeadView.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWSearchSubTypeHeadView.h"
+
+
+@interface KWSearchSubTypeHeadView ()
+
+@property (nonatomic,strong) UIStackView *stackV;
+
+@property (nonatomic, strong) UIButton *btn;
+@property (nonatomic, strong) UIButton *openBtn;
+
+@property (nonatomic,strong) KWSubTypeSectionModel *cellM;
+
+@end
+
+@implementation KWSearchSubTypeHeadView
+
+- (void)setData:(KWSubTypeSectionModel *)m {
+    self.cellM = m;
+    self.titleLb.text = m.title;
+    if (m.isOpen ) {
+        self.imgV.image = [UIImage imageNamed:@"search_openMore"];
+    } else {
+        self.imgV.image = [UIImage imageNamed:@"search_hadMore"];
+    }
+    self.imgV.hidden = m.children.count == 0;
+}
+
+- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithReuseIdentifier:reuseIdentifier];
+    if (self) {
+        [self configSubV];
+    }
+    return self;
+}
+
+
+- (void)configSubV {
+    self.contentView.backgroundColor = [UIColor colorWithHexString:@"#ffffff"];
+    self.backgroundColor = [UIColor colorWithHexString:@"#ffffff"];
+    
+    
+    
+    [self.contentView addSubview:self.titleLb];
+    [self.contentView addSubview:self.imgV];
+    [self.contentView addSubview:self.btn];
+    [self.contentView addSubview:self.openBtn];
+    
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.equalTo(self.contentView);
+        make.top.equalTo(self.contentView).offset(6);
+        make.left.equalTo(self.contentView).offset(10);
+    }];
+    [self.imgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.titleLb.mas_right).offset(8);
+        make.centerY.equalTo(self.contentView);
+        make.right.equalTo(self.contentView).offset(-18);
+        make.width.equalTo(@12);
+        make.height.equalTo(@12);
+    }];
+    
+    [self.btn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.contentView);
+    }];
+    
+    [self.openBtn mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.right.bottom.equalTo(self.contentView);
+        make.width.equalTo(@40);
+    }];
+}
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Bold size:12];
+        lb.textColor = [UIColor colorWithHexString:@"#0b0b0b"];
+        lb.textAlignment = NSTextAlignmentLeft;
+        lb.backgroundColor = [UIColor clearColor];
+        lb.numberOfLines = 0;
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+-(UIImageView *)imgV {
+    if (!_imgV) {
+        UIImageView *img = [[UIImageView alloc] init];
+        img.contentMode = UIViewContentModeScaleAspectFit;
+        
+        _imgV = img;
+    }
+    return _imgV;
+}
+
+- (UIStackView *)stackV {
+    if (!_stackV) {
+        UIStackView *stv = [[UIStackView alloc] init];
+        stv.axis = UILayoutConstraintAxisHorizontal;
+        stv.distribution = UIStackViewDistributionFill;
+        stv.alignment = UIStackViewAlignmentFill;
+        stv.spacing = 5;
+        _stackV = stv;
+    }
+    return _stackV;
+}
+
+-(UIButton *)btn {
+    if (!_btn) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt addTarget:self action:@selector(clickAction) forControlEvents:UIControlEventTouchUpInside];
+        bt.backgroundColor = UIColor.clearColor;
+        [bt setTitle:@"" forState:UIControlStateNormal];
+        _btn = bt;
+    }
+    return  _btn;
+}
+-(UIButton *)openBtn {
+    if (!_openBtn) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt addTarget:self action:@selector(openBtnAction) forControlEvents:UIControlEventTouchUpInside];
+        bt.backgroundColor = UIColor.clearColor;
+        [bt setTitle:@"" forState:UIControlStateNormal];
+        _openBtn = bt;
+    }
+    return _openBtn;
+}
+
+- (void)openBtnAction {
+    self.cellM.isOpen = !self.cellM.isOpen;
+    if (self.callBack) {
+        self.callBack();
+    }
+}
+
+- (void)clickAction {
+    if (self.titleTapBack) {
+        self.titleTapBack();
+    }
+}
+
+@end

+ 24 - 0
Asteria/Fuction/Category/v/KWSearchSubTypeTableView.h

@@ -0,0 +1,24 @@
+//
+//  KWSearchSubTypeTableView.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchSubTypeTableView : UITableView
+
+@property (nonatomic, strong) NSArray<KWSubTypeSectionModel *> *arr;
+
+@property (nonatomic, copy) void(^callBack)(NSIndexPath *indexP);
+@property (nonatomic, copy) void(^callBackSection)(NSInteger index);
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 128 - 0
Asteria/Fuction/Category/v/KWSearchSubTypeTableView.m

@@ -0,0 +1,128 @@
+//
+//  KWSearchSubTypeTableView.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWSearchSubTypeTableView.h"
+#import "KWSearchSubTypeHeadView.h"
+#import "KWSearchSubTypeCell.h"
+#import "KWMoneyTypeHeadView.h"
+
+@interface KWSearchSubTypeTableView () <UITableViewDelegate,UITableViewDataSource>
+
+
+
+@end
+
+@implementation KWSearchSubTypeTableView
+
+- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
+    self = [super initWithFrame:frame style:style];
+    if (self) {
+        [self configSelf];
+    }
+    return self;
+}
+
+- (void)configSelf {
+    self.backgroundColor = [UIColor colorWithHexString:@"#f8f8f8"];
+    self.delegate = self;
+    self.dataSource = self;
+    self.showsVerticalScrollIndicator = false;
+    self.separatorStyle = UITableViewCellSeparatorStyleNone;
+    self.rowHeight = UITableViewAutomaticDimension;
+    self.estimatedRowHeight = 60;
+    [self registerClass:[KWSearchSubTypeCell class] forCellReuseIdentifier:@"KWSearchSubTypeCell"];
+    [self registerClass:[KWSearchSubTypeHeadView class] forHeaderFooterViewReuseIdentifier:@"KWSearchSubTypeHeadView"];
+    [self registerClass:[KWMoneyTypeHeadView class] forHeaderFooterViewReuseIdentifier:@"KWMoneyTypeHeadView"];
+}
+
+
+// MARK: - UITableViewDelegate
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (self.callBack) {
+        self.callBack(indexPath);
+    }
+    [self reloadData];
+}
+
+// MARK: - UITableViewDataSource
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+    return self.arr.count;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    KWSubTypeSectionModel * m = self.arr[section];
+    return m.isOpen ? m.children.count : 0;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    KWSearchSubTypeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"KWSearchSubTypeCell" forIndexPath:indexPath];
+    KWSearchSubTypeModel *tempM = self.arr[indexPath.section].children[indexPath.row];
+    [cell setData:tempM];
+    return  cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
+    return  60;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+    KWSubTypeSectionModel *tempM = self.arr[section];
+    if (tempM.isMoneyType) {
+        KWMoneyTypeHeadView *vi = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"KWMoneyTypeHeadView"];
+        [vi setData:tempM isSelect:tempM.isOpen];
+        @weakify(self);
+        [vi setCallBack:^{
+            if (tempM.isOpen) {
+                return;
+            }
+            if (weak_self.callBackSection) {
+                weak_self.callBackSection(section);
+            }
+        }];
+        return vi;
+    }
+    
+    KWSearchSubTypeHeadView *v = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"KWSearchSubTypeHeadView"];
+    [v setData:tempM];
+    @weakify(self);
+    v.callBack = ^{
+        KWSubTypeSectionModel *m = weak_self.arr[section];
+        if (m.children.count == 0) {
+            if (weak_self.callBackSection) {
+                weak_self.callBackSection(section);
+            }
+        }
+        
+        [weak_self reloadSections:[[NSIndexSet alloc] initWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
+    };
+    v.titleTapBack = ^{
+//        KWSubTypeSectionModel *m = weak_self.arr[section];
+//        if (m.children.count == 0) {
+            if (weak_self.callBackSection) {
+                weak_self.callBackSection(section);
+            }
+//        }
+    };
+    
+    return v;
+}
+
+
+- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
+    return  10;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
+    UIView *v = [[UIView alloc] init];
+    v.backgroundColor = [UIColor colorWithHexString:@"#F8F8F8"];
+    return v;
+}
+
+
+
+@end

+ 22 - 0
Asteria/Fuction/Category/vc/APCategoryViewController.h

@@ -0,0 +1,22 @@
+//
+//  APCategoryViewController.h
+//  westkissMob
+//
+//  Created by iOS on 2023/5/27.
+//
+
+#import "KWSearchViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface APCategoryViewController : KWSearchViewController
+
+
+- (void)showAction;
+
+
+- (void)closeAction;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 87 - 0
Asteria/Fuction/Category/vc/APCategoryViewController.m

@@ -0,0 +1,87 @@
+//
+//  APCategoryViewController.m
+//  westkissMob
+//
+//  Created by iOS on 2023/5/27.
+//
+
+#import "APCategoryViewController.h"
+
+@interface APCategoryViewController ()
+
+@property (nonatomic, strong) UIButton *closeBt;
+@property (nonatomic, strong) UILabel *titleLB;
+
+@end
+
+@implementation APCategoryViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    self.searchTf.hidden = true;
+    
+    [self.topV addSubview:self.closeBt];
+    [self.closeBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(self.topV).offset(-10);
+        make.right.equalTo(self.topV).offset(-22);
+        make.width.height.equalTo(@40);
+    }];
+    
+    [self.topV addSubview:self.titleLB];
+    [self.titleLB mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.equalTo(@130);
+        make.height.equalTo(@40);
+        make.centerX.equalTo(self.topV);
+        make.bottom.equalTo(self.topV).offset(-10);
+    }];
+    
+    
+}
+
+- (void)showAction {
+    self.view.frame = CGRectMake(-SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+    self.view.hidden = false;
+    [UIView animateWithDuration:0.24 animations:^{
+        self.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+    } completion:^(BOOL finished) {
+        self.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+    }];
+}
+
+
+- (void)closeAction {
+    self.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+    [UIView animateWithDuration:0.24 animations:^{
+        self.view.frame = CGRectMake(-SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+    } completion:^(BOOL finished) {
+        self.view.frame = CGRectMake(-SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+        self.view.hidden = true;
+    }];
+}
+
+- (UIButton *)closeBt {
+    if (!_closeBt) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt setImage:[UIImage imageNamed:@"productLsit_filter_close"] forState:UIControlStateNormal];
+        [bt addTarget:self action:@selector(closeAction) forControlEvents:UIControlEventTouchUpInside];
+        _closeBt = bt;
+    }
+    return _closeBt;
+}
+
+
+- (UILabel *)titleLB {
+    if (!_titleLB) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.text = @"MENU";
+        lb.textColor = UIColor.blackColor;
+        lb.font = [UIFont fontWithName:Rob_Regular size:20];
+        lb.textAlignment = NSTextAlignmentCenter;
+        _titleLB = lb;
+    }
+    return _titleLB;
+}
+
+
+@end

+ 16 - 0
Asteria/Fuction/Category/vc/APOnlySearchViewController.h

@@ -0,0 +1,16 @@
+//
+//  APOnlySearchViewController.h
+//  westkissMob
+//
+//  Created by iOS on 2023/5/27.
+//
+
+#import "KWSearchViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface APOnlySearchViewController : KWSearchViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 68 - 0
Asteria/Fuction/Category/vc/APOnlySearchViewController.m

@@ -0,0 +1,68 @@
+//
+//  APOnlySearchViewController.m
+//  westkissMob
+//
+//  Created by iOS on 2023/5/27.
+//
+
+#import "APOnlySearchViewController.h"
+
+@interface APOnlySearchViewController ()
+
+@property (nonatomic, strong) UIButton *cancelBt;
+
+@end
+
+@implementation APOnlySearchViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    self.bottomV.hidden = true;
+    self.hisWordV.hidden = false;
+    
+    [self.searchTf mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.topV).offset(50 + 20);
+        make.right.equalTo(self.topV).offset(-20);
+        make.height.equalTo(@45);
+        make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(8);
+        make.bottom.equalTo(self.topV).offset(-8);
+    }];
+    
+    [self.topV addSubview:self.cancelBt];
+    [self.cancelBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@40);
+        make.right.equalTo(self.searchTf.mas_left).offset(-10);
+        make.left.equalTo(self.topV).offset(20);
+        make.centerY.equalTo(self.searchTf);
+    }];
+    
+    [self.hisWordV reloadData];
+    
+}
+
+- (void)textFieldDidEndEditing:(UITextField *)textField {
+    [self hideLenovoV];
+}
+
+- (void)cancelBtAction {
+    [self dismissViewControllerAnimated:true completion:nil];
+}
+
+- (UIButton *)cancelBt {
+    if (!_cancelBt) {
+        UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
+        [bt addTarget:self action:@selector(cancelBtAction) forControlEvents:UIControlEventTouchUpInside];
+        [bt setImage:[UIImage imageNamed:@"nav_back_black"] forState:UIControlStateNormal];
+//        [bt setTitle:@"Cancel" forState:UIControlStateNormal];
+//        [bt setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
+//        bt.titleLabel.font = [UIFont fontWithName:Rob_Medium size:14];
+        _cancelBt = bt;
+    }
+    return _cancelBt;
+}
+
+
+
+@end

+ 31 - 0
Asteria/Fuction/Category/vc/KWSearchViewController.h

@@ -0,0 +1,31 @@
+//
+//  KWSearchViewController.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "ASBaseViewController.h"
+
+#import "KWSearchMainTypeTableView.h"
+#import "KWSearchSubTypeTableView.h"
+
+#import "KWHisAndHotWordsView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchViewController : ASBaseViewController
+
+@property (nonatomic, strong) KWSearchMainTypeTableView *leftTableV;
+@property (nonatomic, strong) KWSearchSubTypeTableView *rightTableV;
+@property (nonatomic, strong) UIView *topV;
+@property (nonatomic, strong) UIView *bottomV;
+@property (nonatomic,strong) UITextField *searchTf;
+@property (nonatomic, strong) KWHisAndHotWordsView *hisWordV;
+
+
+- (void)hideLenovoV;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 404 - 0
Asteria/Fuction/Category/vc/KWSearchViewController.m

@@ -0,0 +1,404 @@
+//
+//  KWSearchViewController.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWSearchViewController.h"
+#import "KWLenovoWordListView.h"
+#import "KWSearchSubTypeModel.h"
+
+#import "KWSearchViewModel.h"
+
+@interface KWSearchViewController () <UITextFieldDelegate>
+
+
+
+@property (nonatomic, strong) KWSearchViewModel *vm;
+@property (nonatomic, strong) KWHisAndHotWordsViewModel *hisVm;
+
+@property (nonatomic, strong) KWLenovoWordListView *lenovoV;
+
+
+@end
+
+@implementation KWSearchViewController
+
+- (instancetype)init {
+    self = [super init];
+    if(self) {
+        self.vm = [[KWSearchViewModel alloc] init];
+        [self.vm reqProductTypeList:^() {}];
+        self.hisVm= [[KWHisAndHotWordsViewModel alloc] init];
+    }
+    return self;
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    [self addSubVs];
+    [self getData];
+    @weakify(self);
+    [self.vm reqCurrenciesList:^{
+        weak_self.leftTableV.moneyType = weak_self.vm.moneyType;
+        [weak_self.leftTableV reloadData];
+        if (weak_self.leftTableV.selectIndex >= weak_self.leftTableV.arr.count) {
+            weak_self.rightTableV.arr = weak_self.vm.moneyType.children;
+            [weak_self.rightTableV reloadData];
+        }
+    }];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self.navigationController setNavigationBarHidden:true];
+    if (self.vm.arr.count == 0) {
+        [self getData];
+    }
+    
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+}
+
+- (void)getData {
+    @weakify(self);
+    [self.vm reqProductTypeList:^() {
+        weak_self.leftTableV.arr = weak_self.vm.arr;
+        for (int i = 0; i < weak_self.vm.arr.count; i++) {
+            if (weak_self.vm.arr[i] && weak_self.vm.arr[i].children.count > 0) {
+                weak_self.leftTableV.selectIndex = i;
+                weak_self.rightTableV.arr = weak_self.vm.arr[i].children;
+                break;
+            }
+            
+        }
+        [weak_self.leftTableV reloadData];
+        [weak_self.rightTableV reloadData];
+    }];
+    
+    if (self.vm.arr.count > 0) {
+        self.leftTableV.arr = weak_self.vm.arr;
+        for (int i = 0; i < weak_self.vm.arr.count; i++) {
+            if (weak_self.vm.arr[i] && weak_self.vm.arr[i].children.count > 0) {
+                weak_self.leftTableV.selectIndex = i;
+                weak_self.rightTableV.arr = weak_self.vm.arr[i].children;
+                break;
+            }
+            
+        }
+    }
+    [self.leftTableV reloadData];
+    [self.rightTableV reloadData];
+}
+
+-(void)addSubVs {
+    
+    self.view.backgroundColor = [UIColor colorWithHexString:@"#f8f8f8"];
+    self.leftTableV.backgroundColor = [UIColor colorWithHexString:@"#f8f8f8"];
+    
+    [self.view addSubview:self.topV];
+    [self.view addSubview:self.bottomV];
+    
+    [self.topV addSubview:self.searchTf];
+    [self.bottomV addSubview:self.leftTableV];
+    [self.bottomV addSubview:self.rightTableV];
+    
+    [self.topV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.left.right.equalTo(self.view);
+    }];
+    [self.searchTf mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.topV).offset(20);
+        make.right.equalTo(self.topV).offset(-20);
+        make.height.equalTo(@45);
+        make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(8);
+        make.bottom.equalTo(self.topV).offset(-8);
+    }];
+    
+    [self.bottomV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.topV.mas_bottom).offset(10);
+        make.left.right.equalTo(self.view);
+        make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);
+    }];
+    
+    [self.leftTableV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.equalTo(@130);
+        make.left.top.bottom.equalTo(self.bottomV);
+    }];
+    [self.rightTableV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.bottom.right.equalTo(self.bottomV);
+        make.left.equalTo(self.leftTableV.mas_right);
+    }];
+    
+    [self.view addSubview:self.hisWordV];
+    self.hisWordV.hidden = true;
+    [self.hisWordV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.leading.trailing.bottom.equalTo(self.view);
+        make.top.equalTo(self.topV.mas_bottom);
+    }];
+    
+    [self.view addSubview:self.lenovoV];
+    self.lenovoV.hidden = true;
+    [self.lenovoV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.leading.trailing.equalTo(self.searchTf);
+        make.top.equalTo(self.searchTf.mas_bottom);
+        make.height.equalTo(@0);
+    }];
+    
+}
+
+
+
+
+
+
+- (KWSearchMainTypeTableView *)leftTableV {
+    if (!_leftTableV) {
+        KWSearchMainTypeTableView *leftTab = [[KWSearchMainTypeTableView alloc] initWithFrame:CGRectMake(0, 10, 180, self.view.bounds.size.height) style:UITableViewStylePlain];
+        @weakify(self);
+        _leftTableV = leftTab;
+        leftTab.callBack = ^{
+            NSInteger selectIndex = weak_self.leftTableV.selectIndex;
+            if (selectIndex >= weak_self.leftTableV.arr.count) {
+                weak_self.rightTableV.arr = weak_self.leftTableV.moneyType.children;
+                [weak_self.rightTableV reloadData];
+                return;
+            }
+            
+           KWMainTypeModel *m = weak_self.leftTableV.arr[selectIndex];
+
+            if (m.children.count == 0) {
+                [self toResult:m.title type:m.Id keyWord:@""];
+            } else {
+                weak_self.rightTableV.arr = m.children;
+                [weak_self.rightTableV reloadData];
+            }
+        };
+    }
+    return _leftTableV;
+}
+
+- (KWSearchSubTypeTableView *)rightTableV {
+    if(!_rightTableV) {
+        KWSearchSubTypeTableView *tab = [[KWSearchSubTypeTableView alloc] initWithFrame:CGRectMake(0, 10, 180, self.view.bounds.size.height) style:UITableViewStylePlain];
+        _rightTableV = tab;
+        @weakify(self);
+        [_rightTableV setCallBack:^(NSIndexPath * _Nonnull indexP) {
+            KWSearchSubTypeModel *m = weak_self.rightTableV.arr[indexP.section].children[indexP.item];
+            [weak_self toResult:m.title type:m.Id keyWord:@""];
+        }];
+        [_rightTableV setCallBackSection:^(NSInteger index) {
+            KWSubTypeSectionModel *m = weak_self.rightTableV.arr[index];
+            if (m.isMoneyType) {
+                [MBProgressHUD showHUDAddedTo:weak_self.view animated:true];
+                [weak_self.vm switchCurrencie:m callback:^(BOOL flag) {
+
+                    if (flag) {
+                        [[NSNotificationCenter defaultCenter] postNotificationName:MoneyTypeChanged object:nil];
+                        [weak_self.vm reqCurrenciesList:^{
+                            [MBProgressHUD hideHUDForView:weak_self.view animated:true];
+                            weak_self.leftTableV.moneyType = weak_self.vm.moneyType;
+                            weak_self.rightTableV.arr = weak_self.vm.moneyType.children;
+                            [weak_self.rightTableV reloadData];
+                        }];
+                    } else {
+                        [MBProgressHUD hideHUDForView:weak_self.view animated:true];
+                    }
+                }];
+                return;
+            }
+            [weak_self toResult:m.title type:m.Id keyWord:@""];
+        }];
+    }
+    return _rightTableV;
+}
+
+
+
+
+-(UIView *)topV {
+    if (!_topV) {
+        UIView *v = [[UIView alloc] init];
+        v.backgroundColor = _FFD1B9;//[UIColor colorWithHexString:@"#FFF5F0"];
+        _topV = v;
+    }
+    return _topV;
+}
+
+-(UIView *)bottomV {
+    if (!_bottomV) {
+        UIView *v = [[UIView alloc] init];
+        v.backgroundColor = [UIColor colorWithHexString:@"#ffffff"];
+        _bottomV = v;
+    }
+    return _bottomV;
+}
+
+-(UITextField *)searchTf {
+    if (!_searchTf) {
+        UITextField *tf = [[UITextField alloc] init];
+        tf.delegate = self;
+        tf.borderStyle = UITextBorderStyleNone;
+        tf.backgroundColor = UIColor.whiteColor;
+        tf.font = [UIFont fontWithName:Rob_Regular size:14];
+        tf.textAlignment = NSTextAlignmentLeft;
+        tf.placeholder = @"SEARCH FOR PRODUCTS";
+        tf.textColor = _0B0B0B;
+//        tf.layer.borderColor = [UIColor blackColor].CGColor;
+//        tf.layer.borderWidth = 1;
+//        tf.layer.cornerRadius = 4;
+        tf.layer.masksToBounds = true;
+        tf.clearButtonMode = UITextFieldViewModeAlways;
+        UIView *tfLeftV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 45)];
+        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
+        btn.frame = tfLeftV.bounds;
+        [btn setImage:[UIImage imageNamed:@"search_tf"] forState:UIControlStateNormal];
+        [tfLeftV addSubview:btn];
+        tf.leftView = tfLeftV;
+        tf.leftViewMode = UITextFieldViewModeAlways;
+        _searchTf = tf;
+    }
+    return  _searchTf;
+}
+
+-(KWHisAndHotWordsView *)hisWordV {
+    if (!_hisWordV) {
+        KWHisAndHotWordsView *v = [[KWHisAndHotWordsView alloc] initWithFrame:CGRectZero];
+        v.isSearch = true;
+        @weakify(self);
+        [v setCallBack:^(NSString * _Nonnull word) {
+            weak_self.searchTf.text = word;
+            [self.hisWordV.vm addSearchData:word];
+            [weak_self toResult:word type:@"" keyWord:word];
+        }];
+        [v setHotCallBack:^(KWSearchHotKeyModel * _Nonnull hot) {
+            NSString *word = hot.title;
+            if (hot.type != 1) {
+                [self.hisWordV.vm addSearchData:word];
+                [weak_self toResult:word type:hot.code keyWord:@""];
+                return;
+            }
+            [self.hisWordV.vm addSearchData:word];
+            [weak_self toResult:word type:@"" keyWord:word];
+        }];
+        _hisWordV = v;
+    }
+    return  _hisWordV;
+}
+
+- (KWLenovoWordListView *)lenovoV {
+    if (!_lenovoV) {
+        KWLenovoWordListView *v = [[KWLenovoWordListView alloc] initWithFrame:CGRectMake(self.searchTf.frame.origin.x, self.topV.maxY - 8, self.searchTf.frame.size.width, 200)];
+        @weakify(self);
+        [v setCallBack:^(NSString * _Nonnull word) {
+            weak_self.searchTf.text = word;
+            [self.hisWordV.vm addSearchData:word];
+            [weak_self toResult:word type:@"" keyWord:word];
+        }];
+        _lenovoV = v;
+    }
+    return  _lenovoV;
+}
+
+
+/// show lenovo Words
+- (void) showLenovoV:(NSString *)key {
+    @weakify(self);
+    [self.hisVm getAboutKeyList:key back:^{
+        if (weak_self.hisVm.aboutKeys.count > 0 && [self.searchTf.text isEqualToString:key]) {
+            weak_self.lenovoV.hidden = false;
+            [weak_self.lenovoV setData:weak_self.hisVm.aboutKeys origen:CGPointMake(self.searchTf.frame.origin.x, self.topV.maxY - 8)];
+        } else {
+            weak_self.lenovoV.hidden = true;
+        }
+    }];
+    
+   
+}
+
+- (void)hideLenovoV {
+    self.lenovoV.hidden = true;
+}
+
+/// show lenovo Words
+- (void) showHisWordV {
+    self.hisWordV.hidden = false;
+    [_hisWordV reloadData];
+}
+
+- (void)hideHisWordV {
+    self.hisWordV.hidden = true;
+}
+
+// MARK: - pushResult
+- (void)toResult:(NSString *)key type:(NSString *)type keyWord:(NSString *)word {
+    NSDictionary *para = @{
+        @"type":type,  //String
+        @"title":key,//String
+        @"searchKey":word,//String
+    };
+    UIViewController *vc = [CTMediator.sharedInstance getProductListVc:para];
+    
+    [self.navigationController pushViewController:vc animated:true];
+}
+
+
+
+// MARK: - uitextfiled delegate
+
+- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
+    [self showHisWordV];
+    
+    NSString *txt = textField.text;
+    if ([txt isEqualToString:@""] ) {
+        [self hideLenovoV];
+    } else {
+       
+        [self showLenovoV:txt];
+    }
+    
+    return  true;
+}
+
+- (BOOL)textFieldShouldClear:(UITextField *)textField {
+    self.hisVm.aboutKeys = @[];
+    [self hideLenovoV];
+    return true;
+}
+
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    NSString *txt = textField.text;
+    txt = [txt stringByReplacingCharactersInRange:range withString:string];
+    if ([txt isEqualToString:@""] ) {
+        [self hideLenovoV];
+    } else {
+       
+        
+        [self showLenovoV:txt];
+    }
+    
+    return  true;
+}
+
+- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
+    return  true;
+}
+
+- (void)textFieldDidEndEditing:(UITextField *)textField {
+    [self hideLenovoV];
+    [self hideHisWordV];
+}
+
+- (BOOL)textFieldShouldReturn:(UITextField *)textField {
+    [textField resignFirstResponder];
+    NSString *key = textField.text;
+    if (![key isEmpty]){
+        [self.hisWordV.vm addSearchData:key];
+        [self toResult:key type:@"" keyWord:key];
+    }
+    return true;
+}
+
+@end

+ 29 - 0
Asteria/Fuction/Category/vm/KWHisAndHotWordsViewModel.h

@@ -0,0 +1,29 @@
+//
+//  KWHisAndHotWordsViewModel.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/14.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWHisAndHotWordsViewModel : NSObject
+
+- (NSArray<NSString *> *) getLocalSearchDatas;
+- (BOOL)addSearchData:(NSString *)key;
+- (void)cleanLocalHisDatas;
+@property (nonatomic,copy) btnClickBlock dataReload;
+
+@property (nonatomic, strong)NSArray *aboutKeys;
+@property (nonatomic, strong)NSArray<KWSearchHotKeyModel *> *hotKeys;
+
+-(void)getAboutKeyList:(NSString *)key back:(btnClickBlock)success;
+-(void)getHotKeyList:(btnClickBlock)success;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 104 - 0
Asteria/Fuction/Category/vm/KWHisAndHotWordsViewModel.m

@@ -0,0 +1,104 @@
+//
+//  KWHisAndHotWordsViewModel.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/14.
+//
+
+#import "KWHisAndHotWordsViewModel.h"
+static NSString *localSearchList = @"localSearchList";
+@implementation KWHisAndHotWordsViewModel
+
+
+-(void)getHotKeyList:(btnClickBlock)success {
+//    @weakify(self);
+//    [PPNetworkHelper POST:HotSeartch parameters:nil success:^(id responseObject) {
+//        if (RequestSuccess) {
+//            NSLog(@"success:%@",responseObject);
+//            NSArray *arr = [KWSearchHotKeyModel mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
+//            weak_self.hotKeys = arr;
+            success();
+//        } else {
+//            NSLog(@"fail:%@",RequestErrorMsg);
+//            weak_self.hotKeys = @[];
+//            success();
+//
+//        }
+//    } failure:^(NSError *error) {
+//        NSLog(@"err:%@",error);
+//        self.hotKeys = @[];
+//        success();
+//    }];
+}
+
+
+
+-(void)getAboutKeyList:(NSString *)key back:(btnClickBlock)success {
+//    @weakify(self);
+//    NSDictionary *para = @{@"kwd":key};
+//    [PPNetworkHelper POST:KeyAboutWord parameters:para success:^(id responseObject) {
+//        @strongify(self);
+//        if (RequestSuccess) {
+//            NSLog(@"success:%@",responseObject);
+//            NSArray *arr = [NSString mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
+//            self.aboutKeys = arr;
+//        } else {
+//            NSLog(@"fail:%@",RequestErrorMsg);
+//            self.aboutKeys = @[];
+//
+//        }
+//        success();
+//    } failure:^(NSError *error) {
+//        NSLog(@"err:%@",error);
+//        self.aboutKeys = @[];
+//        success();
+//    }];
+}
+
+
+
+
+
+// MARK: - local Search Data
+- (NSArray<NSString *> *) getLocalSearchDatas {
+    NSArray *localArr = [NSUserDefaults.standardUserDefaults stringArrayForKey:localSearchList];
+    return localArr;
+}
+
+
+
+
+- (BOOL)addSearchData:(NSString *)key {
+    if ([key isEqualToString:@""]) {
+        return false;
+    }
+    NSArray *localArr = [self getLocalSearchDatas];
+    BOOL hadContains = false;
+    for (NSString *item in localArr) {
+        if ([item isEqualToString:key]) {
+            hadContains = true;
+        }
+    }
+    NSMutableArray<NSString *> *tempArr = [NSMutableArray arrayWithArray:localArr];
+    [tempArr removeObject:key];
+    [tempArr insertObject:key atIndex:0];
+    
+    while (tempArr.count > 10) {
+        [tempArr removeLastObject];
+    }
+    [NSUserDefaults.standardUserDefaults setValue:tempArr forKey:localSearchList];
+    if (self.dataReload) {
+        self.dataReload();
+    }
+    return true;
+}
+
+- (void)cleanLocalHisDatas {
+    [NSUserDefaults.standardUserDefaults setValue:@[] forKey:localSearchList];
+    if (self.dataReload) {
+        self.dataReload();
+    }
+}
+
+
+@end

+ 26 - 0
Asteria/Fuction/Category/vm/KWSearchViewModel.h

@@ -0,0 +1,26 @@
+//
+//  KWSearchViewModel.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/20.
+//
+
+#import <Foundation/Foundation.h>
+#import "KWSearchSubTypeModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWSearchViewModel : NSObject
+
+@property (nonatomic, strong) NSArray<KWMainTypeModel *> *arr;
+
+@property (nonatomic, strong) KWMainTypeModel *moneyType;
+
+- (void)reqProductTypeList: (btnClickBlock)success;
+- (void)reqCurrenciesList:(btnClickBlock)success;
+
+- (void)switchCurrencie:(KWSubTypeSectionModel *)m  callback:(void(^)(BOOL flag))success;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 106 - 0
Asteria/Fuction/Category/vm/KWSearchViewModel.m

@@ -0,0 +1,106 @@
+//
+//  KWSearchViewModel.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/20.
+//
+
+#import "KWSearchViewModel.h"
+#import "KWSearchSubTypeModel.h"
+
+@implementation KWSearchViewModel
+
+- (void)switchCurrencie:(KWSubTypeSectionModel *)m  callback:(void(^)(BOOL flag))success {
+//    NSMutableDictionary *paraDic = [NSMutableDictionary dictionary];
+//    paraDic[@"currency"] = m.Id;
+////    @weakify(self);
+//    [PPNetworkHelper POST:SwitchCurrencies parameters:paraDic success:^(id responseObject) {
+//        if (RequestSuccess) {
+//            NSLog(@"success:%@",responseObject);
+//            [PPNetworkCache removeAllHttpCache];
+            success(true);
+//        } else {
+//            NSLog(@"fail:%@",RequestErrorMsg);
+//            success(false);
+//        }
+//    } failure:^(NSError *error) {
+//        NSLog(@"err:%@",error);
+//        success(false);
+//    }];
+    
+    
+}
+
+- (void)reqCurrenciesList:(btnClickBlock)success {
+//    NSMutableDictionary *paraDic = [NSMutableDictionary dictionary];
+//    @weakify(self);
+//    [PPNetworkHelper POST:GetCurrencies parameters:paraDic success:^(id responseObject) {
+//        if (RequestSuccess) {
+//            NSLog(@"success:%@",responseObject);
+//            NSArray *arr = (NSArray *)responseObject[@"data"];
+//            NSMutableArray *subArr = [[NSMutableArray alloc] init];
+//            for (NSDictionary *dic in arr) {
+//                NSString *name = dic[@"name"];
+//                NSString *short_name = dic[@"short_name"];
+//                NSNumber *status = dic[@"status"];
+//
+//                KWSubTypeSectionModel *m = [[KWSubTypeSectionModel alloc] init];
+//                m.Id = short_name;
+//                m.title = name;
+//                m.isOpen = status.boolValue;
+//                m.isMoneyType = true;
+//                m.children = [[NSMutableArray alloc] init];
+//                [subArr addObject:m];
+//            }
+//
+//            KWMainTypeModel *model = [KWMainTypeModel new];
+//            model.title = @"CURRENCY";
+//            model.isMoneyType = true;
+//            model.children = subArr;
+//            weak_self.moneyType = model;
+//            success();
+//        } else {
+//            NSLog(@"fail:%@",RequestErrorMsg);
+//            success();
+//        }
+//    } failure:^(NSError *error) {
+//        NSLog(@"err:%@",error);
+        success();
+//    }];
+}
+
+
+- (void)reqProductTypeList: (btnClickBlock)success {
+//    NSString *url = SearchType;//[NSString stringWithFormat:@"%@%@",Formal_Server,SearchType];
+//    NSMutableDictionary *paraDic = [NSMutableDictionary dictionary];
+//    @weakify(self);
+//    [PPNetworkHelper POST:url parameters:paraDic responseCache:^(id responseObject) {
+//        if (RequestSuccess) {
+//            NSLog(@"success:%@",responseObject);
+//
+//            NSMutableArray *arr = [KWMainTypeModel mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
+//            weak_self.arr = arr;
+//            if (arr.count > 0 ) {
+                success();
+//            }
+//        }
+//    } success:^(id responseObject) {
+//        if (RequestSuccess) {
+//            NSLog(@"success:%@",responseObject);
+//
+//            NSArray *arr = [KWMainTypeModel mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
+//            weak_self.arr = arr;
+//            success();
+//        } else {
+//            NSLog(@"fail:%@",RequestErrorMsg);
+//            weak_self.arr = @[];
+//            success();
+//        }
+//    } failure:^(NSError *error) {
+//        NSLog(@"err:%@",error);
+//        weak_self.arr = @[];
+//        success();
+//    } isSetToken:false];
+}
+
+@end

+ 8 - 0
Asteria/Fuction/Home/ASProductListViewController.h

@@ -11,6 +11,14 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface ASProductListViewController : ASBaseViewController
 
+@property (nonatomic, copy) NSString *titleName;
+@property (nonatomic, copy) NSString *type;
+@property (nonatomic, copy) NSString *keyWord;
+
+@property (nonatomic, assign) NSInteger secondTime;
+
+@property (nonatomic, assign) NSInteger pointGetType;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 75 - 3
Asteria/Fuction/Home/ASProductListViewController.m

@@ -13,6 +13,8 @@
 #import "ASProductListImageCell.h"
 #import "ASProductListTypeDesCell.h"
 #import "ASMoreBtCell.h"
+#import "ASProductSortFilterView.h"
+#import "KWProductMenuFilterView.h"
 
 @interface ASProductListViewController ()<UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
 
@@ -21,12 +23,20 @@
 @property (nonatomic, assign) BOOL desMoreOpen;
 
 
+
+
 @property (nonatomic, strong) ASProductListViewModel *vm;
 @property (nonatomic, strong) UICollectionView *collectV;
 
 
 @property (nonatomic, strong) UIButton *searchNavBt;
 
+// sort 相关
+@property (nonatomic,strong, nullable) ASProductSortFilterView *sortTypeV;
+@property (nonatomic,assign) NSInteger currentSortType;
+
+@property (nonatomic,strong, nullable) KWProductMenuFilterView *menuFilterV;
+
 @end
 
 @implementation ASProductListViewController
@@ -44,6 +54,14 @@
     
 }
 
+- (void)configFilter {
+    if (_type && ![_type isEqualToString:@""]) {
+        [self.menuFilterV configTypeId:self.type];
+    }
+}
+
+
+// MARK: sub mas
 - (void)loadSubVs {
     
     [self.view addSubview:self.collectV];
@@ -61,6 +79,14 @@
         make.bottom.equalTo(self.view);
     }];
     
+    self.sortTypeV.hidden = true;
+    [self.view addSubview:self.menuFilterV];
+    [self.menuFilterV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.customNavBar.mas_bottom);
+        make.left.right.bottom.equalTo(self.view);
+    }];
+    self.menuFilterV.hidden = true;
+    
 }
 
 - (void)loasActiveDataAndV {
@@ -154,11 +180,22 @@
     }
     if (indexPath.section == 1 && [kind isEqualToString:UICollectionElementKindSectionHeader]) {
         ASProductListMenuHeaderView *v = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"ASProductListMenuHeaderView" forIndexPath:indexPath];
-        [v setData:@"SORT BY" sortBlock:^{
-            
+        __block typeof(self) weakself = self;
+        NSString *titleStr = @"SORT BY";
+        if (self.currentSortType < self.sortTypeV.titles.count) {
+            titleStr = self.sortTypeV.titles[self.currentSortType];
+        }
+        [v setData:titleStr sortBlock:^{
+//            if (weakself.productArr.count > 0) {
+//            [weakself.collectV scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:true];
+//            }
+            [weakself showSortV];
         } menuBlock:^{
-            
+            [weakself showMenuV];
         }];
+//        if (self.sortTypeV.titles.count > self.currentSortType) {
+//            [v.sortBt setTitle:self.sortTypeV.titles[self.currentSortType] forState:UIControlStateNormal];
+//        }
         return v;
     }
     return nil;
@@ -253,6 +290,41 @@
     return _searchNavBt;
 }
 
+- (KWProductMenuFilterView *)menuFilterV {
+    if (!_menuFilterV) {
+        KWProductMenuFilterView *v = [[KWProductMenuFilterView alloc] initWithFrame:self.view.bounds];
+        __block typeof(self) weakself = self;
+        [v setResultFilterDic:^(NSDictionary<NSString *,KWProductListFilterSubModel *> * _Nonnull arr) {
+            weakself.vm.selectDic = [NSMutableDictionary dictionaryWithDictionary:arr];
+//            [weakself.collectV.mj_header beginRefreshing];
+        }];
+        _menuFilterV = v;
+    }
+    return  _menuFilterV;
+}
+
+- (ASProductSortFilterView *)sortTypeV {
+    if (!_sortTypeV) {
+        ASProductSortFilterView *v = [[ASProductSortFilterView alloc] initWithFrame:self.view.bounds];
+        __block typeof(self) weakself = self;
+        [v setSelectIndex:^(NSInteger index) {
+            weakself.currentSortType = index;
+            [weakself.collectV reloadData];
+//            [weakself.collectV.mj_header beginRefreshing];
+        }];
+        _sortTypeV = v;
+    }
+    return _sortTypeV;
+}
+
+-(void)showSortV {
+    [self.sortTypeV showAnimate:![self.keyWord isEqualToString:@""]];
+}
+
+-(void)showMenuV {
+    
+    [self.menuFilterV showAnimate:self.vm.selectDic];
+}
 
 
 

+ 22 - 0
Asteria/Fuction/Home/Home.xcassets/productlist/productLsit_filter_close.imageset/Contents.json

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

BIN
Asteria/Fuction/Home/Home.xcassets/productlist/productLsit_filter_close.imageset/productLsit_filter_close@2x.png


BIN
Asteria/Fuction/Home/Home.xcassets/productlist/productLsit_filter_close.imageset/productLsit_filter_close@3x.png


+ 22 - 0
Asteria/Fuction/Home/Home.xcassets/productlist/product_menu_clear.imageset/Contents.json

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

BIN
Asteria/Fuction/Home/Home.xcassets/productlist/product_menu_clear.imageset/product_menu_clear@2x.png


BIN
Asteria/Fuction/Home/Home.xcassets/productlist/product_menu_clear.imageset/product_menu_clear@3x.png


+ 41 - 0
Asteria/Fuction/Home/Models/KWProductListFilterModel.h

@@ -0,0 +1,41 @@
+//
+//  KWPriductListFilterModel.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/29.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWProductListFilterModel : NSObject
+
+@property (nonatomic, copy) NSString *attribute_id;
+@property (nonatomic, copy) NSString *attribute_name;
+@property (nonatomic, strong) NSMutableArray *attribute_data;
+
+- (KWProductListFilterModel *)copySelf;
+
++ (KWProductListFilterModel *)demoData;
+
+@end
+
+
+
+@interface KWProductListFilterSubModel : NSObject
+
+@property (nonatomic, copy) NSString *minPrice;
+@property (nonatomic, copy) NSString *maxPrice;
+
+@property (nonatomic, copy) NSString *Id;
+@property (nonatomic, copy) NSString *name;
+@property (nonatomic, copy) NSString *counts;
+
+- (KWProductListFilterSubModel *)copySelf;
+
++ (KWProductListFilterSubModel *)demoData;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 81 - 0
Asteria/Fuction/Home/Models/KWProductListFilterModel.m

@@ -0,0 +1,81 @@
+//
+//  KWPriductListFilterModel.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/29.
+//
+
+#import "KWProductListFilterModel.h"
+
+@implementation KWProductListFilterModel
+
++ (KWProductListFilterModel *)demoData {
+    KWProductListFilterModel *m = [KWProductListFilterModel new];
+    m.attribute_id = [NSString stringWithFormat:@"%u", arc4random()%100000];
+    m.attribute_name = @"Body Wave";
+    NSMutableArray *arr = [NSMutableArray array];
+    for (int i=0; i<(arc4random()%10+1);i++) {
+        [arr addObject:[KWProductListFilterSubModel demoData]];
+    }
+    m.attribute_data = arr;
+    return m;
+    
+}
+
+- (KWProductListFilterModel *)copySelf {
+    KWProductListFilterModel *m = [KWProductListFilterModel new];
+    m.attribute_data = [NSMutableArray array];
+    m.attribute_id = self.attribute_id;
+    m.attribute_name = self.attribute_name;
+    return m;
+    
+}
+
++ (NSDictionary *)mj_objectClassInArray{
+    
+    return @{
+        
+        @"attribute_data" : [KWProductListFilterSubModel class],
+        
+    };
+    
+    
+    
+}
+
+
+@end
+
+
+@implementation KWProductListFilterSubModel
+
++ (KWProductListFilterSubModel *)demoData {
+    KWProductListFilterSubModel *m = [KWProductListFilterSubModel new];
+    m.Id = [NSString stringWithFormat:@"%u", arc4random()%100000];
+    m.name = @"Body Wave";
+    m.counts = [NSString stringWithFormat:@"%u", arc4random()%100000];
+    m.minPrice = @"";
+    m.maxPrice = @"";
+    return m;
+    
+}
+
+- (KWProductListFilterSubModel *)copySelf {
+    KWProductListFilterSubModel *m = [KWProductListFilterSubModel new];
+    m.Id = self.Id;
+    m.name = self.name;
+    m.counts = self.counts;
+    return m;
+    
+}
+
++ (NSDictionary *)mj_replacedKeyFromPropertyName {
+    return @{
+        @"Id": @"id",
+    };
+}
+
+
+
+
+@end

+ 11 - 0
Asteria/Fuction/Home/Target_Home.h

@@ -13,6 +13,17 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (UIViewController *)Action_getHomeVc:(NSDictionary *)params;
 
+/**
+    - params:  {
+    "type":typeId,  //String
+ "title":titleStr,//String
+ "searchKey":keyword,//String
+ "secondTime": secondTime,// NSNumber,
+ "pointGetType":pointGetType,//NSNumber
+ }
+ */
+- (UIViewController *)Action_getProductListVc:(NSDictionary *)params;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 30 - 0
Asteria/Fuction/Home/Target_Home.m

@@ -7,6 +7,7 @@
 
 #import "Target_Home.h"
 #import "ASHomeViewController.h"
+#import "ASProductListViewController.h"
 
 @implementation Target_Home
 
@@ -15,4 +16,33 @@
     return  vc;
 }
 
+
+/**
+    - params:  {
+    "type":typeId,  //String
+ "title":titleStr,//String
+ "searchKey":keyword,//String
+ "secondTime": secondTime,// NSNumber,
+ "pointGetType":pointGetType,//NSNumber
+ }
+ */
+- (UIViewController *)Action_getProductListVc:(NSDictionary *)params {
+    ASProductListViewController *vc = [[ASProductListViewController alloc] init];
+    vc.titleStr = params[@"title"];
+    if ([params valueForKey:@"searchKey"] != nil) {
+        vc.keyWord = params[@"searchKey"];
+    }
+    if ([params valueForKey:@"type"] != nil) {
+        vc.type = params[@"type"];
+    }
+    if ([params valueForKey:@"secondTime"] != nil) {
+        vc.secondTime = ((NSNumber *)params[@"secondTime"]).integerValue;
+    }
+    if ([params valueForKey:@"pointGetType"] != nil) {
+        vc.pointGetType = ((NSNumber *)params[@"pointGetType"]).integerValue;
+    }
+    
+    return  vc;
+}
+
 @end

+ 1 - 1
Asteria/Fuction/Home/Views/productList/ASProductListMenuHeaderView.h

@@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface ASProductListMenuHeaderView : UICollectionReusableView
 
-
+@property (nonatomic, strong) UIButton *sortBt;
 
 - (void)setData:(NSString *)sortTitle sortBlock:(btnClickBlock)sortBlock menuBlock:(btnClickBlock)menuBlock;
 

+ 1 - 1
Asteria/Fuction/Home/Views/productList/ASProductListMenuHeaderView.m

@@ -10,7 +10,7 @@
 @interface ASProductListMenuHeaderView ()
 
 @property (nonatomic, strong) UIView *sortMenuV;
-@property (nonatomic, strong) UIButton *sortBt;
+
 @property (nonatomic, strong) UIButton *menuBt;
 
 @property (nonatomic, copy) btnClickBlock menuBlock;

+ 20 - 0
Asteria/Fuction/Home/Views/productList/ASProductListSortFilterCell.h

@@ -0,0 +1,20 @@
+//
+//  ASProductListSortFilterCell.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASProductListSortFilterCell : UITableViewCell
+
+@property (nonatomic, strong) UILabel *titleLb;
+
+- (void)setData:(NSString *)title isSelect:(BOOL)isSelect ;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 71 - 0
Asteria/Fuction/Home/Views/productList/ASProductListSortFilterCell.m

@@ -0,0 +1,71 @@
+//
+//  ASProductListSortFilterCell.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "ASProductListSortFilterCell.h"
+
+@implementation ASProductListSortFilterCell
+
+- (void)setData:(NSString *)title isSelect:(BOOL)isSelect {
+    self.titleLb.text = title;
+    self.titleLb.font = [UIFont fontWithName:(isSelect ? Rob_Bold : Rob_Regular) size:14];
+    self.titleLb.textColor = isSelect ? Col_FFF : Col_000;
+    self.contentView.backgroundColor = isSelect ? Col_000 : Col_FFF;
+}
+
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        [self configSubV];
+    }
+    return self;
+}
+
+- (void)configSubV {
+    self.backgroundColor = UIColor.whiteColor;
+    self.contentView.backgroundColor = UIColor.whiteColor;
+    [self.contentView addSubview:self.titleLb];
+    
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@57);
+        make.top.bottom.equalTo(self.contentView);
+        make.leading.equalTo(self.contentView).offset(10);
+        make.trailing.equalTo(self.contentView).offset(-10);
+    }];
+    
+    
+    
+}
+
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Regular size:14];
+        lb.textColor = [UIColor blackColor];
+        lb.textAlignment = NSTextAlignmentCenter;
+        lb.backgroundColor = [UIColor clearColor];
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+
+
+@end

+ 22 - 0
Asteria/Fuction/Home/Views/productList/ASProductSortFilterView.h

@@ -0,0 +1,22 @@
+//
+//  ASProductSortFilterView.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASProductSortFilterView : UIView
+
+@property (nonatomic,strong) NSArray *titles;
+
+@property (nonatomic, copy, nullable) void(^selectIndex)(NSInteger index);
+
+- (void)showAnimate:(BOOL)isKey;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 199 - 0
Asteria/Fuction/Home/Views/productList/ASProductSortFilterView.m

@@ -0,0 +1,199 @@
+//
+//  ASProductSortFilterView.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "ASProductSortFilterView.h"
+#import "ASProductListSortFilterCell.h"
+#import "ASHomeAlertWindow.h"
+
+
+
+@interface ASProductSortFilterView ()<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic,assign) NSInteger currentIndex;
+
+@property (nonatomic,strong) UIView *bottomV;
+
+@property (nonatomic, strong) UIView *topV;
+@property (nonatomic, strong) UITableView *tableV;
+@property (nonatomic, strong) UIButton *closeBt;
+
+@end
+
+@implementation ASProductSortFilterView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self configSubV];
+//        self.transform = CGAffineTransformScale(self.transform, 1, 0.1);
+    }
+    return  self;
+}
+
+- (void)closeAction:(void(^)(void))complate {
+    CGRect oldFrame = self.frame;
+    [UIView animateWithDuration:0.4 animations:^{
+        CGRect tempFrame = self.frame;
+        tempFrame.origin.y = KScreenHeight;
+        self.frame = tempFrame;
+        
+    } completion:^(BOOL finished) {
+        self.frame = CGRectMake(0, KScreenHeight, oldFrame.size.width, oldFrame.size.height);
+        self.hidden = true;
+        self.frame = oldFrame;
+        [ASHomeAlertWindow clearWindow];
+        complate();
+    }];
+    
+}
+
+- (void)showAnimate:(BOOL)isKey {
+    if (isKey) {
+        self.titles = @[@"Popular",@"Price",@"Sold Quantity"];
+    } else {
+        self.titles = @[@"Relevance",@"Price",@"Sold Quantity"];
+    }
+    [self.tableV reloadData];
+    [ASHomeAlertWindow showCustomVc:self position:ASAlertPositionBottom];
+    CGRect oldFrame = self.frame;
+    self.frame = CGRectMake(0, KScreenHeight, oldFrame.size.width, oldFrame.size.height);
+    self.hidden = false;
+    [UIView animateWithDuration:0.4 animations:^{
+        CGRect tempFrame = self.frame;
+        tempFrame.origin.y = KScreenHeight-oldFrame.size.height;
+        self.frame = tempFrame;
+    } completion:^(BOOL finished) {
+        self.frame = oldFrame;
+    }];
+    
+}
+
+- (void)configSubV {
+    self.titles = @[@"Popular",@"Price",@"Sold Quantity"];
+    self.currentIndex = 0;
+    
+    [self addSubview:self.topV];
+    [self.topV addSubview:self.closeBt];
+    [self addSubview:self.bottomV];
+    [self.bottomV addSubview:self.tableV];
+    
+    
+    
+    
+    
+    
+    [self.topV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.greaterThanOrEqualTo(self);
+        make.left.right.equalTo(self);
+        make.height.equalTo(@60);
+    }];
+    
+    [self.closeBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.equalTo(self.topV);
+        make.trailing.equalTo(self.topV).offset(-10);
+        make.width.height.equalTo(@44);
+    }];
+    [self.bottomV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.topV.mas_bottom);
+        make.left.right.equalTo(self);
+        make.height.equalTo(@(190 + kBottomSafeSpace));
+        make.bottom.equalTo(self);
+    }];
+    [self.tableV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.leading.trailing.equalTo(self.bottomV);
+        make.bottom.equalTo(self.bottomV).offset(-kBottomSafeSpace);
+    }];
+    
+//    CAGradientLayer *lay = [[CAGradientLayer alloc] init];
+//    lay.frame = CGRectMake(0, 0, self.frame.size.width, 180);
+//    CGColorRef c1 = UIColor.whiteColor.CGColor;
+//    CGColorRef c2 = [[UIColor colorWithHexString:@"#FFE8E9"] CGColor];
+//    lay.colors = [NSArray arrayWithObjects: (__bridge id)c1,(__bridge id)c2,nil];
+//    lay.startPoint = CGPointMake(0.5, 0);
+//    lay.endPoint = CGPointMake(0.5, 1);
+//    lay.locations =  @[@(0), @(1.0f)];
+//    [self.bottomV.layer insertSublayer:lay atIndex:0];
+    
+    
+}
+
+- (UIButton *)closeBt {
+    if (!_closeBt) {
+        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [btn setImage:[UIImage imageNamed:@"productLsit_filter_close"] forState:UIControlStateNormal];
+        [btn addTarget:self action:@selector(closeBTAction) forControlEvents:UIControlEventTouchUpInside];
+        _closeBt = btn;
+    }
+    return _closeBt;
+}
+
+- (void)closeBTAction {
+    [self closeAction:^{}];
+}
+
+-(UIView *)topV {
+    if (!_topV) {
+        UIView * v = [[UIView alloc] init];
+        v.backgroundColor = UIColor.whiteColor;
+        _topV = v;
+    }
+    return _topV;
+}
+
+- (UIView *)bottomV {
+    if (!_bottomV) {
+        UIView *v = [[UIView alloc] init];
+        v.backgroundColor = UIColor.whiteColor;
+        _bottomV = v;
+    }
+    return  _bottomV;
+}
+
+- (UITableView *)tableV {
+    if (!_tableV) {
+        UITableView *v = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) style:UITableViewStylePlain];
+        v.backgroundColor = UIColor.clearColor;
+        v.delegate = self;
+        v.dataSource = self;
+        v.separatorStyle = UITableViewCellSeparatorStyleNone;
+        [v registerClass:[ASProductListSortFilterCell class] forCellReuseIdentifier:@"ASProductListSortFilterCell"];
+        _tableV = v;
+    }
+    return  _tableV;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    self.currentIndex = indexPath.row;
+    [self.tableV reloadData];
+    
+    [self closeAction:^{
+        if (self.selectIndex) {
+            self.selectIndex(indexPath.row);
+        }
+    }];
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return _titles.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    ASProductListSortFilterCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ASProductListSortFilterCell" forIndexPath:indexPath];
+    
+    NSString *title = _titles[indexPath.row];
+    [cell setData:title isSelect:indexPath.row == self.currentIndex];
+    return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    return 57;
+}
+
+
+
+
+@end

+ 20 - 0
Asteria/Fuction/Home/Views/productList/ASProductlistFilterPriceCollectCell.h

@@ -0,0 +1,20 @@
+//
+//  ASProductlistFilterPriceCollectCell.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASProductlistFilterPriceCollectCell : UICollectionViewCell
+
+@property (nonatomic, strong) UITextField *minTf;
+@property (nonatomic, strong) UITextField *maxTf;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 129 - 0
Asteria/Fuction/Home/Views/productList/ASProductlistFilterPriceCollectCell.m

@@ -0,0 +1,129 @@
+//
+//  ASProductlistFilterPriceCollectCell.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "ASProductlistFilterPriceCollectCell.h"
+
+@interface ASProductlistFilterPriceCollectCell()
+
+@property (nonatomic, strong) UIView *lineV;
+@property (nonatomic, strong) UIView *minBgV;
+@property (nonatomic, strong) UIView *maxBgV;
+
+@end
+
+@implementation ASProductlistFilterPriceCollectCell
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self loadSubVs];
+    }
+    return self;
+}
+
+- (void)loadSubVs {
+    [self addSubview:self.minBgV];
+    [self addSubview:self.lineV];
+    [self addSubview:self.maxBgV];
+    [self.minBgV addSubview:self.minTf];
+    [self.maxBgV addSubview:self.maxTf];
+    [self.minBgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@45);
+        make.leading.equalTo(self).offset(0);
+        make.top.bottom.equalTo(self);
+    }];
+    [self.maxBgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@45);
+        make.trailing.equalTo(self).offset(0);
+        make.top.bottom.equalTo(self);
+        make.width.equalTo(self.minBgV.mas_width);
+    }];
+    
+    [self.lineV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.equalTo(self.minBgV);
+        make.leading.equalTo(self.minBgV.mas_trailing).offset(10);
+        make.trailing.equalTo(self.maxBgV.mas_leading).offset(-10);
+        make.height.equalTo(@4);
+        make.width.equalTo(@10);
+    }];
+    
+    [self.minTf mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.bottom.equalTo(self.minBgV);
+        make.leading.equalTo(self.minBgV).offset(20);
+        make.trailing.equalTo(self.minBgV).offset(-20);
+    }];
+    
+    [self.maxTf mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.bottom.equalTo(self.maxBgV);
+        make.leading.equalTo(self.maxBgV).offset(20);
+        make.trailing.equalTo(self.maxBgV).offset(-20);
+    }];
+    
+}
+
+- (UIView *)lineV {
+    if (!_lineV) {
+        UIView *v = [UIView baseV];
+        v.backgroundColor = Col_000;
+        _lineV = v;
+    }
+    return _lineV;
+}
+
+- (UIView *)minBgV {
+    if (!_minBgV) {
+        UIView *v = [UIView baseV];
+        v.backgroundColor = Col_FFF;
+        v.layer.borderColor = Col_666.CGColor;
+        v.layer.borderWidth = 1;
+        v.layer.cornerRadius = 4;
+        v.layer.masksToBounds = true;
+        _minBgV = v;
+    }
+    return _minBgV;
+}
+
+- (UIView *)maxBgV {
+    if (!_maxBgV) {
+        UIView *v = [UIView baseV];
+        v.backgroundColor = Col_FFF;
+        v.layer.borderColor = Col_666.CGColor;
+        v.layer.borderWidth = 1;
+        v.layer.cornerRadius = 4;
+        v.layer.masksToBounds = true;
+        _maxBgV = v;
+    }
+    return _maxBgV;
+}
+
+- (UITextField *)minTf {
+    if (!_minTf) {
+        UITextField *tf = [[UITextField alloc] init];
+        tf.borderStyle = UITextBorderStyleNone;
+        tf.placeholder = @"MIN.PRICE";
+        tf.textColor = Col_000;
+        tf.font = [UIFont fontWithName:Rob_Regular size:14];
+        tf.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
+        _minTf = tf;
+    }
+    return _minTf;
+}
+
+- (UITextField *)maxTf {
+    if (!_maxTf) {
+        UITextField *tf = [[UITextField alloc] init];
+        tf.borderStyle = UITextBorderStyleNone;
+        tf.placeholder = @"MAX.PRICE";
+        tf.textColor = Col_000;
+        tf.font = [UIFont fontWithName:Rob_Regular size:14];
+        tf.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
+        _maxTf = tf;
+    }
+    return _maxTf;
+}
+
+@end

+ 21 - 0
Asteria/Fuction/Home/Views/productList/KWProductFilterItemCell.h

@@ -0,0 +1,21 @@
+//
+//  KWProductFilterItemCell.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWProductFilterItemCell : UICollectionViewCell
+
+@property (nonatomic, strong) UILabel *titleLb;
+@property (nonatomic,strong) UIImageView *currentTipV;
+
+- (void)setData:(NSString *)title isSelect:(BOOL)isSelect ;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 85 - 0
Asteria/Fuction/Home/Views/productList/KWProductFilterItemCell.m

@@ -0,0 +1,85 @@
+//
+//  KWProductFilterItemCell.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWProductFilterItemCell.h"
+
+@implementation KWProductFilterItemCell
+
+- (void)setData:(NSString *)title isSelect:(BOOL)isSelect {
+    self.titleLb.text = title;
+    self.currentTipV.layer.borderWidth = isSelect ? 0 : 1;
+    self.currentTipV.backgroundColor = isSelect ? _32CFB0 : Col_FFF;
+    self.titleLb.font = [UIFont fontWithName:(isSelect ? Rob_Bold : Rob_Regular) size:14];
+    
+}
+
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self configSubV];
+    }
+    return self;
+}
+
+
+
+- (void)configSubV {
+    self.backgroundColor = UIColor.clearColor;
+    self.contentView.backgroundColor = UIColor.clearColor;
+    [self.contentView addSubview:self.currentTipV];
+    [self.contentView addSubview:self.titleLb];
+    
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@18);
+        make.center.equalTo(self.contentView);
+        make.left.greaterThanOrEqualTo(@15);
+    }];
+    
+    [self.currentTipV mas_makeConstraints:^(MASConstraintMaker *make) {
+        //        make.width.equalTo(@26);
+        //        make.height.equalTo(@17);
+        make.edges.equalTo(self.contentView);
+            }];
+    
+}
+
+-(UIImageView *)currentTipV {
+    if (!_currentTipV) {
+        UIImageView *imgV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]];
+        imgV.backgroundColor = Col_FFF;
+        imgV.layer.cornerRadius = 4;
+        imgV.layer.masksToBounds = true;
+        imgV.layer.borderWidth = 1;
+        imgV.layer.borderColor = [_E5E5E5 CGColor];
+        imgV.contentMode = UIViewContentModeScaleAspectFit;
+        _currentTipV = imgV;
+    }
+    return  _currentTipV;
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Regular size:14];
+        lb.textColor = [UIColor blackColor];
+        lb.textAlignment = NSTextAlignmentCenter;
+        lb.backgroundColor = [UIColor clearColor];
+        lb.numberOfLines = 0;
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+@end

+ 18 - 0
Asteria/Fuction/Home/Views/productList/KWProductMenuFilterItemHeaderView.h

@@ -0,0 +1,18 @@
+//
+//  KWProductMenuFilterItemHeaderView.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWProductMenuFilterItemHeaderView : UICollectionReusableView
+
+@property (nonatomic, strong) UILabel *titleLb;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 59 - 0
Asteria/Fuction/Home/Views/productList/KWProductMenuFilterItemHeaderView.m

@@ -0,0 +1,59 @@
+//
+//  KWProductMenuFilterItemHeaderView.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWProductMenuFilterItemHeaderView.h"
+
+@implementation KWProductMenuFilterItemHeaderView
+
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self configSubV];
+    }
+    return self;
+}
+
+//- (void)layoutSubviews {
+//    [super layoutSubviews];
+//    [self configSubV];
+//}
+
+- (void)configSubV {
+    self.backgroundColor = UIColor.whiteColor;
+    
+    [self addSubview:self.titleLb];
+    
+    [self.titleLb mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@18);
+        make.bottom.equalTo(self).offset(-2);
+        make.left.equalTo(self).offset(10);
+        make.right.equalTo(self).offset(-10);
+    }];
+    
+    
+}
+
+- (UILabel *)titleLb {
+    if (!_titleLb) {
+        UILabel *lb = [[UILabel alloc] init];
+        lb.font = [UIFont fontWithName:Rob_Bold size:14];
+        lb.textColor = [UIColor blackColor];
+        lb.textAlignment = NSTextAlignmentLeft;
+        lb.backgroundColor = [UIColor clearColor];
+        _titleLb = lb;
+    }
+    return _titleLb;
+}
+
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+@end

+ 37 - 0
Asteria/Fuction/Home/Views/productList/KWProductMenuFilterView.h

@@ -0,0 +1,37 @@
+//
+//  KWProductMenuFilterView.h
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import <UIKit/UIKit.h>
+#import "KWProductFilterItemCell.h"
+
+#import "ASProductListViewModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KWProductMenuFilterView : UIView <UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
+
+
+
+@property (nonatomic, strong) UIView *topV;
+@property (nonatomic, strong) UIView *collectBgV;
+@property (nonatomic, strong) UICollectionView *collectV;
+@property (nonatomic, strong) UIView *bottomV;
+@property (nonatomic, strong) UIButton *closeBt;
+
+@property (nonatomic, copy, nullable) void(^resultFilterDic)(NSDictionary<NSString *,KWProductListFilterSubModel *> * _Nonnull arr);
+
+//@property (nonatomic, copy) void(^resultFilter)(NSMutableArray<KWProductListFilterModel *> *arr);
+
+- (void)configTypeId:(NSString *)typeId;
+
+//- (void)getFilterData;
+
+- (void)showAnimate:(NSMutableDictionary<NSString *,KWProductListFilterSubModel *> *)arr;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 383 - 0
Asteria/Fuction/Home/Views/productList/KWProductMenuFilterView.m

@@ -0,0 +1,383 @@
+//
+//  KWProductMenuFilterView.m
+//  westkissMob
+//
+//  Created by iOS on 2022/9/13.
+//
+
+#import "KWProductMenuFilterView.h"
+#import "KWProductMenuFilterItemHeaderView.h"
+#import "ASProductlistFilterPriceCollectCell.h"
+
+@interface KWProductMenuFilterView ()
+
+@property (nonatomic, copy) NSString *typeid;
+
+@property (nonatomic, strong) ASProductListViewModel *vm;
+
+@property (nonatomic,strong) UIButton *clearBt;
+@property (nonatomic, strong) UIButton *doneBt;
+
+
+
+
+
+@end
+
+
+@implementation KWProductMenuFilterView
+
+
+- (void)configTypeId:(NSString *)typeId {
+    self.typeid = typeId;
+    self.vm.selectDic = [NSMutableDictionary dictionary];
+    [self getFilterData];
+}
+
+- (void)getFilterData {
+//    if (self.vm.sourceArr.count != 0) {
+//        return;
+//    }
+//    [self.vm reqFilterListByType:self.typeid view:self callBack:^{
+//        [self.collectV reloadData];
+//    }];
+}
+
+- (void)configBottomBt {
+}
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.vm = [[ASProductListViewModel alloc] init];
+        [self configSubV];
+       
+    }
+    return  self;
+}
+
+
+-(void)configSubV {
+    [self addSubview:self.topV];
+    [self addSubview:self.collectBgV];
+    [self addSubview:self.bottomV];
+    
+    [self.topV addSubview:self.closeBt];
+    [self.collectBgV addSubview:self.collectV];
+    [self.bottomV addSubview:self.clearBt];
+    [self.bottomV addSubview:self.doneBt];
+    
+    [self.topV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.left.right.equalTo(self);
+        make.height.equalTo(@60);
+    }];
+    [self.bottomV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(self);
+        make.left.right.equalTo(self);
+    }];
+    [self.collectBgV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.equalTo(self.topV.mas_bottom);
+        make.bottom.equalTo(self.bottomV.mas_top);
+        make.left.right.equalTo(self);
+    }];
+    
+    [self.closeBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.centerY.equalTo(self.topV);
+        make.trailing.equalTo(self.topV).offset(-10);
+        make.width.height.equalTo(@44);
+    }];
+    [self.collectV mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.collectBgV);
+    }];
+    
+    [self.clearBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.width.height.equalTo(@35);
+        make.top.equalTo(self.bottomV).offset(11);
+        make.left.equalTo(self.bottomV).offset(30);
+        make.bottom.equalTo(self.mas_safeAreaLayoutGuideBottom).offset(-15);
+    }];
+    
+    [self.doneBt mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.height.equalTo(@35);
+        make.top.equalTo(self.bottomV).offset(11);
+        make.right.equalTo(self.bottomV).offset(-30);
+        make.left.equalTo(self.clearBt.mas_right).offset(10);
+        make.bottom.equalTo(self.mas_safeAreaLayoutGuideBottom).offset(-15);
+    }];
+    
+    
+    
+    
+}
+
+
+- (UIButton *)closeBt {
+    if (!_closeBt) {
+        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [btn setImage:[UIImage imageNamed:@"productLsit_filter_close"] forState:UIControlStateNormal];
+        [btn addTarget:self action:@selector(closeBtAction) forControlEvents:UIControlEventTouchUpInside];
+        _closeBt = btn;
+    }
+    return _closeBt;
+}
+
+-(void)closeBtAction {
+    [self closeAction:^{}];
+}
+
+- (UIButton *)doneBt {
+    if (!_doneBt) {
+        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [btn setTitle:@"GO" forState:UIControlStateNormal];
+        [btn setBackgroundColor:[UIColor blackColor]];
+        [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
+        btn.titleLabel.font = [UIFont fontWithName:Rob_Regular size:14];
+        [btn addTarget:self action:@selector(doneBtAction) forControlEvents:UIControlEventTouchUpInside];
+        _doneBt = btn;
+    }
+    return _doneBt;
+}
+
+- (UIButton *)clearBt {
+    if (!_clearBt) {
+        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
+        [btn setImage:[UIImage imageNamed:@"product_menu_clear"] forState:UIControlStateNormal];
+        [btn addTarget:self action:@selector(clearBtAction) forControlEvents:UIControlEventTouchUpInside];
+        _clearBt = btn;
+    }
+    return _clearBt;
+}
+
+- (void)doneBtAction {
+    [self closeAction:^{
+        if (self.resultFilterDic) {
+            self.resultFilterDic(self.vm.selectDic);
+        }
+    }];
+}
+
+- (void)clearBtAction {
+    [self.vm.selectDic removeAllObjects];
+//    [KWClearTipWindow show:true];
+    [self.collectV reloadData];
+}
+
+- (void)showAnimate:(NSMutableDictionary<NSString *,KWProductListFilterSubModel *> *)arr {
+    self.hidden = false;
+    self.vm.selectDic = [NSMutableDictionary dictionaryWithDictionary:arr];
+    [self getFilterData];
+    CGRect oldFrame = self.frame;
+    self.frame = CGRectMake(0, -oldFrame.size.height, oldFrame.size.width, oldFrame.size.height);
+    self.hidden = false;
+    [UIView animateWithDuration:0.4 animations:^{
+        CGRect tempFrame = self.frame;
+        tempFrame.origin.y = 0;
+        self.frame = tempFrame;
+    } completion:^(BOOL finished) {
+        self.frame = oldFrame;
+    }];
+    
+}
+
+- (void)closeAction:(void(^)(void))complate {
+    CGRect oldFrame = self.frame;
+    [UIView animateWithDuration:0.4 animations:^{
+        CGRect tempFrame = self.frame;
+        tempFrame.origin.y = -oldFrame.size.height;
+        self.frame = tempFrame;
+        
+    } completion:^(BOOL finished) {
+        self.frame = CGRectMake(0, -oldFrame.size.height, oldFrame.size.width, oldFrame.size.height);
+        self.hidden = true;
+        self.frame = oldFrame;
+        complate();
+    }];
+    
+}
+
+
+-(UIView *)topV {
+    if (!_topV) {
+        UIView * v = [[UIView alloc] init];
+        v.backgroundColor = UIColor.whiteColor;
+        _topV = v;
+    }
+    return _topV;
+}
+
+- (UIView *)bottomV {
+    if (!_bottomV) {
+        UIView *v = [[UIView alloc] init];
+        v.backgroundColor = UIColor.whiteColor;
+        _bottomV = v;
+    }
+    return  _bottomV;
+}
+
+- (UIView *)collectBgV {
+    if (!_collectBgV) {
+        UIView *v = [[UIView alloc] init];
+        v.backgroundColor = UIColor.whiteColor;
+        _collectBgV = v;
+    }
+    return  _collectBgV;
+}
+
+- (UICollectionView *)collectV {
+    if (!_collectV) {
+        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+        layout.minimumLineSpacing = 8;
+        layout.minimumInteritemSpacing = 8;
+        CGFloat wid = (KScreenWidth-8*3)/2-1;
+        layout.itemSize = CGSizeMake(wid, 40);
+        layout.sectionInset = UIEdgeInsetsMake(12, 8, 15, 8);
+        UICollectionView *v = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0,KScreenWidth, 500) collectionViewLayout:layout];
+        v.backgroundColor = UIColor.whiteColor;
+        v.delegate = self;
+        v.dataSource = self;
+        [v registerClass:[ASProductlistFilterPriceCollectCell class] forCellWithReuseIdentifier:@"ASProductlistFilterPriceCollectCell"];
+        [v registerClass:[KWProductMenuFilterItemHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"KWProductMenuFilterItemHeaderView"];
+        [v registerClass:[KWProductFilterItemCell class] forCellWithReuseIdentifier:@"KWProductFilterItemCell"];
+        _collectV = v;
+    }
+    return  _collectV;
+}
+
+- (BOOL)hadSelectIndex:(NSIndexPath *)index {
+    KWProductListFilterModel *mainM = self.vm.showArr[index.section];
+    KWProductListFilterSubModel *subM = mainM.attribute_data[index.item];
+    
+    KWProductListFilterSubModel *selectSubM = self.vm.selectDic[mainM.attribute_id];
+    if (selectSubM && [selectSubM.Id isEqualToString:subM.Id]) {
+        return  true;
+    }
+//    if (index.section < self.vm.selectArr.count) {
+//        return true;
+//    }
+    return false;
+}
+
+- (void)selectIndex:(NSIndexPath *)index {
+    BOOL isselct = [self hadSelectIndex:index];
+    if (isselct) {
+        KWProductListFilterModel *m = self.vm.showArr[index.section];
+        //self.vm.selectArr[index.section];
+        self.vm.selectDic[m.attribute_id] = nil;
+        
+//        if (m.attribute_data.count > index.row) {
+//            [m.attribute_data removeObjectAtIndex:index.row];
+//        }
+//        if (m.attribute_data.count == 0) {
+//            [self.vm.selectArr removeObjectAtIndex:index.section];
+//        }
+        [self.collectV reloadData];
+//        [self getFilterData];
+        return;
+    }
+    
+    KWProductListFilterModel *m = self.vm.showArr[index.section];
+    KWProductListFilterSubModel *subm = m.attribute_data[index.row];
+    
+//    KWProductListFilterModel *newM = [m copySelf];
+    KWProductListFilterSubModel *newSubm = [subm copySelf];
+    self.vm.selectDic[m.attribute_id] = newSubm;
+    
+//    [newM.attribute_data addObject:newSubm];
+    
+    
+//    [self.vm.selectArr addObject:newM];
+    [self.collectV reloadData];
+//    [self getFilterData];
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+    if ([self.vm.showArr[indexPath.section].attribute_id isEqualToString: @"-100"]) {
+        return;
+    }
+    
+//    NSMutableArray<NSIndexPath *> *tempArr = self.currentIndexs;
+//    NSInteger arrIndex = [self hadSelectIndex:indexPath];
+//    if (arrIndex >= 0) {
+//        [tempArr removeObjectAtIndex:arrIndex];
+//    } else {
+//        [tempArr addObject:indexPath];
+//    }
+//    self.currentIndexs = tempArr;
+    [self selectIndex:indexPath];
+}
+
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+    return  self.vm.showArr.count;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+    NSArray *subModels = self.vm.showArr[section].attribute_data;
+    if (subModels == nil) {
+        return 0;
+    }
+    
+    return subModels.count;
+}
+
+- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+    if ([self.vm.showArr[indexPath.section].attribute_id isEqualToString: @"-100"]) {
+        ASProductlistFilterPriceCollectCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ASProductlistFilterPriceCollectCell" forIndexPath:indexPath];
+        NSArray<KWProductListFilterSubModel *> *subModels = self.vm.showArr[indexPath.section].attribute_data;
+        if (indexPath.item >= subModels.count ){
+            return cell;
+        }
+        KWProductListFilterSubModel *m = subModels[indexPath.item];
+        cell.minTf.text = m.minPrice;
+        cell.maxTf.text = m.maxPrice;
+        return cell;
+    }
+    KWProductFilterItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"KWProductFilterItemCell" forIndexPath:indexPath];
+    NSInteger isSelect = [self hadSelectIndex:indexPath];
+    
+    NSArray<KWProductListFilterSubModel *> *subModels = self.vm.showArr[indexPath.section].attribute_data;
+    if (subModels == nil) {
+        return 0;
+    }
+    NSString *ti = [NSString stringWithFormat:@"%@(%@)",subModels[indexPath.item].name,subModels[indexPath.item].counts];
+    [cell setData:ti isSelect:isSelect];
+    
+    return cell;
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
+    return CGSizeMake(KScreenWidth, 50);
+}
+
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
+    return  8;
+}
+
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
+    return  8;
+}
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
+    return UIEdgeInsetsMake(12, 8, 15, 8);
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+    if ([self.vm.showArr[indexPath.section].attribute_id isEqualToString: @"-100"]) {
+        return CGSizeMake(KScreenWidth-8*2, 45);;
+    }
+    CGFloat wid = (KScreenWidth-8*3)/2-1;
+    
+    return CGSizeMake(wid, 40);;
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
+    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
+        KWProductMenuFilterItemHeaderView *v = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"KWProductMenuFilterItemHeaderView" forIndexPath:indexPath];
+        NSString *ti = [NSString stringWithFormat:@"%@",self.vm.showArr[indexPath.section].attribute_name];
+        v.titleLb.text = ti;
+        return  v;
+    }
+    return  nil;
+}
+
+
+
+@end

+ 16 - 0
Asteria/Fuction/Home/alert/ASHomeAlertViewController.h

@@ -0,0 +1,16 @@
+//
+//  ASHomeAlertViewController.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ASHomeAlertViewController : UIViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 23 - 0
Asteria/Fuction/Home/alert/ASHomeAlertViewController.m

@@ -0,0 +1,23 @@
+//
+//  ASHomeAlertViewController.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "ASHomeAlertViewController.h"
+
+@interface ASHomeAlertViewController ()
+
+@end
+
+@implementation ASHomeAlertViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+}
+
+
+
+@end

+ 29 - 0
Asteria/Fuction/Home/alert/ASHomeAlertWindow.h

@@ -0,0 +1,29 @@
+//
+//  ASHomeAlertWindow.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+
+
+typedef enum : NSUInteger {
+    ASAlertPositionTop,
+    ASAlertPositionCenter,
+    ASAlertPositionBottom,
+} ASAlertPosition;
+
+@interface ASHomeAlertWindow : UIWindow
+
+
++ (void)clearWindow;
++ (void)showCustomVc:(UIView *)v position:(ASAlertPosition)postion;
+
+@end
+
+
+NS_ASSUME_NONNULL_END

+ 67 - 0
Asteria/Fuction/Home/alert/ASHomeAlertWindow.m

@@ -0,0 +1,67 @@
+//
+//  ASHomeAlertWindow.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "ASHomeAlertWindow.h"
+#import "ASHomeAlertViewController.h"
+
+ASHomeAlertWindow * _Nullable homeAlertW;
+
+@interface ASHomeAlertWindow ()
+
+@property (nonatomic, strong) ASHomeAlertViewController *vc;
+
+@end
+
+@implementation ASHomeAlertWindow
+
++ (void)clearWindow {
+    homeAlertW = nil;
+}
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self createVc];
+    }
+    return self;
+}
+
+- (void)createVc {
+    self.windowLevel = UIWindowLevelStatusBar + 3;
+    self.vc = [[ASHomeAlertViewController alloc] init];
+    self.vc.view.backgroundColor = [UIColor.blackColor colorWithAlphaComponent:0.7];
+    self.rootViewController = self.vc;
+    [self makeKeyAndVisible];
+}
+
++ (void)showCustomVc:(UIView *)v position:(ASAlertPosition)postion {
+    ASHomeAlertWindow *w = [[ASHomeAlertWindow alloc] initWithFrame: UIScreen.mainScreen.bounds];
+    w.backgroundColor = UIColor.clearColor;
+    [w.vc.view addSubview:v];
+    homeAlertW = w;
+    
+    [v mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.leading.trailing.equalTo(w.vc.view);
+        switch (postion) {
+            case ASAlertPositionTop:
+                make.top.equalTo(w.vc.view);
+                break;
+            case ASAlertPositionBottom:
+                make.bottom.equalTo(w.vc.view);
+                break;
+                
+            default:
+                make.center.equalTo(w.vc.view);
+                break;
+        }
+        
+    }];
+    
+    
+}
+
+@end

+ 5 - 0
Asteria/Fuction/Home/vm/ASProductListViewModel.h

@@ -7,6 +7,7 @@
 
 #import <Foundation/Foundation.h>
 #import "ASProductBaseModel.h"
+#import "KWProductListFilterModel.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -14,6 +15,10 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, strong) NSArray <ASProductBaseModel *> *productList;
 
+@property (nonatomic, strong) NSArray<KWProductListFilterModel *> *sourceArr;
+@property (nonatomic, strong) NSMutableDictionary<NSString *,KWProductListFilterSubModel *> *selectDic;
+@property (nonatomic, strong) NSMutableArray<KWProductListFilterModel *> *showArr;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 31 - 0
Asteria/Fuction/Home/vm/ASProductListViewModel.m

@@ -20,4 +20,35 @@
     return _productList;
 }
 
+- (NSMutableDictionary<NSString *,KWProductListFilterSubModel *> *)selectDic {
+    if (!_selectDic) {
+        NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
+        _selectDic = tempDic;
+    }
+    return _selectDic;
+}
+
+-(NSMutableArray<KWProductListFilterModel *> *)showArr {
+    NSMutableArray *arr = [NSMutableArray array];
+//    [arr addObjectsFromArray:self.selectArr];
+    [arr addObjectsFromArray:self.sourceArr];
+    return arr;
+}
+
+- (NSArray<KWProductListFilterModel *> *)sourceArr {
+    if (!_sourceArr) {
+        NSMutableArray *arr = [NSMutableArray array];
+        for (int i=0; i<(arc4random()%10+1);i++) {
+            [arr addObject:[KWProductListFilterModel demoData]];
+        }
+        KWProductListFilterModel *priceM = [KWProductListFilterModel new];
+        priceM.attribute_id = @"-100";
+        priceM.attribute_name = @"PRICE RANGE";
+        priceM.attribute_data = [NSMutableArray arrayWithObject:[KWProductListFilterSubModel demoData]];
+        [arr addObject:priceM];
+        _sourceArr = arr;
+    }
+    return _sourceArr;
+}
+
 @end

+ 1 - 0
Asteria/PreFixHeader.h

@@ -8,6 +8,7 @@
 #ifndef PreFixHeader_h
 #define PreFixHeader_h
 
+#import "CTMediator+Categorys.h"
 #import "CTMediator+Home.h"
 #import "CTMediator+UserCenter.h"
 #import "UITableView+ASBase.h"

+ 22 - 0
Asteria/Product/CTMediatoaTargets/CTMediator+Categorys.h

@@ -0,0 +1,22 @@
+//
+//  CTMediator+Categorys.h
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import <CTMediator/CTMediator.h>
+#import <UIKit/UIKit.h>
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CTMediator (Categorys)
+
+- (UIViewController *)getCategoryListVc:(NSDictionary *)params;
+
+- (UIViewController *)getSearchVc:(NSDictionary *)params;
+
+- (UIViewController *)getCategoryAndSearchVc:(NSDictionary *)params;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 25 - 0
Asteria/Product/CTMediatoaTargets/CTMediator+Categorys.m

@@ -0,0 +1,25 @@
+//
+//  CTMediator+Categorys.m
+//  Asteria
+//
+//  Created by iOS on 2023/6/16.
+//
+
+#import "CTMediator+Categorys.h"
+
+@implementation CTMediator (Categorys)
+
+- (UIViewController *)getCategoryListVc:(NSDictionary *)params{
+    return [self performTarget:@"Category" action:@"getCategoryListVc" params:params shouldCacheTarget:NO];
+}
+
+- (UIViewController *)getSearchVc:(NSDictionary *)params{
+    return [self performTarget:@"Category" action:@"getSearchVc" params:params shouldCacheTarget:NO];
+}
+
+
+- (UIViewController *)getCategoryAndSearchVc:(NSDictionary *)params{
+    return [self performTarget:@"Category" action:@"getCategoryAndSearchVc" params:params shouldCacheTarget:NO];
+}
+
+@end

+ 11 - 0
Asteria/Product/CTMediatoaTargets/CTMediator+Home.h

@@ -13,6 +13,17 @@ NS_ASSUME_NONNULL_BEGIN
 
 -(UIViewController *)getHomeVc:(NSDictionary *)params;
 
+/**
+    params:  {
+    "type":typeId,  //String
+ "title":titleStr,//String
+ "searchKey":keyword,//String
+ "secondTime": secondTime,// NSNumber,
+ "pointGetType":pointGetType,//NSNumber
+ }
+ */
+-(UIViewController *)getProductListVc:(NSDictionary *)params;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 4 - 0
Asteria/Product/CTMediatoaTargets/CTMediator+Home.m

@@ -13,4 +13,8 @@
     return [self performTarget:@"Home" action:@"getHomeVc" params:params shouldCacheTarget:NO];
 }
 
+-(UIViewController *)getProductListVc:(NSDictionary *)params{
+    return [self performTarget:@"Home" action:@"getProductListVc" params:params shouldCacheTarget:NO];
+}
+
 @end

+ 12 - 8
Asteria/Tabber/AS_TabBarViewController.m

@@ -21,21 +21,25 @@
     [super didInitialize];
     
     self.tabBar.backgroundColor = UIColor.whiteColor;
+    self.tabBar.unselectedItemTintColor = Col_666;
+    self.tabBar.tintColor = _1CBC9D;
     
-    AViewController *vc1 = [AViewController new];
-    AViewController *vc2 = [[CTMediator sharedInstance] getHomeVc:@{}];
+    UIViewController *vc1 = [[CTMediator sharedInstance] getCategoryAndSearchVc:@{}];
+    UIViewController *vc2 = [[CTMediator sharedInstance] getHomeVc:@{}];
+    AViewController *cartv = [AViewController new];
     UIViewController *vc3 = [[CTMediator sharedInstance] getUserCenterVc:@{}];
-    NSArray *vcAry = @[vc1,vc2,vc3];
+    NSArray *vcAry = @[vc2, vc1, cartv, vc3];
     
-    NSArray *titleArr = @[@"Search",@"Home",@"Me"];
-    NSArray *imgArr = @[@"tab_search", @"tab_home", @"tab_mine"];
+    NSArray *titleArr = @[@"SHOP",@"CATEGORY",@"CART", @"ME"];
+    NSArray *imgArr = @[@"tab_home", @"tab_category", @"tab_cart",@"tab_me"];
     
-    NSArray *selimgArr = @[@"tab_search", @"tab_home", @"tab_mine"];
+    NSArray *selimgArr = @[@"tab_home_sel", @"tab_category_sel",@"tab_cart_sel" , @"tab_me_sel"];
     NSMutableArray *tabvcAry = [[NSMutableArray alloc]init];
     for (int i= 0; i<titleArr.count; i++) {
         QMUINavigationController *uikitNavController = [[QMUINavigationController alloc] initWithRootViewController:vcAry[i]];
-        UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:titleArr[i] image:UIImageMake(imgArr[i]) tag:i];
-        tabBarItem.selectedImage = UIImageMake(selimgArr[i]);
+        UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:titleArr[i] image:[UIImageMake(imgArr[i]) imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] tag:i];
+        
+        tabBarItem.selectedImage = [UIImageMake(selimgArr[i]) imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
         uikitNavController.tabBarItem = tabBarItem;
         [tabvcAry addObject:uikitNavController];
     }