diff --git a/Podfile b/Podfile
index 4795336..b4c0cbf 100644
--- a/Podfile
+++ b/Podfile
@@ -10,6 +10,8 @@ target 'keyBoard' do
pod 'Bugly', :configurations => ['Release']
pod 'DZNEmptyDataSet', '1.8.1'
pod 'FLAnimatedImage', '~> 1.0.17'
+ pod 'JXPagingView/Pager', '~> 2.1.3'
+ pod 'JXCategoryView', '~> 1.6.8'
pod 'HWPanModal', '~> 0.9.9'
pod 'LSTPopView', '~> 0.3.10'
pod 'LookinServer', :configurations => ['Debug']
diff --git a/Podfile.lock b/Podfile.lock
index a8812f6..9ed0f51 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -18,6 +18,8 @@ PODS:
- DZNEmptyDataSet (1.8.1)
- FLAnimatedImage (1.0.17)
- HWPanModal (0.9.9)
+ - JXCategoryView (1.6.8)
+ - JXPagingView/Pager (2.1.3)
- LookinServer (1.2.8):
- LookinServer/Core (= 1.2.8)
- LookinServer/Core (1.2.8)
@@ -41,6 +43,8 @@ DEPENDENCIES:
- DZNEmptyDataSet (= 1.8.1)
- FLAnimatedImage (~> 1.0.17)
- HWPanModal (~> 0.9.9)
+ - JXCategoryView
+ - JXPagingView/Pager (~> 2.1.3)
- LookinServer
- LSTPopView (~> 0.3.10)
- Masonry (= 1.1.0)
@@ -56,6 +60,8 @@ SPEC REPOS:
- DZNEmptyDataSet
- FLAnimatedImage
- HWPanModal
+ - JXCategoryView
+ - JXPagingView
- LookinServer
- LSTPopView
- LSTTimer
@@ -71,6 +77,8 @@ SPEC CHECKSUMS:
DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2
+ JXCategoryView: 262d503acea0b1278c79a1c25b7332ffaef4d518
+ JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e
LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80
LSTPopView: 9379f00f6ce7d1fc620b50ab00ed3ef97b2d4d52
LSTTimer: caf8f02ff366ca175cf4c1778d26c166183c1b6f
@@ -80,6 +88,6 @@ SPEC CHECKSUMS:
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: f29024626962457f3470184232766516dee8dfea
-PODFILE CHECKSUM: c50284c86c4e30cee59c186e48767667019dcb61
+PODFILE CHECKSUM: ce689000a7b9b24f5d74cc50a93350665c3af035
COCOAPODS: 1.16.2
diff --git a/Pods/JXCategoryView/LICENSE b/Pods/JXCategoryView/LICENSE
new file mode 100644
index 0000000..0fdb1e7
--- /dev/null
+++ b/Pods/JXCategoryView/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 暴走的鑫鑫
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/JXCategoryView/README.md b/Pods/JXCategoryView/README.md
new file mode 100644
index 0000000..2fae2c3
--- /dev/null
+++ b/Pods/JXCategoryView/README.md
@@ -0,0 +1,296 @@
+

+
+[](#)
+[](#)
+[](https://cocoapods.org/pods/JXCategoryView)
+[](#)
+
+A powerful and easy to use category view (segmentedcontrol, segmentview, pagingview, pagerview, pagecontrol) (腾讯新闻、今日头条、QQ 音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、简书、微博等所有主流 APP 分类切换滚动视图)
+
+与其他的同类三方库对比的优点:
+- 使用协议封装指示器逻辑,可以随心所欲地自定义指示器效果;
+- 提供更加全面丰富、高度自定义的效果;
+- 使用子类化管理 cell 样式,逻辑更清晰,扩展更简单;
+- 高度封装列表容器,使用便捷,完美支持列表的生命周期调用;
+
+## Swift版本
+
+如果你在找 Swift 版本,请点击查看 [JXSegmentedView](https://github.com/pujiaxin33/JXSegmentedView)。
+
+## 效果预览
+
+### 指示器效果预览
+
+说明 | Gif |
+----|------|
+LineView |
|
+LineView延长 |
|
+LineView延长+偏移 |
|
+LineView🌈彩虹风格 |
|
+DotLineView点线效果 |
|
+BallView QQ黏性红点 |
|
+TriangleView 三角形底部 |
|
+TriangleView 三角形顶部 |
|
+BackgroundView椭圆形 |
|
+BackgroundView椭圆形+阴影 |
|
+BackgroundView长方形 |
|
+BackgroundView遮罩有背景 |
|
+BackgroundView遮罩无背景 |
|
+BackgroundView渐变色 |
|
+ImageView底部(小船) |
|
+ImageView背景(最佳男歌手) |
|
+ImageView滚动效果(足球) |
|
+混合使用 |
|
+
+以下均支持上下位置切换:
+`JXCategoryIndicatorLineView`、`JXCategoryIndicatorImageView`、`JXCategoryIndicatorBallView`、`JXCategoryIndicatorTriangleView`
+
+### Cell样式效果预览
+
+说明 | Gif |
+----|------|
+颜色渐变 |
|
+大小缩放 |
|
+大小缩放+底部锚点 |
|
+大小缩放+顶部锚点 |
|
+大小缩放+字体粗细 |
|
+大小缩放+点击动画 |
|
+大小缩放+cell宽度缩放 |
|
+TitleImage_Top |
|
+TitleImage_Left |
|
+TitleImage_Bottom |
|
+TitleImage_Right |
|
+cell图文混用 |
|
+Image |
|
+数字 |
|
+红点 |
|
+多行文本 |
|
+多行富文本 |
|
+Cell背景色渐变 |
|
+分割线 |
|
+
+### 特殊效果预览
+
+说明 | Gif |
+----|------|
+数据源过少
averageCellSpacingEnabled默认为YES |
|
+数据源过少
averageCellSpacingEnabled为NO |
|
+SegmentedControl
参考[`SegmentedControlViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/SegmentedControl/SegmentedControlViewController.m)类 |
|
+导航栏使用
参考[`NaviSegmentedControlViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/SegmentedControl/NaviSegmentedControlViewController.m)类 |
|
+嵌套使用
参考[`NestViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/Nest/NestViewController.m)类 |
|
+个人主页(上下左右滚动、header悬浮)
参考[`PagingViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/PagingView/Example/PagingViewController.m)类
更多样式请点击查看[JXPagingView库](https://github.com/pujiaxin33/JXPagingView) |
|
+垂直列表滚动
参考[`VerticalListViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/VerticalListView/VerticalListViewController.m)类
高仿腾讯视频
支持UITableView,参考[`VerticalListTableViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/VerticalListView/VerticalListTableViewController.m)
(背景色异常是录屏软件bug) |
|
+| 垂直缩放(仿网易圈圈、脉脉首页)
参考[`ScrollZoomViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/ScrollZoom/ScrollZoomViewController.m)类 |
|
+数据源刷新&列表数据加载
参考[`LoadDataListContainerViewController`](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/LoadData/LoadDataListContainerViewController.m)类 |
|
+上下滚动隐藏导航栏 |
|
+京东首页-滚动渐变变小 |
|
+
+### 自定义效果预览
+
+收录来自其他使用者的自定义示例,这些自定义类只在 Demo 项目里面,Pod 库并没有这些文件。所以,如果你需要使用这些自定义效果,请通过文件导入的方式。
+
+目的:
+- 参考学习如何自定义;
+- 直接修改自定义示例类以快速实现自己的需求。
+
+欢迎提 PullRequest 进行收录你的自定义效果。
+
+| 说明 | Gif |
+| ----|------|
+| Spring动画指示器 |
|
+| 富文本数量cell |
|
+| 左右对齐指示器 |
|
+| 秒杀时间线cell |
|
+| 京东商品排序cell |
|
+| title背景块cell |
|
+
+## 要求
+
+- iOS 9.0+
+- Xcode 9+
+- Objective-C
+
+## 安装
+
+### 手动
+
+Clone 代码,把 Sources 文件夹拖入项目,`#import "JXCategoryView.h"` 就可以使用了。
+
+### CocoaPods
+
+```ruby
+target '' do
+ pod 'JXCategoryView'
+end
+```
+先执行 `pod repo update`,再执行 `pod install`。
+
+## 结构图
+
+
+
+## 使用
+
+### JXCategoryTitleView 使用示例
+
+1. 初始化 `JXCategoryTitleView`:
+```Objective-C
+self.categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, 0, WindowsSize.width, 50)];
+self.categoryView.delegate = self;
+[self.view addSubview:self.categoryView];
+```
+
+2. 配置 `JXCategoryTitleView` 的属性:
+```Objective-C
+self.categoryView.titles = @[@"螃蟹", @"麻辣小龙虾", @"苹果"...];
+self.categoryView.titleColorGradientEnabled = YES;
+```
+
+3. 添加指示器:
+```Objective-C
+JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
+lineView.indicatorColor = [UIColor redColor];
+lineView.indicatorWidth = JXCategoryViewAutomaticDimension;
+self.categoryView.indicators = @[lineView];
+```
+
+4. 实现 `JXCategoryViewDelegate` 代理(可选)
+```Objective-C
+// 点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,不关心具体是点击还是滚动选中的。
+- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index;
+
+// 点击选中的情况才会调用该方法
+- (void)categoryView:(JXCategoryBaseView *)categoryView didClickSelectedItemAtIndex:(NSInteger)index;
+
+// 滚动选中的情况才会调用该方法
+- (void)categoryView:(JXCategoryBaseView *)categoryView didScrollSelectedItemAtIndex:(NSInteger)index;
+
+// 正在滚动中的回调
+- (void)categoryView:(JXCategoryBaseView *)categoryView scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio;
+```
+
+### 列表容器使用示例
+
+#### `JXCategoryListContainerView` 封装类使用示例
+
+`JXCategoryListContainerView` 是对列表视图高度封装的类,具有以下优点:
+
+- 相对于直接使用 `UIScrollView` 自定义,封装度高、代码集中、使用简单;
+- 列表懒加载:当显示某个列表的时候,才进行列表初始化。而不是一次性加载全部列表,性能更优;
+- 支持列表的 `willAppear`、`didAppear`、`willDisappear`、`didDisappear` 生命周期方法调用;
+
+1. 初始化 `JXCategoryListContainerView` 并关联到 `categoryView`:
+```Objective-C
+self.listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
+[self.view addSubview:self.listContainerView];
+// 关联到 categoryView
+self.categoryView.listContainer = self.listContainerView;
+```
+
+2. 实现 `JXCategoryListContainerViewDelegate` 代理方法:
+```Objective-C
+// 返回列表的数量
+- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView {
+ return self.titles.count;
+}
+// 根据下标 index 返回对应遵守并实现 `JXCategoryListContentViewDelegate` 协议的列表实例
+- (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
+ return [[ListViewController alloc] init];
+}
+```
+
+3. 列表实现 `JXCategoryListContentViewDelegate` 代理方法
+不管列表是 `UIView` 还是 `UIViewController` 都可以,提高使用灵活性,更便于现有的业务接入。
+```Objective-C
+// 返回列表视图
+// 如果列表是 VC,就返回 VC.view
+// 如果列表是 View,就返回 View 自己
+- (UIView *)listView {
+ return self.view;
+}
+```
+
+
+具体点击 [LoadDataListContainerViewController](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/LoadData/LoadDataListContainerViewController.m) 查看源代码了解
+
+#### 直接使用 UIScrollView 自定义
+
+因为代码量较多且分散,所有不推荐使用该方法。要正确使用需要注意的地方比较多,尤其对于刚接触 iOS 的同学来说不太友好。
+
+不直接贴代码了,具体点击 [LoadDataListCustomViewController](https://github.com/pujiaxin33/JXCategoryView/tree/master/Example/Example/Examples/LoadData/LoadDataListCustomViewController.m) 查看源代码了解。
+
+
+## 常见问题和答案
+
+❗️❗️❗️这里面包含了许多常见问题和答案,使用之前请务必浏览此文档,或者遇到问题先看此文档❗️❗️❗️
+
+[常见问题和答案总文档](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md)
+
+- [个人主页效果更丰富的示例:JXPagingView](https://github.com/pujiaxin33/JXPagingView)
+- [侧滑手势处理](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BE%A7%E6%BB%91%E6%89%8B%E5%8A%BF%E5%A4%84%E7%90%86.md)
+- [列表的生命周期方法处理](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E5%88%97%E8%A1%A8%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E6%96%B9%E6%B3%95%E5%A4%84%E7%90%86.md)
+- [`JXCategoryListContainerType`的`scrollView`和`collectionView`对比](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#jxcategorylistcontainertype%E7%9A%84scrollview%E5%92%8Ccollectionview%E5%AF%B9%E6%AF%94)
+- [cell左滑删除](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#cell%E5%B7%A6%E6%BB%91%E5%88%A0%E9%99%A4)
+- [`FDFullscreenPopGesture`等全屏手势处理](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E5%85%A8%E5%B1%8F%E6%89%8B%E5%8A%BF%E5%A4%84%E7%90%86.md)
+- [JXCategoryView数据源刷新](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#jxcategoryview%E6%95%B0%E6%8D%AE%E6%BA%90%E5%88%B7%E6%96%B0)
+- [`reloadDataWithoutListContainer`方法使用说明](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#reloaddatawithoutlistcontainer%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
+- [listContainer或contentScrollView关联说明](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#listcontainer%E6%88%96contentscrollview%E5%85%B3%E8%81%94%E8%AF%B4%E6%98%8E)
+- [点击切换列表的动画控制](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E7%82%B9%E5%87%BB%E5%88%87%E6%8D%A2%E5%88%97%E8%A1%A8%E7%9A%84%E5%8A%A8%E7%94%BB%E6%8E%A7%E5%88%B6)
+- [列表cell点击跳转示例](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E5%88%97%E8%A1%A8cell%E7%82%B9%E5%87%BB%E8%B7%B3%E8%BD%AC%E7%A4%BA%E4%BE%8B)
+- [列表调用`presentViewController`方法](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E5%88%97%E8%A1%A8%E8%B0%83%E7%94%A8presentviewcontroller%E6%96%B9%E6%B3%95)
+- [代码选中指定index](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E4%BB%A3%E7%A0%81%E9%80%89%E4%B8%AD%E6%8C%87%E5%AE%9Aindex)
+- [JXCategoryView.collectionView高度取整说明](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#jxcategoryviewcollectionview%E9%AB%98%E5%BA%A6%E5%8F%96%E6%95%B4%E8%AF%B4%E6%98%8E)
+- [对父VC的automaticallyAdjustsScrollViewInsets属性设置为NO](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E5%AF%B9%E7%88%B6vc%E7%9A%84automaticallyadjustsscrollviewinsets%E5%B1%9E%E6%80%A7%E8%AE%BE%E7%BD%AE%E4%B8%BAno)
+- [`JXCategoryListContainerView`内部使用`UIViewController`当做列表容器使用说明](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#jxcategorylistcontainerview%E5%86%85%E9%83%A8%E4%BD%BF%E7%94%A8uiviewcontroller%E5%BD%93%E5%81%9A%E5%88%97%E8%A1%A8%E5%AE%B9%E5%99%A8%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
+- [使用多行文本](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E4%BD%BF%E7%94%A8%E5%A4%9A%E8%A1%8C%E6%96%87%E6%9C%AC)
+- [列表容器禁止左右滑动](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E5%88%97%E8%A1%A8%E5%AE%B9%E5%99%A8%E7%A6%81%E6%AD%A2%E5%B7%A6%E5%8F%B3%E6%BB%91%E5%8A%A8)
+- [单个cell刷新 ](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E5%8D%95%E4%B8%AAcell%E5%88%B7%E6%96%B0)
+- [点击item时指示器和列表滚动时效果一致](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E7%82%B9%E5%87%BBitem%E6%97%B6%E6%8C%87%E7%A4%BA%E5%99%A8%E5%92%8C%E5%88%97%E8%A1%A8%E6%BB%9A%E5%8A%A8%E6%97%B6%E6%95%88%E6%9E%9C%E4%B8%80%E8%87%B4)
+- [自定义建议](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BB%BA%E8%AE%AE)
+
+## 指示器样式自定义
+
+- 需要继承 `JXCategoryIndicatorProtocol` 协议,点击参看 [JXCategoryIndicatorProtocol](https://github.com/pujiaxin33/JXCategoryView/blob/master/Sources/Common/JXCategoryIndicatorProtocol.h);
+- 提供了继承 `JXCategoryIndicatorProtocol` 协议的基类 `JXCategoryIndicatorComponentView`,里面提供了许多基础属性。点击参看 [JXCategoryIndicatorComponentView](https://github.com/pujiaxin33/JXCategoryView/blob/master/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.m);
+- 自定义指示器,请参考已实现的指示器视图,多尝试、多思考,再有问题请提 Issue 或加入反馈 QQ 群。
+
+## Cell 自定义
+
+- 任何子类化需求,view、cell、cellModel 三个都要子类化,即使某个子类 cell 什么事情都不做。用于维护继承链,以免以后子类化都不知道要继承谁了;
+- 如果你想完全自定义 cell 里面的内容,那就继承 `JXCategoryIndicatorView`、`JXCategoryIndicatorCell、`JXCategoryIndicatorCellModel`,就像`JXCategoryTitleView`、`JXCategoryTitleCell、`JXCategoryTitleCellModel`那样去做;
+- 如果你只是在父类进行一些微调,那就继承目标 view、cell、cellModel,对 cell 原有控件微调、或者加入新的控件皆可。就像 `JXCategoryTitleImageView` 系列、`JXCategoryTitleAttributeView` 系列那样去做;
+- Cell 自定义,请参考已实现的 cell 样式,多尝试、多思考,再有问题请提 Issue 或加入反馈 QQ 群
+
+## 常用属性说明
+
+[常用属性说明文档地址](https://github.com/pujiaxin33/JXCategoryView/blob/master/Document/%E5%B8%B8%E7%94%A8%E5%B1%9E%E6%80%A7%E8%AF%B4%E6%98%8E.md)
+
+## 更新记录
+
+- 2018.8.21 发布1.0.0版本,更新内容:使用POP(面向协议编程)重构指示器视图;[迁移指南](https://github.com/pujiaxin33/JXCategoryView/blob/master/Migration/1.0.0.md)
+- 2018.8.22 发布1.0.1版本,更新内容:删除zoomEnabled,新增titleLabelZoomEnabled、imageZoomEnabled;
+- 2018.8.23 发布1.0.2版本,更新内容:添加cellWidthZoomEnabled实现腾讯视频效果;
+- 2018.8.24 发布1.0.3版本,更新内容:添加垂直列表滚动效果、指示器添加verticalMargin属性、JXCategoryViewDelegate代理方法优化;
+- 2018.9.4 发布1.0.4版本,更新内容:修复bug、添加cell图文混用示例;
+- 2018.12.19 发布1.1.7版本,更新内容:添加`JXCategoryListContainerView`,高度封装列表逻辑,支持懒加载列表,提升初始化性能;
+- 2019.1.24 发布1.2.2版本,更新内容:非兼容更新接口`- (BOOL)selectCellAtIndex:(NSInteger)index selectedType:(JXCategoryCellSelectedType)selectedType`,自定义有用到该接口的请及时更新。
+- 2019.6.21 发布1.3.13版本,更新内容:将`JXCategoryListCollectionContainerView.dataSource`移动到m实现文件,添加`- (instancetype)initWithDataSource:(id)dataSource`初始化方法。
+- 2019.7.20 发布1.3.16版本,删除代理方法`- (void)categoryView:(JXCategoryBaseView *)categoryView didClickedItemContentScrollViewTransitionToIndex:(NSInteger)index;`,请使用`contentScrollViewClickTransitionAnimationEnabled`属性。`JXCategoryTitleVerticalZoomView`进行了重构,内容左边距只需要使用`contentEdgeLeft`属性即可。
+- 2019.9.11 发布1.4.0版本,删除一波被标记为弃用的属性和方法;完善列表的生命周期方法的调用;`JXCategoryListCollectionContainerView`类新增和必须要调用`- (void)scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio selectedIndex:(NSInteger)selectedIndex`和`- (void)didClickSelectedItemAtIndex:(NSInteger)index`两个方法。
+- 2019.9.19 发布1.5.0版本,重构列表容器,具体修改请参考[1.5.0版本迁移指南](https://github.com/pujiaxin33/JXCategoryView/blob/master/Migration/1.5.0%E7%89%88%E6%9C%AC%E8%BF%81%E7%A7%BB%E6%8C%87%E5%8D%97.md)
+
+## 补充
+
+如果刚开始使用`JXCategoryView`,当开发过程中需要支持某种特性时,请务必先搜索使用文档或者源代码。确认是否已经实现支持了想要的特性。请别不要文档和源代码都没有看,就直接提问,这对于大家都是一种时间浪费。如果没有支持想要的特性,欢迎提Issue讨论,或者自己实现提一个PullRequest。
+
+该仓库保持随时更新,对于主流新的分类选择效果会第一时间支持。使用过程中,有任何建议或问题,可以通过以下方式联系我:
+邮箱:317437084@qq.com
+QQ群: 112440473
+
+
+
+喜欢就star❤️一下吧
+
+## License
+
+JXCategoryView is released under the MIT license.
diff --git a/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCell.h b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCell.h
new file mode 100644
index 0000000..ba630f3
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCell.h
@@ -0,0 +1,29 @@
+//
+// JXCategoryBaseCell.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXCategoryBaseCellModel.h"
+#import "JXCategoryViewAnimator.h"
+#import "JXCategoryViewDefines.h"
+
+@interface JXCategoryBaseCell : UICollectionViewCell
+
+@property (nonatomic, strong, readonly) JXCategoryBaseCellModel *cellModel;
+@property (nonatomic, strong, readonly) JXCategoryViewAnimator *animator;
+
+- (void)initializeViews NS_REQUIRES_SUPER;
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel NS_REQUIRES_SUPER;
+
+- (BOOL)checkCanStartSelectedAnimation:(JXCategoryBaseCellModel *)cellModel;
+
+- (void)addSelectedAnimationBlock:(JXCategoryCellSelectedAnimationBlock)block;
+
+- (void)startSelectedAnimationIfNeeded:(JXCategoryBaseCellModel *)cellModel;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCell.m b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCell.m
new file mode 100644
index 0000000..ea63aac
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCell.m
@@ -0,0 +1,98 @@
+//
+// JXCategoryBaseCell.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryBaseCell.h"
+#import "RTLManager.h"
+
+@interface JXCategoryBaseCell ()
+@property (nonatomic, strong) JXCategoryBaseCellModel *cellModel;
+@property (nonatomic, strong) JXCategoryViewAnimator *animator;
+@property (nonatomic, strong) NSMutableArray *animationBlockArray;
+@end
+
+@implementation JXCategoryBaseCell
+
+#pragma mark - Initialize
+
+- (void)dealloc {
+ [self.animator stop];
+}
+
+- (void)prepareForReuse {
+ [super prepareForReuse];
+
+ [self.animator stop];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self initializeViews];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self initializeViews];
+ }
+ return self;
+}
+
+#pragma mark - Public
+
+- (void)initializeViews {
+ _animationBlockArray = [NSMutableArray array];
+
+ [RTLManager horizontalFlipViewIfNeeded:self];
+ [RTLManager horizontalFlipViewIfNeeded:self.contentView];
+}
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ self.cellModel = cellModel;
+
+ if (cellModel.isSelectedAnimationEnabled) {
+ [self.animationBlockArray removeLastObject];
+ if ([self checkCanStartSelectedAnimation:cellModel]) {
+ self.animator = [[JXCategoryViewAnimator alloc] init];
+ self.animator.duration = cellModel.selectedAnimationDuration;
+ } else {
+ [self.animator stop];
+ }
+ }
+}
+
+- (BOOL)checkCanStartSelectedAnimation:(JXCategoryBaseCellModel *)cellModel {
+ BOOL canStartSelectedAnimation = ((cellModel.selectedType == JXCategoryCellSelectedTypeCode) || (cellModel.selectedType == JXCategoryCellSelectedTypeClick));
+ return canStartSelectedAnimation;
+}
+
+- (void)addSelectedAnimationBlock:(JXCategoryCellSelectedAnimationBlock)block {
+ [self.animationBlockArray addObject:block];
+}
+
+- (void)startSelectedAnimationIfNeeded:(JXCategoryBaseCellModel *)cellModel {
+ if (cellModel.isSelectedAnimationEnabled && [self checkCanStartSelectedAnimation:cellModel]) {
+ // 需要更新 isTransitionAnimating,用于处理在过滤时,禁止响应点击,避免界面异常。
+ cellModel.transitionAnimating = YES;
+ __weak typeof(self)weakSelf = self;
+ self.animator.progressCallback = ^(CGFloat percent) {
+ for (JXCategoryCellSelectedAnimationBlock block in weakSelf.animationBlockArray) {
+ block(percent);
+ }
+ };
+ self.animator.completeCallback = ^{
+ cellModel.transitionAnimating = NO;
+ [weakSelf.animationBlockArray removeAllObjects];
+ };
+ [self.animator start];
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCellModel.h b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCellModel.h
new file mode 100644
index 0000000..af82301
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCellModel.h
@@ -0,0 +1,31 @@
+//
+// JXCategoryBaseCellModel.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import
+#import "JXCategoryViewDefines.h"
+
+@interface JXCategoryBaseCellModel : NSObject
+
+@property (nonatomic, assign) NSUInteger index;
+@property (nonatomic, assign) CGFloat cellWidth;
+@property (nonatomic, assign) CGFloat cellSpacing;
+@property (nonatomic, assign, getter=isSelected) BOOL selected;
+
+@property (nonatomic, assign, getter=isCellWidthZoomEnabled) BOOL cellWidthZoomEnabled;
+@property (nonatomic, assign) CGFloat cellWidthNormalZoomScale;
+@property (nonatomic, assign) CGFloat cellWidthCurrentZoomScale;
+@property (nonatomic, assign) CGFloat cellWidthSelectedZoomScale;
+
+@property (nonatomic, assign, getter=isSelectedAnimationEnabled) BOOL selectedAnimationEnabled;
+@property (nonatomic, assign) NSTimeInterval selectedAnimationDuration;
+@property (nonatomic, assign) JXCategoryCellSelectedType selectedType;
+
+@property (nonatomic, assign, getter=isTransitionAnimating) BOOL transitionAnimating;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCellModel.m b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCellModel.m
new file mode 100644
index 0000000..9b6e520
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseCellModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryBaseCellModel.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryBaseCellModel.h"
+
+@implementation JXCategoryBaseCellModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Base/JXCategoryBaseView.h b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseView.h
new file mode 100644
index 0000000..27a54fe
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseView.h
@@ -0,0 +1,222 @@
+//
+// JXCategoryView.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXCategoryBaseCell.h"
+#import "JXCategoryBaseCellModel.h"
+#import "JXCategoryCollectionView.h"
+#import "JXCategoryViewDefines.h"
+
+@class JXCategoryBaseView;
+
+@protocol JXCategoryViewListContainer
+- (void)setDefaultSelectedIndex:(NSInteger)index;
+- (UIScrollView *)contentScrollView;
+- (void)reloadData;
+- (void)didClickSelectedItemAtIndex:(NSInteger)index;
+@end
+
+@protocol JXCategoryViewDelegate
+
+@optional
+
+//为什么会把选中代理分为三个,因为有时候只关心点击选中的,有时候只关心滚动选中的,有时候只关心选中。所以具体情况,使用对应方法。
+/**
+ 点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,不关心具体是点击还是滚动选中的。
+
+ @param categoryView categoryView对象
+ @param index 选中的index
+ */
+- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index;
+
+/**
+ 点击选中的情况才会调用该方法
+
+ @param categoryView categoryView对象
+ @param index 选中的index
+ */
+- (void)categoryView:(JXCategoryBaseView *)categoryView didClickSelectedItemAtIndex:(NSInteger)index;
+
+/**
+ 滚动选中的情况才会调用该方法
+
+ @param categoryView categoryView对象
+ @param index 选中的index
+ */
+- (void)categoryView:(JXCategoryBaseView *)categoryView didScrollSelectedItemAtIndex:(NSInteger)index;
+
+/**
+ 控制能否点击Item
+
+ @param categoryView categoryView对象
+ @param index 准备点击的index
+ @return 能否点击
+ */
+- (BOOL)categoryView:(JXCategoryBaseView *)categoryView canClickItemAtIndex:(NSInteger)index;
+
+/**
+ 正在滚动中的回调
+
+ @param categoryView categoryView对象
+ @param leftIndex 正在滚动中,相对位置处于左边的index
+ @param rightIndex 正在滚动中,相对位置处于右边的index
+ @param ratio 从左往右计算的百分比
+ */
+- (void)categoryView:(JXCategoryBaseView *)categoryView scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio;
+
+@end
+
+@interface JXCategoryBaseView : UIView
+
+@property (nonatomic, strong, readonly) JXCategoryCollectionView *collectionView;
+
+@property (nonatomic, strong) NSArray *dataSource;
+
+@property (nonatomic, weak) id delegate;
+
+/**
+ 高封装度的列表容器,使用该类可以让列表拥有完成的生命周期、自动同步defaultSelectedIndex、自动调用reloadData。
+ */
+@property (nonatomic, weak) id listContainer;
+
+/**
+ 推荐使用封装度更高的listContainer属性。如果使用contentScrollView请参考`LoadDataListCustomViewController`使用示例。
+ */
+@property (nonatomic, strong) UIScrollView *contentScrollView;
+
+@property (nonatomic, assign) NSInteger defaultSelectedIndex; //修改初始化的时候默认选择的index
+
+@property (nonatomic, assign, readonly) NSInteger selectedIndex;
+
+@property (nonatomic, assign, getter=isContentScrollViewClickTransitionAnimationEnabled) BOOL contentScrollViewClickTransitionAnimationEnabled; //点击cell进行contentScrollView切换时是否需要动画。默认为YES
+
+@property (nonatomic, assign) CGFloat contentEdgeInsetLeft; //整体内容的左边距,默认JXCategoryViewAutomaticDimension(等于cellSpacing)
+
+@property (nonatomic, assign) CGFloat contentEdgeInsetRight; //整体内容的右边距,默认JXCategoryViewAutomaticDimension(等于cellSpacing)
+
+@property (nonatomic, assign) CGFloat cellWidth; //默认JXCategoryViewAutomaticDimension
+
+@property (nonatomic, assign) CGFloat cellWidthIncrement; //cell宽度补偿。默认:0
+
+@property (nonatomic, assign) CGFloat cellSpacing; //cell之间的间距,默认20
+
+@property (nonatomic, assign, getter=isAverageCellSpacingEnabled) BOOL averageCellSpacingEnabled; //当collectionView.contentSize.width小于JXCategoryBaseView的宽度,是否将cellSpacing均分。默认为YES。
+
+//cell宽度是否缩放
+@property (nonatomic, assign, getter=isCellWidthZoomEnabled) BOOL cellWidthZoomEnabled; //默认为NO
+
+@property (nonatomic, assign, getter=isCellWidthZoomScrollGradientEnabled) BOOL cellWidthZoomScrollGradientEnabled; //手势滚动过程中,是否需要更新cell的宽度。默认为YES
+
+@property (nonatomic, assign) CGFloat cellWidthZoomScale; //默认1.2,cellWidthZoomEnabled为YES才生效
+
+@property (nonatomic, assign, getter=isSelectedAnimationEnabled) BOOL selectedAnimationEnabled; //是否开启点击或代码选中动画。默认为NO。自定义的cell选中动画需要自己实现。(仅点击或调用selectItemAtIndex选中才有效,滚动选中无效)
+
+@property (nonatomic, assign) NSTimeInterval selectedAnimationDuration; //cell选中动画的时间。默认0.25
+
+/**
+ 选中目标index的item
+
+ @param index 目标index
+ */
+- (void)selectItemAtIndex:(NSInteger)index;
+
+/**
+ 初始化的时候无需调用。比如页面初始化之后,根据网络接口异步回调回来数据,重新配置categoryView,需要调用该方法进行刷新。
+ */
+- (void)reloadData;
+
+/**
+ 重新配置categoryView但是不需要reload listContainer。特殊情况是该方法。
+ */
+- (void)reloadDataWithoutListContainer;
+
+/**
+ 刷新指定的index的cell
+ 内部会触发`- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index`方法进行cellModel刷新
+
+ @param index 指定cell的index
+ */
+- (void)reloadCellAtIndex:(NSInteger)index;
+
+@end
+
+
+
+@interface JXCategoryBaseView (UISubclassingBaseHooks)
+
+/**
+ 获取目标cell当前的frame,反应当前真实的frame受到cellWidthSelectedZoomScale的影响。
+ */
+- (CGRect)getTargetCellFrame:(NSInteger)targetIndex;
+
+/**
+ 获取目标cell的选中时的frame,其他cell的状态都当做普通状态处理。
+ */
+- (CGRect)getTargetSelectedCellFrame:(NSInteger)targetIndex selectedType:(JXCategoryCellSelectedType)selectedType;
+- (void)initializeData NS_REQUIRES_SUPER;
+- (void)initializeViews NS_REQUIRES_SUPER;
+
+/**
+ reloadData方法调用,重新生成数据源赋值到self.dataSource
+ */
+- (void)refreshDataSource;
+
+/**
+ reloadData方法调用,根据数据源重新刷新状态;
+ */
+- (void)refreshState NS_REQUIRES_SUPER;
+
+/**
+ 选中某个item时,刷新将要选中与取消选中的cellModel
+
+ @param selectedCellModel 将要选中的cellModel
+ @param unselectedCellModel 取消选中的cellModel
+ */
+- (void)refreshSelectedCellModel:(JXCategoryBaseCellModel *)selectedCellModel unselectedCellModel:(JXCategoryBaseCellModel *)unselectedCellModel NS_REQUIRES_SUPER;
+
+/**
+ 关联的contentScrollView的contentOffset发生了改变
+
+ @param contentOffset 偏移量
+ */
+- (void)contentOffsetOfContentScrollViewDidChanged:(CGPoint)contentOffset NS_REQUIRES_SUPER;
+
+/**
+ 选中某一个item的时候调用,该方法用于子类重载。
+ 如果外部要选中某个index,请使用`- (void)selectItemAtIndex:(NSUInteger)index;`
+
+ @param index 选中的index
+ @param selectedType JXCategoryCellSelectedType
+ @return 返回值为NO,表示触发内部某些判断(点击了同一个cell),子类无需后续操作。
+ */
+- (BOOL)selectCellAtIndex:(NSInteger)index selectedType:(JXCategoryCellSelectedType)selectedType NS_REQUIRES_SUPER;
+
+/**
+ reloadData时,返回每个cell的宽度
+
+ @param index 目标index
+ @return cellWidth
+ */
+- (CGFloat)preferredCellWidthAtIndex:(NSInteger)index;
+
+/**
+ 返回自定义cell的class
+
+ @return cell class
+ */
+- (Class)preferredCellClass;
+
+/**
+ refreshState时调用,重置cellModel的状态
+
+ @param cellModel 待重置的cellModel
+ @param index cellModel在数组中的index
+ */
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index NS_REQUIRES_SUPER;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Base/JXCategoryBaseView.m b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseView.m
new file mode 100644
index 0000000..4d0b7bd
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Base/JXCategoryBaseView.m
@@ -0,0 +1,697 @@
+//
+// JXCategoryBaseView.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryBaseView.h"
+#import "JXCategoryFactory.h"
+#import "JXCategoryViewAnimator.h"
+#import "RTLManager.h"
+
+struct DelegateFlags {
+ unsigned int didSelectedItemAtIndexFlag : 1;
+ unsigned int didClickSelectedItemAtIndexFlag : 1;
+ unsigned int didScrollSelectedItemAtIndexFlag : 1;
+ unsigned int canClickItemAtIndexFlag : 1;
+ unsigned int scrollingFromLeftIndexToRightIndexFlag : 1;
+};
+
+@interface JXCategoryBaseView ()
+
+@property (nonatomic, strong) JXCategoryCollectionView *collectionView;
+@property (nonatomic, assign) struct DelegateFlags delegateFlags;
+@property (nonatomic, assign) NSInteger selectedIndex;
+@property (nonatomic, assign) CGFloat innerCellSpacing;
+@property (nonatomic, assign) CGPoint lastContentViewContentOffset;
+@property (nonatomic, strong) JXCategoryViewAnimator *animator;
+// 正在滚动中的目标index。用于处理正在滚动列表的时候,立即点击item,会导致界面显示异常。
+@property (nonatomic, assign) NSInteger scrollingTargetIndex;
+@property (nonatomic, assign, getter=isNeedReloadByBecomeActive) BOOL needReloadByBecomeActive;
+@property (nonatomic, assign, getter=isFirstLayoutSubviews) BOOL firstLayoutSubviews;
+@property (nonatomic, assign, getter=isNeedConfigAutomaticallyAdjustsScrollViewInsets) BOOL needConfigAutomaticallyAdjustsScrollViewInsets;
+
+@end
+
+@implementation JXCategoryBaseView
+
+- (void)dealloc {
+ if (self.contentScrollView) {
+ [self.contentScrollView removeObserver:self forKeyPath:@"contentOffset"];
+ }
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
+ [self.animator stop];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self initializeData];
+ [self initializeViews];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self initializeData];
+ [self initializeViews];
+ }
+ return self;
+}
+
+- (void)willMoveToSuperview:(UIView *)newSuperview {
+ [super willMoveToSuperview:newSuperview];
+
+ [self configAutomaticallyAdjustsScrollViewInsets:newSuperview];
+}
+
+- (void)reloadData {
+ [self reloadDataWithoutListContainer];
+ [self.listContainer reloadData];
+}
+
+- (void)reloadDataWithoutListContainer {
+ [self refreshDataSource];
+ [self refreshState];
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ [self.collectionView reloadData];
+}
+
+- (void)reloadCellAtIndex:(NSInteger)index {
+ if (index < 0 || index >= self.dataSource.count) {
+ return;
+ }
+ JXCategoryBaseCellModel *cellModel = self.dataSource[index];
+ cellModel.selectedType = JXCategoryCellSelectedTypeUnknown;
+ [self refreshCellModel:cellModel index:index];
+ JXCategoryBaseCell *cell = (JXCategoryBaseCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
+ [cell reloadData:cellModel];
+}
+
+- (void)selectItemAtIndex:(NSInteger)index {
+ [self selectCellAtIndex:index selectedType:JXCategoryCellSelectedTypeCode];
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ //部分使用者为了适配不同的手机屏幕尺寸,JXCategoryView的宽高比要求保持一样,所以它的高度就会因为不同宽度的屏幕而不一样。计算出来的高度,有时候会是位数很长的浮点数,如果把这个高度设置给UICollectionView就会触发内部的一个错误。所以,为了规避这个问题,在这里对高度统一向下取整。
+ //如果向下取整导致了你的页面异常,请自己重新设置JXCategoryView的高度,保证为整数即可。
+ CGRect targetFrame = CGRectMake(0, 0, self.bounds.size.width, floor(self.bounds.size.height));
+ if (self.isFirstLayoutSubviews) {
+ if (self.bounds.size.width == 0 || self.bounds.size.height == 0) {
+ return;
+ }
+ if (self.isNeedConfigAutomaticallyAdjustsScrollViewInsets) {
+ [self configAutomaticallyAdjustsScrollViewInsets:self.superview];
+ }
+ self.firstLayoutSubviews = NO;
+ self.collectionView.frame = targetFrame;
+ [self reloadDataWithoutListContainer];
+ }else {
+ if (!CGRectEqualToRect(self.collectionView.frame, targetFrame)) {
+ self.collectionView.frame = targetFrame;
+ [self refreshState];
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ [self.collectionView reloadData];
+ }
+ }
+}
+
+#pragma mark - Setter
+
+- (void)setDelegate:(id)delegate {
+ _delegate = delegate;
+
+ _delegateFlags.didSelectedItemAtIndexFlag = [delegate respondsToSelector:@selector(categoryView:didSelectedItemAtIndex:)];
+ _delegateFlags.didClickSelectedItemAtIndexFlag = [delegate respondsToSelector:@selector(categoryView:didClickSelectedItemAtIndex:)];
+ _delegateFlags.didScrollSelectedItemAtIndexFlag = [delegate respondsToSelector:@selector(categoryView:didScrollSelectedItemAtIndex:)];
+ _delegateFlags.canClickItemAtIndexFlag = [delegate respondsToSelector:@selector(categoryView:canClickItemAtIndex:)];
+ _delegateFlags.scrollingFromLeftIndexToRightIndexFlag = [delegate respondsToSelector:@selector(categoryView:scrollingFromLeftIndex:toRightIndex:ratio:)];
+}
+
+- (void)setDefaultSelectedIndex:(NSInteger)defaultSelectedIndex {
+ _defaultSelectedIndex = defaultSelectedIndex;
+
+ self.selectedIndex = defaultSelectedIndex;
+ [self.listContainer setDefaultSelectedIndex:defaultSelectedIndex];
+}
+
+- (void)setContentScrollView:(UIScrollView *)contentScrollView {
+ if (_contentScrollView != nil) {
+ [_contentScrollView removeObserver:self forKeyPath:@"contentOffset"];
+ }
+ _contentScrollView = contentScrollView;
+
+ self.contentScrollView.scrollsToTop = NO;
+ [self.contentScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
+}
+
+- (void)setListContainer:(id)listContainer {
+ _listContainer = listContainer;
+ [listContainer setDefaultSelectedIndex:self.defaultSelectedIndex];
+ self.contentScrollView = [listContainer contentScrollView];
+}
+
+#pragma mark -
+
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+ return 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+ return self.dataSource.count;
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+ return [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([self preferredCellClass]) forIndexPath:indexPath];
+}
+
+- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
+ JXCategoryBaseCellModel *cellModel = self.dataSource[indexPath.item];
+ cellModel.selectedType = JXCategoryCellSelectedTypeUnknown;
+ [(JXCategoryBaseCell *)cell reloadData:cellModel];
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
+ BOOL isTransitionAnimating = NO;
+ for (JXCategoryBaseCellModel *cellModel in self.dataSource) {
+ if (cellModel.isTransitionAnimating) {
+ isTransitionAnimating = YES;
+ break;
+ }
+ }
+ if (!isTransitionAnimating) {
+ //当前没有正在过渡的item,才允许点击选中
+ [self clickSelectItemAtIndex:indexPath.row];
+ }
+}
+
+#pragma mark -
+
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
+ return UIEdgeInsetsMake(0, [self getContentEdgeInsetLeft], 0, [self getContentEdgeInsetRight]);
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+ return CGSizeMake(self.dataSource[indexPath.item].cellWidth, self.collectionView.bounds.size.height);
+}
+
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
+ return self.innerCellSpacing;
+}
+
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
+ return self.innerCellSpacing;
+}
+
+#pragma mark - KVO
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
+ if ([keyPath isEqualToString:@"contentOffset"]) {
+ CGPoint contentOffset = [change[NSKeyValueChangeNewKey] CGPointValue];
+ if ((self.contentScrollView.isTracking || self.contentScrollView.isDecelerating)) {
+ //只处理用户滚动的情况
+ [self contentOffsetOfContentScrollViewDidChanged:contentOffset];
+ }
+ self.lastContentViewContentOffset = contentOffset;
+ }
+}
+
+#pragma mark - Private
+
+- (void)configAutomaticallyAdjustsScrollViewInsets:(UIView *)view {
+ UIResponder *next = view;
+ while (next != nil) {
+ if ([next isKindOfClass:[UIViewController class]]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ ((UIViewController *)next).automaticallyAdjustsScrollViewInsets = NO;
+#pragma clang diagnostic pop
+ self.needConfigAutomaticallyAdjustsScrollViewInsets = NO;
+ break;
+ }
+ next = next.nextResponder;
+ }
+}
+
+- (CGFloat)getContentEdgeInsetLeft {
+ if (self.contentEdgeInsetLeft == JXCategoryViewAutomaticDimension) {
+ return self.innerCellSpacing;
+ }
+ return self.contentEdgeInsetLeft;
+}
+
+- (CGFloat)getContentEdgeInsetRight {
+ if (self.contentEdgeInsetRight == JXCategoryViewAutomaticDimension) {
+ return self.innerCellSpacing;
+ }
+ return self.contentEdgeInsetRight;
+}
+
+- (CGFloat)getCellWidthAtIndex:(NSInteger)index {
+ return [self preferredCellWidthAtIndex:index] + self.cellWidthIncrement;
+}
+
+- (void)clickSelectItemAtIndex:(NSInteger)index {
+ if (self.delegateFlags.canClickItemAtIndexFlag && ![self.delegate categoryView:self canClickItemAtIndex:index]) {
+ return;
+ }
+
+ [self selectCellAtIndex:index selectedType:JXCategoryCellSelectedTypeClick];
+}
+
+- (void)scrollSelectItemAtIndex:(NSInteger)index {
+ [self selectCellAtIndex:index selectedType:JXCategoryCellSelectedTypeScroll];
+}
+
+- (void)applicationDidBecomeActive:(NSNotification *)notification {
+ if (self.isNeedReloadByBecomeActive) {
+ self.needReloadByBecomeActive = NO;
+ [self reloadData];
+ }
+}
+
+@end
+
+@implementation JXCategoryBaseView (UISubclassingBaseHooks)
+
+- (CGRect)getTargetCellFrame:(NSInteger)targetIndex {
+ CGFloat x = [self getContentEdgeInsetLeft];
+ for (int i = 0; i < targetIndex; i ++) {
+ JXCategoryBaseCellModel *cellModel = self.dataSource[i];
+ CGFloat cellWidth;
+ if (cellModel.isTransitionAnimating && cellModel.isCellWidthZoomEnabled) {
+ //正在进行动画的时候,cellWidthCurrentZoomScale是随着动画渐变的,而没有立即更新到目标值
+ if (cellModel.isSelected) {
+ cellWidth = [self getCellWidthAtIndex:cellModel.index]*cellModel.cellWidthSelectedZoomScale;
+ }else {
+ cellWidth = [self getCellWidthAtIndex:cellModel.index]*cellModel.cellWidthNormalZoomScale;
+ }
+ }else {
+ cellWidth = cellModel.cellWidth;
+ }
+ x += cellWidth + self.innerCellSpacing;
+ }
+ CGFloat width;
+ JXCategoryBaseCellModel *selectedCellModel = self.dataSource[targetIndex];
+ if (selectedCellModel.isTransitionAnimating && selectedCellModel.isCellWidthZoomEnabled) {
+ width = [self getCellWidthAtIndex:selectedCellModel.index]*selectedCellModel.cellWidthSelectedZoomScale;
+ }else {
+ width = selectedCellModel.cellWidth;
+ }
+ return CGRectMake(x, 0, width, self.bounds.size.height);
+}
+
+- (CGRect)getTargetSelectedCellFrame:(NSInteger)targetIndex selectedType:(JXCategoryCellSelectedType)selectedType {
+ CGFloat x = [self getContentEdgeInsetLeft];
+ for (int i = 0; i < targetIndex; i ++) {
+ JXCategoryBaseCellModel *cellModel = self.dataSource[i];
+ x += [self getCellWidthAtIndex:cellModel.index] + self.innerCellSpacing;
+ }
+ CGFloat cellWidth = 0;
+ JXCategoryBaseCellModel *selectedCellModel = self.dataSource[targetIndex];
+ if (selectedCellModel.cellWidthZoomEnabled) {
+ cellWidth = [self getCellWidthAtIndex:targetIndex]*selectedCellModel.cellWidthSelectedZoomScale;
+ }else {
+ cellWidth = [self getCellWidthAtIndex:targetIndex];
+ }
+ return CGRectMake(x, 0, cellWidth, self.bounds.size.height);
+}
+
+- (void)initializeData {
+ _firstLayoutSubviews = YES;
+ _dataSource = [NSMutableArray array];
+ _selectedIndex = 0;
+ _cellWidth = JXCategoryViewAutomaticDimension;
+ _cellWidthIncrement = 0;
+ _cellSpacing = 20;
+ _averageCellSpacingEnabled = YES;
+ _cellWidthZoomEnabled = NO;
+ _cellWidthZoomScale = 1.2;
+ _cellWidthZoomScrollGradientEnabled = YES;
+ _contentEdgeInsetLeft = JXCategoryViewAutomaticDimension;
+ _contentEdgeInsetRight = JXCategoryViewAutomaticDimension;
+ _lastContentViewContentOffset = CGPointZero;
+ _selectedAnimationEnabled = NO;
+ _selectedAnimationDuration = 0.25;
+ _scrollingTargetIndex = -1;
+ _contentScrollViewClickTransitionAnimationEnabled = YES;
+ _needReloadByBecomeActive = NO;
+}
+
+- (void)initializeViews {
+ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+ layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+ _collectionView = [[JXCategoryCollectionView alloc] initWithFrame:self.bounds collectionViewLayout:layout];
+ self.collectionView.backgroundColor = [UIColor clearColor];
+ self.collectionView.showsHorizontalScrollIndicator = NO;
+ self.collectionView.showsVerticalScrollIndicator = NO;
+ self.collectionView.scrollsToTop = NO;
+ self.collectionView.dataSource = self;
+ self.collectionView.delegate = self;
+ [self.collectionView registerClass:[self preferredCellClass] forCellWithReuseIdentifier:NSStringFromClass([self preferredCellClass])];
+ if (@available(iOS 10.0, *)) {
+ self.collectionView.prefetchingEnabled = NO;
+ }
+ if (@available(iOS 11.0, *)) {
+ if ([self.collectionView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
+ self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ }
+ if ([RTLManager supportRTL]) {
+ self.collectionView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
+ [RTLManager horizontalFlipView:self.collectionView];
+ }
+ [self addSubview:self.collectionView];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
+}
+
+- (void)refreshDataSource {}
+
+- (void)refreshState {
+ if (self.selectedIndex < 0 || self.selectedIndex >= self.dataSource.count) {
+ self.defaultSelectedIndex = 0;
+ }
+
+ self.innerCellSpacing = self.cellSpacing;
+ //总的内容宽度(左边距+cell总宽度+总cellSpacing+右边距)
+ __block CGFloat totalItemWidth = [self getContentEdgeInsetLeft];
+ //总的cell宽度
+ CGFloat totalCellWidth = 0;
+ for (int i = 0; i < self.dataSource.count; i++) {
+ JXCategoryBaseCellModel *cellModel = self.dataSource[i];
+ cellModel.index = i;
+ cellModel.cellWidthZoomEnabled = self.cellWidthZoomEnabled;
+ cellModel.cellWidthNormalZoomScale = 1;
+ cellModel.cellWidthSelectedZoomScale = self.cellWidthZoomScale;
+ cellModel.selectedAnimationEnabled = self.selectedAnimationEnabled;
+ cellModel.selectedAnimationDuration = self.selectedAnimationDuration;
+ cellModel.cellSpacing = self.innerCellSpacing;
+ if (i == self.selectedIndex) {
+ cellModel.selected = YES;
+ cellModel.cellWidthCurrentZoomScale = cellModel.cellWidthSelectedZoomScale;
+ }else {
+ cellModel.selected = NO;
+ cellModel.cellWidthCurrentZoomScale = cellModel.cellWidthNormalZoomScale;
+ }
+ if (self.isCellWidthZoomEnabled) {
+ cellModel.cellWidth = [self getCellWidthAtIndex:i]*cellModel.cellWidthCurrentZoomScale;
+ }else {
+ cellModel.cellWidth = [self getCellWidthAtIndex:i];
+ }
+ totalCellWidth += cellModel.cellWidth;
+ if (i == self.dataSource.count - 1) {
+ totalItemWidth += cellModel.cellWidth + [self getContentEdgeInsetRight];
+ }else {
+ totalItemWidth += cellModel.cellWidth + self.innerCellSpacing;
+ }
+ [self refreshCellModel:cellModel index:i];
+ }
+
+ if (self.isAverageCellSpacingEnabled && totalItemWidth < self.bounds.size.width) {
+ //如果总的内容宽度都没有超过视图宽度,就将cellSpacing等分
+ NSInteger cellSpacingItemCount = self.dataSource.count - 1;
+ CGFloat totalCellSpacingWidth = self.bounds.size.width - totalCellWidth;
+ //如果内容左边距是Automatic,就加1
+ if (self.contentEdgeInsetLeft == JXCategoryViewAutomaticDimension) {
+ cellSpacingItemCount += 1;
+ }else {
+ totalCellSpacingWidth -= self.contentEdgeInsetLeft;
+ }
+ //如果内容右边距是Automatic,就加1
+ if (self.contentEdgeInsetRight == JXCategoryViewAutomaticDimension) {
+ cellSpacingItemCount += 1;
+ }else {
+ totalCellSpacingWidth -= self.contentEdgeInsetRight;
+ }
+
+ CGFloat cellSpacing = 0;
+ if (cellSpacingItemCount > 0) {
+ cellSpacing = totalCellSpacingWidth/cellSpacingItemCount;
+ }
+ self.innerCellSpacing = cellSpacing;
+ [self.dataSource enumerateObjectsUsingBlock:^(JXCategoryBaseCellModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+ obj.cellSpacing = self.innerCellSpacing;
+ }];
+ }
+
+ //---------------------定位collectionView到当前选中的位置----------------------
+ //因为初始化的时候,collectionView并没有初始化完,cell都没有被加载出来。只有自己手动计算当前选中的index的位置,然后更新到contentOffset
+ __block CGFloat frameXOfSelectedCell = [self getContentEdgeInsetLeft];
+ __block CGFloat selectedCellWidth = 0;
+ totalItemWidth = [self getContentEdgeInsetLeft];
+ [self.dataSource enumerateObjectsUsingBlock:^(JXCategoryBaseCellModel * cellModel, NSUInteger idx, BOOL * _Nonnull stop) {
+ if (idx < self.selectedIndex) {
+ frameXOfSelectedCell += cellModel.cellWidth + self.innerCellSpacing;
+ }else if (idx == self.selectedIndex) {
+ selectedCellWidth = cellModel.cellWidth;
+ }
+ if (idx == self.dataSource.count - 1) {
+ totalItemWidth += cellModel.cellWidth + [self getContentEdgeInsetRight];
+ }else {
+ totalItemWidth += cellModel.cellWidth + self.innerCellSpacing;
+ }
+ }];
+
+ CGFloat minX = 0;
+ CGFloat maxX = totalItemWidth - self.bounds.size.width;
+ CGFloat targetX = frameXOfSelectedCell - self.bounds.size.width/2.0 + selectedCellWidth/2.0;
+ CGPoint collectionViewContentOffset = self.collectionView.contentOffset;
+ collectionViewContentOffset.x = MAX(MIN(maxX, targetX), minX);
+
+ [self.collectionView setContentOffset:collectionViewContentOffset
+ animated:NO];
+ //---------------------定位collectionView到当前选中的位置----------------------
+
+ if (CGRectEqualToRect(self.contentScrollView.frame, CGRectZero) && self.contentScrollView.superview != nil) {
+ //某些情况系统会出现JXCategoryView先布局,contentScrollView后布局。就会导致下面指定defaultSelectedIndex失效,所以发现contentScrollView的frame为zero时,强行触发其父视图链里面已经有frame的一个父视图的layoutSubviews方法。
+ //比如JXSegmentedListContainerView会将contentScrollView包裹起来使用,该情况需要JXSegmentedListContainerView.superView触发布局更新
+ UIView *parentView = self.contentScrollView.superview;
+ while (parentView != nil && CGRectEqualToRect(parentView.frame, CGRectZero)) {
+ parentView = parentView.superview;
+ }
+ [parentView setNeedsLayout];
+ [parentView layoutIfNeeded];
+ }
+ //将contentScrollView的contentOffset定位到当前选中index的位置
+ CGPoint contentScrollViewContentOffset = self.contentScrollView.contentOffset;
+ contentScrollViewContentOffset.x = self.selectedIndex*self.contentScrollView.bounds.size.width;
+ [self.contentScrollView setContentOffset:contentScrollViewContentOffset animated:NO];
+}
+
+- (BOOL)selectCellAtIndex:(NSInteger)targetIndex selectedType:(JXCategoryCellSelectedType)selectedType {
+ if (targetIndex < 0 || targetIndex >= self.dataSource.count) {
+ return NO;
+ }
+
+ self.needReloadByBecomeActive = NO;
+ if (self.selectedIndex == targetIndex) {
+ //目标index和当前选中的index相等,就不需要处理后续的选中更新逻辑,只需要回调代理方法即可。
+ if (selectedType == JXCategoryCellSelectedTypeCode) {
+ [self.listContainer didClickSelectedItemAtIndex:targetIndex];
+ }else if (selectedType == JXCategoryCellSelectedTypeClick) {
+ [self.listContainer didClickSelectedItemAtIndex:targetIndex];
+ if (self.delegateFlags.didClickSelectedItemAtIndexFlag) {
+ [self.delegate categoryView:self didClickSelectedItemAtIndex:targetIndex];
+ }
+ }else if (selectedType == JXCategoryCellSelectedTypeScroll) {
+ if (self.delegateFlags.didScrollSelectedItemAtIndexFlag) {
+ [self.delegate categoryView:self didScrollSelectedItemAtIndex:targetIndex];
+ }
+ }
+ if (self.delegateFlags.didSelectedItemAtIndexFlag) {
+ [self.delegate categoryView:self didSelectedItemAtIndex:targetIndex];
+ }
+ self.scrollingTargetIndex = -1;
+ return NO;
+ }
+
+ //通知子类刷新当前选中的和将要选中的cellModel
+ JXCategoryBaseCellModel *lastCellModel = self.dataSource[self.selectedIndex];
+ lastCellModel.selectedType = selectedType;
+ JXCategoryBaseCellModel *selectedCellModel = self.dataSource[targetIndex];
+ selectedCellModel.selectedType = selectedType;
+ [self refreshSelectedCellModel:selectedCellModel unselectedCellModel:lastCellModel];
+
+ //刷新当前选中的和将要选中的cell
+ JXCategoryBaseCell *lastCell = (JXCategoryBaseCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:self.selectedIndex inSection:0]];
+ [lastCell reloadData:lastCellModel];
+ JXCategoryBaseCell *selectedCell = (JXCategoryBaseCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:targetIndex inSection:0]];
+ [selectedCell reloadData:selectedCellModel];
+
+ if (self.scrollingTargetIndex != -1 && self.scrollingTargetIndex != targetIndex) {
+ JXCategoryBaseCellModel *scrollingTargetCellModel = self.dataSource[self.scrollingTargetIndex];
+ scrollingTargetCellModel.selected = NO;
+ scrollingTargetCellModel.selectedType = selectedType;
+ [self refreshSelectedCellModel:selectedCellModel unselectedCellModel:scrollingTargetCellModel];
+ JXCategoryBaseCell *scrollingTargetCell = (JXCategoryBaseCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:self.scrollingTargetIndex inSection:0]];
+ [scrollingTargetCell reloadData:scrollingTargetCellModel];
+ }
+
+ if (self.isCellWidthZoomEnabled) {
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ //延时为了解决cellwidth变化,点击最后几个cell,scrollToItem会出现位置偏移bu。需要等cellWidth动画渐变结束后再滚动到index的cell位置。
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.selectedAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
+ });
+ } else {
+ [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
+ }
+
+ if (selectedType == JXCategoryCellSelectedTypeClick ||
+ selectedType == JXCategoryCellSelectedTypeCode) {
+ CGPoint offset = self.contentScrollView.contentOffset;
+ offset.x =
+ targetIndex*self.contentScrollView.bounds.size.width;
+ [self.contentScrollView setContentOffset:offset
+ animated:self.isContentScrollViewClickTransitionAnimationEnabled];
+ }
+
+ self.selectedIndex = targetIndex;
+ if (selectedType == JXCategoryCellSelectedTypeCode) {
+ [self.listContainer didClickSelectedItemAtIndex:targetIndex];
+ } else if (selectedType == JXCategoryCellSelectedTypeClick) {
+ [self.listContainer didClickSelectedItemAtIndex:targetIndex];
+ if (self.delegateFlags.didClickSelectedItemAtIndexFlag) {
+ [self.delegate categoryView:self didClickSelectedItemAtIndex:targetIndex];
+ }
+ } else if(selectedType == JXCategoryCellSelectedTypeScroll) {
+ if (self.delegateFlags.didScrollSelectedItemAtIndexFlag) {
+ [self.delegate categoryView:self didScrollSelectedItemAtIndex:targetIndex];
+ }
+ }
+ if (self.delegateFlags.didSelectedItemAtIndexFlag) {
+ [self.delegate categoryView:self didSelectedItemAtIndex:targetIndex];
+ }
+ self.scrollingTargetIndex = -1;
+
+ return YES;
+}
+
+
+- (void)refreshSelectedCellModel:(JXCategoryBaseCellModel *)selectedCellModel unselectedCellModel:(JXCategoryBaseCellModel *)unselectedCellModel {
+ selectedCellModel.selected = YES;
+ unselectedCellModel.selected = NO;
+
+ if (self.isCellWidthZoomEnabled) {
+ if (selectedCellModel.selectedType == JXCategoryCellSelectedTypeCode ||
+ selectedCellModel.selectedType == JXCategoryCellSelectedTypeClick) {
+ self.animator = [[JXCategoryViewAnimator alloc] init];
+ self.animator.duration = self.selectedAnimationDuration;
+ __weak typeof(self) weakSelf = self;
+ self.animator.progressCallback = ^(CGFloat percent) {
+ selectedCellModel.transitionAnimating = YES;
+ unselectedCellModel.transitionAnimating = YES;
+ selectedCellModel.cellWidthCurrentZoomScale = [JXCategoryFactory interpolationFrom:selectedCellModel.cellWidthNormalZoomScale to:selectedCellModel.cellWidthSelectedZoomScale percent:percent];
+ selectedCellModel.cellWidth = [weakSelf getCellWidthAtIndex:selectedCellModel.index] * selectedCellModel.cellWidthCurrentZoomScale;
+ unselectedCellModel.cellWidthCurrentZoomScale = [JXCategoryFactory interpolationFrom:unselectedCellModel.cellWidthSelectedZoomScale to:unselectedCellModel.cellWidthNormalZoomScale percent:percent];
+ unselectedCellModel.cellWidth = [weakSelf getCellWidthAtIndex:unselectedCellModel.index] * unselectedCellModel.cellWidthCurrentZoomScale;
+ [weakSelf.collectionView.collectionViewLayout invalidateLayout];
+ };
+ self.animator.completeCallback = ^{
+ selectedCellModel.transitionAnimating = NO;
+ unselectedCellModel.transitionAnimating = NO;
+ };
+ [self.animator start];
+ } else {
+ selectedCellModel.cellWidthCurrentZoomScale = selectedCellModel.cellWidthSelectedZoomScale;
+ selectedCellModel.cellWidth = [self getCellWidthAtIndex:selectedCellModel.index] * selectedCellModel.cellWidthCurrentZoomScale;
+ unselectedCellModel.cellWidthCurrentZoomScale = unselectedCellModel.cellWidthNormalZoomScale;
+ unselectedCellModel.cellWidth = [self getCellWidthAtIndex:unselectedCellModel.index] * unselectedCellModel.cellWidthCurrentZoomScale;
+ }
+ }
+}
+
+- (void)contentOffsetOfContentScrollViewDidChanged:(CGPoint)contentOffset {
+ if (self.dataSource.count == 0) {
+ return;
+ }
+ CGFloat ratio = contentOffset.x/self.contentScrollView.bounds.size.width;
+ if (ratio > self.dataSource.count - 1 || ratio < 0) {
+ //超过了边界,不需要处理
+ return;
+ }
+ if (contentOffset.x == 0 && self.selectedIndex == 0 && self.lastContentViewContentOffset.x == 0) {
+ //滚动到了最左边,且已经选中了第一个,且之前的contentOffset.x为0
+ return;
+ }
+ CGFloat maxContentOffsetX = self.contentScrollView.contentSize.width - self.contentScrollView.bounds.size.width;
+ if (contentOffset.x == maxContentOffsetX && self.selectedIndex == self.dataSource.count - 1 && self.lastContentViewContentOffset.x == maxContentOffsetX) {
+ //滚动到了最右边,且已经选中了最后一个,且之前的contentOffset.x为maxContentOffsetX
+ return;
+ }
+ ratio = MAX(0, MIN(self.dataSource.count - 1, ratio));
+ NSInteger baseIndex = floorf(ratio);
+ CGFloat remainderRatio = ratio - baseIndex;
+
+ if (remainderRatio == 0) {
+ //快速滑动翻页,用户一直在拖拽contentScrollView,需要更新选中状态
+ //滑动一小段距离,然后放开回到原位,contentOffset同样的值会回调多次。例如在index为1的情况,滑动放开回到原位,contentOffset会多次回调CGPoint(width, 0)
+ if (!(self.lastContentViewContentOffset.x == contentOffset.x && self.selectedIndex == baseIndex)) {
+ [self scrollSelectItemAtIndex:baseIndex];
+ }
+ } else {
+ self.needReloadByBecomeActive = YES;
+ if (self.animator.isExecuting) {
+ [self.animator invalid];
+ //需要重置之前animator.progessCallback为处理完的状态
+ for (JXCategoryBaseCellModel *model in self.dataSource) {
+ if (model.isSelected) {
+ model.cellWidthCurrentZoomScale = model.cellWidthSelectedZoomScale;
+ model.cellWidth = [self getCellWidthAtIndex:model.index] * model.cellWidthCurrentZoomScale;
+ }else {
+ model.cellWidthCurrentZoomScale = model.cellWidthNormalZoomScale;
+ model.cellWidth = [self getCellWidthAtIndex:model.index] * model.cellWidthCurrentZoomScale;
+ }
+ }
+ }
+ //快速滑动翻页,当remainderRatio没有变成0,但是已经翻页了,需要通过下面的判断,触发选中
+ if (fabs(ratio - self.selectedIndex) > 1) {
+ NSInteger targetIndex = baseIndex;
+ if (ratio < self.selectedIndex) {
+ targetIndex = baseIndex + 1;
+ }
+ [self scrollSelectItemAtIndex:targetIndex];
+ }
+
+ if (self.selectedIndex == baseIndex) {
+ self.scrollingTargetIndex = baseIndex + 1;
+ } else {
+ self.scrollingTargetIndex = baseIndex;
+ }
+
+ if (self.isCellWidthZoomEnabled && self.isCellWidthZoomScrollGradientEnabled) {
+ JXCategoryBaseCellModel *leftCellModel = (JXCategoryBaseCellModel *)self.dataSource[baseIndex];
+ JXCategoryBaseCellModel *rightCellModel = (JXCategoryBaseCellModel *)self.dataSource[baseIndex + 1];
+ leftCellModel.cellWidthCurrentZoomScale = [JXCategoryFactory interpolationFrom:leftCellModel.cellWidthSelectedZoomScale to:leftCellModel.cellWidthNormalZoomScale percent:remainderRatio];
+ leftCellModel.cellWidth = [self getCellWidthAtIndex:leftCellModel.index] * leftCellModel.cellWidthCurrentZoomScale;
+ rightCellModel.cellWidthCurrentZoomScale = [JXCategoryFactory interpolationFrom:rightCellModel.cellWidthNormalZoomScale to:rightCellModel.cellWidthSelectedZoomScale percent:remainderRatio];
+ rightCellModel.cellWidth = [self getCellWidthAtIndex:rightCellModel.index] * rightCellModel.cellWidthCurrentZoomScale;
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ }
+
+ if (self.delegateFlags.scrollingFromLeftIndexToRightIndexFlag) {
+ [self.delegate categoryView:self scrollingFromLeftIndex:baseIndex toRightIndex:baseIndex + 1 ratio:remainderRatio];
+ }
+ }
+}
+
+- (CGFloat)preferredCellWidthAtIndex:(NSInteger)index {
+ return 0;
+}
+
+- (Class)preferredCellClass {
+ return JXCategoryBaseCell.class;
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryCollectionView.h b/Pods/JXCategoryView/Sources/Common/JXCategoryCollectionView.h
new file mode 100644
index 0000000..dcf1ccb
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryCollectionView.h
@@ -0,0 +1,24 @@
+//
+// JXCategoryCollectionView.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/21.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXCategoryIndicatorProtocol.h"
+@class JXCategoryCollectionView;
+
+@protocol JXCategoryCollectionViewGestureDelegate
+@optional
+- (BOOL)categoryCollectionView:(JXCategoryCollectionView *)collectionView gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
+- (BOOL)categoryCollectionView:(JXCategoryCollectionView *)collectionView gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
+@end
+
+@interface JXCategoryCollectionView : UICollectionView
+
+@property (nonatomic, strong) NSArray *> *indicators;
+@property (nonatomic, weak) id gestureDelegate;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryCollectionView.m b/Pods/JXCategoryView/Sources/Common/JXCategoryCollectionView.m
new file mode 100644
index 0000000..e8d4829
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryCollectionView.m
@@ -0,0 +1,52 @@
+//
+// JXCategoryCollectionView.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/21.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryCollectionView.h"
+
+@interface JXCategoryCollectionView ()
+@end
+
+@implementation JXCategoryCollectionView
+
+- (void)setIndicators:(NSArray *> *)indicators {
+ for (UIView *indicator in _indicators) {
+ //先移除之前的indicator
+ [indicator removeFromSuperview];
+ }
+
+ _indicators = indicators;
+
+ for (UIView *indicator in indicators) {
+ [self addSubview:indicator];
+ }
+}
+
+- (void)layoutSubviews
+{
+ [super layoutSubviews];
+
+ for (UIView *view in self.indicators) {
+ [self sendSubviewToBack:view];
+ }
+}
+
+- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
+ if (self.gestureDelegate && [self.gestureDelegate respondsToSelector:@selector(categoryCollectionView:gestureRecognizerShouldBegin:)]) {
+ return [self.gestureDelegate categoryCollectionView:self gestureRecognizerShouldBegin:gestureRecognizer];
+ }
+ return YES;
+}
+
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
+ if (self.gestureDelegate && [self.gestureDelegate respondsToSelector:@selector(categoryCollectionView:gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:)]) {
+ return [self.gestureDelegate categoryCollectionView:self gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];
+ }
+ return NO;
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryFactory.h b/Pods/JXCategoryView/Sources/Common/JXCategoryFactory.h
new file mode 100644
index 0000000..ef28f7e
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryFactory.h
@@ -0,0 +1,18 @@
+//
+// JXCategoryFactory.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import
+
+@interface JXCategoryFactory : NSObject
+
++ (CGFloat)interpolationFrom:(CGFloat)from to:(CGFloat)to percent:(CGFloat)percent;
+
++ (UIColor *)interpolationColorFrom:(UIColor *)fromColor to:(UIColor *)toColor percent:(CGFloat)percent;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryFactory.m b/Pods/JXCategoryView/Sources/Common/JXCategoryFactory.m
new file mode 100644
index 0000000..c71451e
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryFactory.m
@@ -0,0 +1,29 @@
+//
+// JXCategoryFactory.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryFactory.h"
+#import "UIColor+JXAdd.h"
+
+@implementation JXCategoryFactory
+
++ (CGFloat)interpolationFrom:(CGFloat)from to:(CGFloat)to percent:(CGFloat)percent
+{
+ percent = MAX(0, MIN(1, percent));
+ return from + (to - from)*percent;
+}
+
++ (UIColor *)interpolationColorFrom:(UIColor *)fromColor to:(UIColor *)toColor percent:(CGFloat)percent
+{
+ CGFloat red = [self interpolationFrom:fromColor.jx_red to:toColor.jx_red percent:percent];
+ CGFloat green = [self interpolationFrom:fromColor.jx_green to:toColor.jx_green percent:percent];
+ CGFloat blue = [self interpolationFrom:fromColor.jx_blue to:toColor.jx_blue percent:percent];
+ CGFloat alpha = [self interpolationFrom:fromColor.jx_alpha to:toColor.jx_alpha percent:percent];
+ return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorParamsModel.h b/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorParamsModel.h
new file mode 100644
index 0000000..00da754
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorParamsModel.h
@@ -0,0 +1,31 @@
+//
+// JXCategoryIndicatorParamsModel.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/12/13.
+// Copyright © 2018 jiaxin. All rights reserved.
+//
+
+#import
+#import
+#import "JXCategoryViewDefines.h"
+
+/**
+ 指示器不同情况处理时传递的数据模型,不同情况会对不同的属性赋值,根据不同情况的 api 说明确认。
+
+ FAQ: 为什么会通过 model 传递数据?
+ 因为指示器处理逻辑以后会扩展不同的使用场景,会新增参数,如果不通过 model 传递,就会在 api 新增参数,一旦修改 api 改的地方就特别多了,而且会影响到之前自定义实现的开发者。
+ */
+@interface JXCategoryIndicatorParamsModel : NSObject
+
+@property (nonatomic, assign) NSInteger selectedIndex; // 当前选中的 index
+@property (nonatomic, assign) CGRect selectedCellFrame; // 当前选中的 cellFrame
+@property (nonatomic, assign) NSInteger leftIndex; // 正在过渡中的两个 cell,相对位置在左边的 cell 的 index
+@property (nonatomic, assign) CGRect leftCellFrame; // 正在过渡中的两个 cell,相对位置在左边的 cell 的 frame
+@property (nonatomic, assign) NSInteger rightIndex; // 正在过渡中的两个 cell,相对位置在右边的 cell 的 index
+@property (nonatomic, assign) CGRect rightCellFrame; // 正在过渡中的两个 cell,相对位置在右边的 cell 的 frame
+@property (nonatomic, assign) CGFloat percent; // 正在过渡中的两个 cell,从左到右的百分比
+@property (nonatomic, assign) NSInteger lastSelectedIndex; // 之前选中的 index
+@property (nonatomic, assign) JXCategoryCellSelectedType selectedType; //cell 被选中类型
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorParamsModel.m b/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorParamsModel.m
new file mode 100644
index 0000000..8a0eff0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorParamsModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryIndicatorParamsModel.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/12/13.
+// Copyright © 2018 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorParamsModel.h"
+
+@implementation JXCategoryIndicatorParamsModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorProtocol.h b/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorProtocol.h
new file mode 100644
index 0000000..b4f9ff0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryIndicatorProtocol.h
@@ -0,0 +1,49 @@
+//
+// JXCategoryIndicatorProtocol.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import
+#import "JXCategoryViewDefines.h"
+#import "JXCategoryIndicatorParamsModel.h"
+
+@protocol JXCategoryIndicatorProtocol
+
+/**
+ categoryView 重置状态时调用
+
+ param selectedIndex 当前选中的 index
+ param selectedCellFrame 当前选中的 cellFrame
+ @param model 数据模型
+ */
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model;
+
+/**
+ contentScrollView在进行手势滑动时,处理指示器跟随手势变化UI逻辑;
+
+ param selectedIndex 当前选中的index
+ param leftIndex 正在过渡中的两个cell,相对位置在左边的cell的index
+ param leftCellFrame 正在过渡中的两个cell,相对位置在左边的cell的frame
+ param rightIndex 正在过渡中的两个cell,相对位置在右边的cell的index
+ param rightCellFrame 正在过渡中的两个cell,相对位置在右边的cell的frame
+ param percent 过渡百分比
+ @param model 数据模型
+ */
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model;
+
+/**
+ 选中了某一个cell
+
+ param lastSelectedIndex 之前选中的index
+ param selectedIndex 选中的index
+ param selectedCellFrame 选中的cellFrame
+ param selectedType cell被选中类型
+ @param model 数据模型
+ */
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerRTLCell.h b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerRTLCell.h
new file mode 100644
index 0000000..75243b4
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerRTLCell.h
@@ -0,0 +1,16 @@
+//
+// JXCategoryListContainerRTLCell.h
+// JXCategoryView
+//
+// Created by jiaxin on 2020/7/3.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JXCategoryListContainerRTLCell : UICollectionViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerRTLCell.m b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerRTLCell.m
new file mode 100644
index 0000000..403efa9
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerRTLCell.m
@@ -0,0 +1,23 @@
+//
+// JXCategoryListContainerRTLCell.m
+// JXCategoryView
+//
+// Created by jiaxin on 2020/7/3.
+//
+
+#import "JXCategoryListContainerRTLCell.h"
+#import "RTLManager.h"
+
+@implementation JXCategoryListContainerRTLCell
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ self = [super initWithFrame:frame];
+ if (self) {
+ [RTLManager horizontalFlipViewIfNeeded:self];
+ [RTLManager horizontalFlipViewIfNeeded:self.contentView];
+ }
+ return self;
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerView.h b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerView.h
new file mode 100644
index 0000000..215b3a9
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerView.h
@@ -0,0 +1,122 @@
+//
+// JXCategoryListScrollView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/9/12.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXCategoryViewDefines.h"
+#import "JXCategoryBaseView.h"
+@class JXCategoryListContainerView;
+
+/**
+ 列表容器视图的类型
+
+ - ScrollView: UIScrollView。优势:没有其他副作用。劣势:视图内存占用相对大一点。
+ - CollectionView: 使用UICollectionView。优势:因为列表被添加到cell上,视图的内存占用更少,适合内存要求特别高的场景。劣势:因为cell重用机制的问题,导致列表下拉刷新视图,会因为被removeFromSuperview而被隐藏。需要参考`LoadDataListCollectionListViewController`类做特殊处理。
+ */
+typedef NS_ENUM(NSUInteger, JXCategoryListContainerType) {
+ JXCategoryListContainerType_ScrollView,
+ JXCategoryListContainerType_CollectionView,
+};
+
+@protocol JXCategoryListContentViewDelegate
+
+/**
+ 如果列表是VC,就返回VC.view
+ 如果列表是View,就返回View自己
+
+ @return 返回列表视图
+ */
+- (UIView *)listView;
+
+@optional
+
+/**
+ 可选实现,列表将要显示的时候调用
+ */
+- (void)listWillAppear;
+
+/**
+ 可选实现,列表显示的时候调用
+ */
+- (void)listDidAppear;
+
+/**
+ 可选实现,列表将要消失的时候调用
+ */
+- (void)listWillDisappear;
+
+/**
+ 可选实现,列表消失的时候调用
+ */
+- (void)listDidDisappear;
+
+@end
+
+@protocol JXCategoryListContainerViewDelegate
+/**
+ 返回list的数量
+
+ @param listContainerView 列表的容器视图
+ @return list的数量
+ */
+- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView;
+
+/**
+ 根据index返回一个对应列表实例,需要是遵从`JXCategoryListContentViewDelegate`协议的对象。
+ 你可以代理方法调用的时候初始化对应列表,达到懒加载的效果。这也是默认推荐的初始化列表方法。你也可以提前创建好列表,等该代理方法回调的时候再返回也可以,达到预加载的效果。
+ 如果列表是用自定义UIView封装的,就让自定义UIView遵从`JXCategoryListContentViewDelegate`协议,该方法返回自定义UIView即可。
+ 如果列表是用自定义UIViewController封装的,就让自定义UIViewController遵从`JXCategoryListContentViewDelegate`协议,该方法返回自定义UIViewController即可。
+
+ @param listContainerView 列表的容器视图
+ @param index 目标下标
+ @return 遵从JXCategoryListContentViewDelegate协议的list实例
+ */
+- (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index;
+
+@optional
+/**
+ 返回自定义UIScrollView或UICollectionView的Class
+ 某些特殊情况需要自己处理UIScrollView内部逻辑。比如项目用了FDFullscreenPopGesture,需要处理手势相关代理。
+
+ @param listContainerView JXCategoryListContainerView
+ @return 自定义UIScrollView实例
+ */
+- (Class)scrollViewClassInlistContainerView:(JXCategoryListContainerView *)listContainerView;
+
+/**
+ 控制能否初始化对应index的列表。有些业务需求,需要在某些情况才允许初始化某些列表,通过通过该代理实现控制。
+ */
+- (BOOL)listContainerView:(JXCategoryListContainerView *)listContainerView canInitListAtIndex:(NSInteger)index;
+
+- (void)listContainerViewDidScroll:(UIScrollView *)scrollView;
+- (void)listContainerViewWillBeginDragging:(UIScrollView *)scrollView;
+- (void)listContainerViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
+- (void)listContainerViewWillBeginDecelerating:(UIScrollView *)scrollView;
+- (void)listContainerViewDidEndDecelerating:(UIScrollView *)scrollView;
+
+@end
+
+
+@interface JXCategoryListContainerView : UIView
+
+@property (nonatomic, assign, readonly) JXCategoryListContainerType containerType;
+@property (nonatomic, strong, readonly) UIScrollView *scrollView;
+@property (nonatomic, strong, readonly) NSDictionary > *validListDict; //已经加载过的列表字典。key是index,value是对应的列表
+@property (nonatomic, strong) UIColor *listCellBackgroundColor; //默认:[UIColor whiteColor]
+/**
+ 滚动切换的时候,滚动距离超过一页的多少百分比,就触发列表的初始化。默认0.01(即列表显示了一点就触发加载)。范围0~1,开区间不包括0和1
+ */
+@property (nonatomic, assign) CGFloat initListPercent;
+@property (nonatomic, assign) BOOL bounces; //默认NO
+
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
+- (instancetype)initWithType:(JXCategoryListContainerType)type delegate:(id)delegate NS_DESIGNATED_INITIALIZER;
+
+@end
+
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerView.m b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerView.m
new file mode 100644
index 0000000..42081b1
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryListContainerView.m
@@ -0,0 +1,547 @@
+//
+// JXCategoryListContainerView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/9/12.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryListContainerView.h"
+#import
+#import "RTLManager.h"
+
+@interface JXCategoryListContainerViewController : UIViewController
+@property (copy) void(^viewWillAppearBlock)(void);
+@property (copy) void(^viewDidAppearBlock)(void);
+@property (copy) void(^viewWillDisappearBlock)(void);
+@property (copy) void(^viewDidDisappearBlock)(void);
+@end
+
+@implementation JXCategoryListContainerViewController
+- (void)dealloc
+{
+ self.viewWillAppearBlock = nil;
+ self.viewDidAppearBlock = nil;
+ self.viewWillDisappearBlock = nil;
+ self.viewDidDisappearBlock = nil;
+}
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+ self.viewWillAppearBlock();
+}
+- (void)viewDidAppear:(BOOL)animated {
+ [super viewDidAppear:animated];
+ self.viewDidAppearBlock();
+}
+- (void)viewWillDisappear:(BOOL)animated {
+ [super viewWillDisappear:animated];
+ self.viewWillDisappearBlock();
+}
+- (void)viewDidDisappear:(BOOL)animated {
+ [super viewDidDisappear:animated];
+ self.viewDidDisappearBlock();
+}
+- (BOOL)shouldAutomaticallyForwardAppearanceMethods { return NO; }
+@end
+
+@interface JXCategoryListContainerView ()
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, strong) UIScrollView *scrollView;
+@property (nonatomic, assign) NSInteger currentIndex;
+@property (nonatomic, strong) NSMutableDictionary > *validListDict;
+@property (nonatomic, assign) NSInteger willAppearIndex;
+@property (nonatomic, assign) NSInteger willDisappearIndex;
+@property (nonatomic, strong) UICollectionView *collectionView;
+@property (nonatomic, strong) JXCategoryListContainerViewController *containerVC;
+@end
+
+@implementation JXCategoryListContainerView
+
+- (instancetype)initWithType:(JXCategoryListContainerType)type delegate:(id)delegate{
+ self = [super initWithFrame:CGRectZero];
+ if (self) {
+ _containerType = type;
+ _delegate = delegate;
+ _validListDict = [NSMutableDictionary dictionary];
+ _willAppearIndex = -1;
+ _willDisappearIndex = -1;
+ _initListPercent = 0.01;
+ [self initializeViews];
+ }
+ return self;
+}
+
+- (void)initializeViews {
+ _listCellBackgroundColor = [UIColor whiteColor];
+ _containerVC = [[JXCategoryListContainerViewController alloc] init];
+ self.containerVC.view.backgroundColor = [UIColor clearColor];
+ [self addSubview:self.containerVC.view];
+ __weak typeof(self) weakSelf = self;
+ self.containerVC.viewWillAppearBlock = ^{
+ [weakSelf listWillAppear:weakSelf.currentIndex];
+ };
+ self.containerVC.viewDidAppearBlock = ^{
+ [weakSelf listDidAppear:weakSelf.currentIndex];
+ };
+ self.containerVC.viewWillDisappearBlock = ^{
+ [weakSelf listWillDisappear:weakSelf.currentIndex];
+ };
+ self.containerVC.viewDidDisappearBlock = ^{
+ [weakSelf listDidDisappear:weakSelf.currentIndex];
+ };
+ if (self.containerType == JXCategoryListContainerType_ScrollView) {
+ if (self.delegate &&
+ [self.delegate respondsToSelector:@selector(scrollViewClassInlistContainerView:)] &&
+ [[self.delegate scrollViewClassInlistContainerView:self] isKindOfClass:object_getClass([UIScrollView class])]) {
+ _scrollView = (UIScrollView *)[[[self.delegate scrollViewClassInlistContainerView:self] alloc] init];
+ }else {
+ _scrollView = [[UIScrollView alloc] init];
+ }
+ self.scrollView.delegate = self;
+ self.scrollView.pagingEnabled = YES;
+ self.scrollView.showsHorizontalScrollIndicator = NO;
+ self.scrollView.showsVerticalScrollIndicator = NO;
+ self.scrollView.scrollsToTop = NO;
+ self.scrollView.bounces = NO;
+ if (@available(iOS 11.0, *)) {
+ if ([self.scrollView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
+ self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ }
+ [RTLManager horizontalFlipViewIfNeeded:self.scrollView];
+ [self.containerVC.view addSubview:self.scrollView];
+ }else {
+ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+ layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+ layout.minimumLineSpacing = 0;
+ layout.minimumInteritemSpacing = 0;
+ if (self.delegate &&
+ [self.delegate respondsToSelector:@selector(scrollViewClassInlistContainerView:)] &&
+ [[self.delegate scrollViewClassInlistContainerView:self] isKindOfClass:object_getClass([UICollectionView class])]) {
+ _collectionView = (UICollectionView *)[[[self.delegate scrollViewClassInlistContainerView:self] alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+ }else {
+ _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+ }
+ self.collectionView.pagingEnabled = YES;
+ self.collectionView.showsHorizontalScrollIndicator = NO;
+ self.collectionView.showsVerticalScrollIndicator = NO;
+ self.collectionView.scrollsToTop = NO;
+ self.collectionView.bounces = NO;
+ self.collectionView.dataSource = self;
+ self.collectionView.delegate = self;
+ [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
+ if (@available(iOS 10.0, *)) {
+ self.collectionView.prefetchingEnabled = NO;
+ }
+ if (@available(iOS 11.0, *)) {
+ if ([self.collectionView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
+ self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ }
+ if ([RTLManager supportRTL]) {
+ self.collectionView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
+ [RTLManager horizontalFlipView:self.collectionView];
+ }
+ [self.containerVC.view addSubview:self.collectionView];
+ //让外部统一访问scrollView
+ _scrollView = _collectionView;
+ }
+}
+
+- (void)willMoveToSuperview:(UIView *)newSuperview {
+ [super willMoveToSuperview:newSuperview];
+
+ UIResponder *next = newSuperview;
+ while (next != nil) {
+ if ([next isKindOfClass:[UIViewController class]]) {
+ [((UIViewController *)next) addChildViewController:self.containerVC];
+ break;
+ }
+ next = next.nextResponder;
+ }
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ self.containerVC.view.frame = self.bounds;
+ if (self.containerType == JXCategoryListContainerType_ScrollView) {
+ if (CGRectEqualToRect(self.scrollView.frame, CGRectZero) || !CGSizeEqualToSize(self.scrollView.bounds.size, self.bounds.size)) {
+ self.scrollView.frame = self.bounds;
+ self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width*[self.delegate numberOfListsInlistContainerView:self], self.scrollView.bounds.size.height);
+ [_validListDict enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull index, id _Nonnull list, BOOL * _Nonnull stop) {
+ [list listView].frame = CGRectMake(index.intValue*self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
+ }];
+ CGPoint scrollViewContentOffset = self.scrollView.contentOffset;
+ scrollViewContentOffset.x = self.currentIndex*self.scrollView.bounds.size.width;
+ self.scrollView.contentOffset = scrollViewContentOffset;
+ }else {
+ self.scrollView.frame = self.bounds;
+ self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width*[self.delegate numberOfListsInlistContainerView:self], self.scrollView.bounds.size.height);
+ }
+ }else {
+ if (CGRectEqualToRect(self.collectionView.frame, CGRectZero) || !CGSizeEqualToSize(self.collectionView.bounds.size, self.bounds.size)) {
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ self.collectionView.frame = self.bounds;
+ [self.collectionView reloadData];
+ CGPoint collectionViewContentOffset = self.collectionView.contentOffset;
+ collectionViewContentOffset.x =
+ self.collectionView.bounds.size.width*self.currentIndex;
+ [self.collectionView setContentOffset:collectionViewContentOffset animated:NO];
+ }else {
+ self.collectionView.frame = self.bounds;
+ }
+ }
+}
+
+
+- (void)setinitListPercent:(CGFloat)initListPercent {
+ _initListPercent = initListPercent;
+ if (initListPercent <= 0 || initListPercent >= 1) {
+ NSAssert(NO, @"initListPercent值范围为开区间(0,1),即不包括0和1");
+ }
+}
+
+- (void)setBounces:(BOOL)bounces {
+ _bounces = bounces;
+ self.scrollView.bounces = bounces;
+}
+
+#pragma mark - UICollectionViewDelegate, UICollectionViewDataSource
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+ return [self.delegate numberOfListsInlistContainerView:self];
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+ UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
+ cell.contentView.backgroundColor = self.listCellBackgroundColor;
+
+ UIView* listView = nil;
+ id list = _validListDict[@(indexPath.item)];
+ if (list != nil) {
+ //fixme:如果list是UIViewController,如果这里的frame修改是`[list listView].frame = cell.bounds;`。那么就必须给list vc添加如下代码:
+ //- (void)loadView {
+ // self.view = [[UIView alloc] init];
+ //}
+ //所以,总感觉是把UIViewController当做普通view使用,导致了系统内部的bug。所以,缓兵之计就是用下面的方法,暂时解决问题。
+ listView = [list listView];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ listView.frame = cell.contentView.bounds;
+ } else {
+ listView.frame = cell.bounds;
+ }
+ }
+
+ BOOL isAdded = NO;
+ for (UIView *subview in cell.contentView.subviews) {
+ if( listView != subview ) {
+ [subview removeFromSuperview];
+ } else {
+ isAdded = YES;
+ }
+ }
+
+ if( !isAdded && listView ) {
+ [cell.contentView addSubview:listView];
+ }
+
+ // 针对 RTL 布局
+ if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:self.semanticContentAttribute]
+ == UIUserInterfaceLayoutDirectionRightToLeft) {
+ cell.contentView.transform = CGAffineTransformMakeScale(-1, 1);
+ }
+
+ return cell;
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+ return self.bounds.size;
+}
+
+#pragma mark - UIScrollViewDelegate
+
+- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewDidScroll:)]) {
+ [self.delegate listContainerViewDidScroll:scrollView];
+ }
+
+ if (!scrollView.isDragging && !scrollView.isTracking && !scrollView.isDecelerating) {
+ return;
+ }
+ CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ NSInteger maxCount = round(scrollView.contentSize.width/scrollView.bounds.size.width);
+ NSInteger leftIndex = floorf(ratio);
+ leftIndex = MAX(0, MIN(maxCount - 1, leftIndex));
+ NSInteger rightIndex = leftIndex + 1;
+ if (ratio < 0 || rightIndex >= maxCount) {
+ [self listDidAppearOrDisappear:scrollView];
+ return;
+ }
+ CGFloat remainderRatio = ratio - leftIndex;
+ if (rightIndex == self.currentIndex) {
+ //当前选中的在右边,用户正在从右边往左边滑动
+ if (self.validListDict[@(leftIndex)] == nil && remainderRatio < (1 - self.initListPercent)) {
+ [self initListIfNeededAtIndex:leftIndex];
+ }else if (self.validListDict[@(leftIndex)] != nil) {
+ if (self.willAppearIndex == -1) {
+ self.willAppearIndex = leftIndex;
+ [self listWillAppear:self.willAppearIndex];
+ }
+ }
+ if (self.willDisappearIndex == -1) {
+ self.willDisappearIndex = rightIndex;
+ [self listWillDisappear:self.willDisappearIndex];
+ }
+ }else {
+ //当前选中的在左边,用户正在从左边往右边滑动
+ if (self.validListDict[@(rightIndex)] == nil && remainderRatio > self.initListPercent) {
+ [self initListIfNeededAtIndex:rightIndex];
+ }else if (self.validListDict[@(rightIndex)] != nil) {
+ if (self.willAppearIndex == -1) {
+ self.willAppearIndex = rightIndex;
+ [self listWillAppear:self.willAppearIndex];
+ }
+ }
+ if (self.willDisappearIndex == -1) {
+ self.willDisappearIndex = leftIndex;
+ [self listWillDisappear:self.willDisappearIndex];
+ }
+ }
+ [self listDidAppearOrDisappear:scrollView];
+}
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
+ //滑动到一半又取消滑动处理
+ if (self.willDisappearIndex != -1) {
+ [self listWillAppear:self.willDisappearIndex];
+ [self listWillDisappear:self.willAppearIndex];
+ [self listDidAppear:self.willDisappearIndex];
+ [self listDidDisappear:self.willAppearIndex];
+ self.willDisappearIndex = -1;
+ self.willAppearIndex = -1;
+ }
+
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewDidEndDecelerating:)]) {
+ [self.delegate listContainerViewDidEndDecelerating:scrollView];
+ }
+}
+
+- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
+{
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewWillBeginDragging:)]) {
+ [self.delegate listContainerViewWillBeginDragging:scrollView];
+ }
+}
+
+- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
+{
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewDidEndDragging:willDecelerate:)]) {
+ [self.delegate listContainerViewDidEndDragging:scrollView willDecelerate:decelerate];
+ }
+}
+
+- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
+{
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewWillBeginDecelerating:)]) {
+ [self.delegate listContainerViewWillBeginDecelerating:scrollView];
+ }
+}
+
+#pragma mark - JXCategoryViewListContainer
+
+- (UIScrollView *)contentScrollView {
+ return self.scrollView;
+}
+
+- (void)setDefaultSelectedIndex:(NSInteger)index {
+ self.currentIndex = index;
+}
+
+- (void)didClickSelectedItemAtIndex:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ self.willAppearIndex = -1;
+ self.willDisappearIndex = -1;
+ if (self.currentIndex != index) {
+ [self listWillDisappear:self.currentIndex];
+ [self listDidDisappear:self.currentIndex];
+ [self listWillAppear:index];
+ [self listDidAppear:index];
+ }
+}
+
+- (void)reloadData {
+ for (id list in _validListDict.allValues) {
+ [[list listView] removeFromSuperview];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [(UIViewController *)list removeFromParentViewController];
+ }
+ }
+ [_validListDict removeAllObjects];
+
+ if (self.containerType == JXCategoryListContainerType_ScrollView) {
+ self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width*[self.delegate numberOfListsInlistContainerView:self], self.scrollView.bounds.size.height);
+ }else {
+ [self.collectionView reloadData];
+ }
+ [self listWillAppear:self.currentIndex];
+ [self listDidAppear:self.currentIndex];
+}
+
+#pragma mark - Private
+
+- (void)initListIfNeededAtIndex:(NSInteger)index {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerView:canInitListAtIndex:)]) {
+ BOOL canInitList = [self.delegate listContainerView:self canInitListAtIndex:index];
+ if (!canInitList) {
+ return;
+ }
+ }
+ id list = _validListDict[@(index)];
+ if (list != nil) {
+ //列表已经创建好了
+ return;
+ }
+ list = [self.delegate listContainerView:self initListForIndex:index];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [self.containerVC addChildViewController:(UIViewController *)list];
+ }
+ _validListDict[@(index)] = list;
+
+ if (self.containerType == JXCategoryListContainerType_ScrollView) {
+ [list listView].frame = CGRectMake(index*self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
+ [self.scrollView addSubview:[list listView]];
+ [RTLManager horizontalFlipViewIfNeeded:[list listView]];
+ }else {
+ UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
+ for (UIView *subview in cell.contentView.subviews) {
+ [subview removeFromSuperview];
+ }
+ [list listView].frame = cell.contentView.bounds;
+ [cell.contentView addSubview:[list listView]];
+ }
+}
+
+- (void)listWillAppear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ id list = _validListDict[@(index)];
+ if (list == nil) {
+ //当前列表未被创建(页面初始化或通过点击触发的listWillAppear)
+ BOOL canInitList = YES;
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerView:canInitListAtIndex:)]) {
+ canInitList = [self.delegate listContainerView:self canInitListAtIndex:index];
+ }
+ if (!canInitList) {
+ return;
+ }
+ list = [self.delegate listContainerView:self initListForIndex:index];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [self.containerVC addChildViewController:(UIViewController *)list];
+ }
+ _validListDict[@(index)] = list;
+ if (self.containerType == JXCategoryListContainerType_ScrollView) {
+ if ([list listView].superview == nil) {
+ [list listView].frame = CGRectMake(index*self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
+ [self.scrollView addSubview:[list listView]];
+ [RTLManager horizontalFlipViewIfNeeded:[list listView]];
+ }
+ }else {
+ UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
+ for (UIView *subview in cell.contentView.subviews) {
+ [subview removeFromSuperview];
+ }
+ [list listView].frame = cell.contentView.bounds;
+ [cell.contentView addSubview:[list listView]];
+ }
+ }
+
+ if (list && [list respondsToSelector:@selector(listWillAppear)]) {
+ [list listWillAppear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC beginAppearanceTransition:YES animated:NO];
+ }
+}
+
+- (void)listDidAppear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ self.currentIndex = index;
+ id list = _validListDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listDidAppear)]) {
+ [list listDidAppear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC endAppearanceTransition];
+ }
+}
+
+- (void)listWillDisappear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ id list = _validListDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listWillDisappear)]) {
+ [list listWillDisappear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC beginAppearanceTransition:NO animated:NO];
+ }
+}
+
+- (void)listDidDisappear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ id list = _validListDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listDidDisappear)]) {
+ [list listDidDisappear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC endAppearanceTransition];
+ }
+}
+
+- (BOOL)checkIndexValid:(NSInteger)index {
+ NSUInteger count = [self.delegate numberOfListsInlistContainerView:self];
+ if (count <= 0 || index >= count) {
+ return NO;
+ }
+ return YES;
+}
+
+- (void)listDidAppearOrDisappear:(UIScrollView *)scrollView {
+ CGFloat currentIndexPercent = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ if (self.willAppearIndex != -1 || self.willDisappearIndex != -1) {
+ NSInteger disappearIndex = self.willDisappearIndex;
+ NSInteger appearIndex = self.willAppearIndex;
+ if (self.willAppearIndex > self.willDisappearIndex) {
+ //将要出现的列表在右边
+ if (currentIndexPercent >= self.willAppearIndex) {
+ self.willDisappearIndex = -1;
+ self.willAppearIndex = -1;
+ [self listDidDisappear:disappearIndex];
+ [self listDidAppear:appearIndex];
+ }
+ }else {
+ //将要出现的列表在左边
+ if (currentIndexPercent <= self.willAppearIndex) {
+ self.willDisappearIndex = -1;
+ self.willAppearIndex = -1;
+ [self listDidDisappear:disappearIndex];
+ [self listDidAppear:appearIndex];
+ }
+ }
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryViewAnimator.h b/Pods/JXCategoryView/Sources/Common/JXCategoryViewAnimator.h
new file mode 100644
index 0000000..2c7acae
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryViewAnimator.h
@@ -0,0 +1,24 @@
+//
+// JXCategoryViewAnimator.h
+// JXCategoryView
+//
+// Created by jiaxin on 2019/1/24.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import
+#import
+
+@interface JXCategoryViewAnimator : NSObject
+
+@property (nonatomic, assign) NSTimeInterval duration;
+@property (nonatomic, copy) void(^progressCallback)(CGFloat percent);
+@property (nonatomic, copy) void(^completeCallback)(void);
+@property (readonly, getter=isExecuting) BOOL executing;
+
+- (void)start;
+- (void)stop;
+- (void)invalid;
+
+@end
+
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryViewAnimator.m b/Pods/JXCategoryView/Sources/Common/JXCategoryViewAnimator.m
new file mode 100644
index 0000000..fc26144
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryViewAnimator.m
@@ -0,0 +1,75 @@
+//
+// JXCategoryViewAnimator.m
+// JXCategoryView
+//
+// Created by jiaxin on 2019/1/24.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryViewAnimator.h"
+
+@interface JXCategoryViewAnimator ()
+@property (nonatomic, strong) CADisplayLink *displayLink;
+@property (nonatomic, assign) CFTimeInterval firstTimestamp;
+@property (readwrite, getter=isExecuting) BOOL executing;
+@end
+
+@implementation JXCategoryViewAnimator
+
+#pragma mark - Initialize
+
+- (void)dealloc {
+ self.progressCallback = nil;
+ self.completeCallback = nil;
+}
+
+- (instancetype)init {
+ self = [super init];
+ if (self) {
+ _executing = NO;
+ _duration = 0.25;
+ _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(processDisplayLink:)];
+ }
+ return self;
+}
+
+#pragma mark - Public
+
+- (void)start {
+ [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
+ self.executing = YES;
+}
+
+- (void)stop {
+ !self.progressCallback ?: self.progressCallback(1);
+ [self.displayLink invalidate];
+ !self.completeCallback ?: self.completeCallback();
+ self.executing = NO;
+}
+
+- (void)invalid {
+ [self.displayLink invalidate];
+ !self.completeCallback ?: self.completeCallback();
+ self.executing = NO;
+}
+
+#pragma mark - Actions
+
+- (void)processDisplayLink:(CADisplayLink *)sender {
+ if (self.firstTimestamp == 0) {
+ self.firstTimestamp = sender.timestamp;
+ return;
+ }
+ CGFloat percent = (sender.timestamp - self.firstTimestamp)/self.duration;
+ if (percent >= 1) {
+ !self.progressCallback ?: self.progressCallback(percent);
+ [self.displayLink invalidate];
+ !self.completeCallback ?: self.completeCallback();
+ self.executing = NO;
+ }else {
+ !self.progressCallback ?: self.progressCallback(percent);
+ self.executing = YES;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/JXCategoryViewDefines.h b/Pods/JXCategoryView/Sources/Common/JXCategoryViewDefines.h
new file mode 100644
index 0000000..ec3a60c
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/JXCategoryViewDefines.h
@@ -0,0 +1,43 @@
+//
+// JXCategoryViewDefines.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import
+
+static const CGFloat JXCategoryViewAutomaticDimension = -1;
+
+typedef void(^JXCategoryCellSelectedAnimationBlock)(CGFloat percent);
+
+// 指示器的位置
+typedef NS_ENUM(NSUInteger, JXCategoryComponentPosition) {
+ JXCategoryComponentPosition_Bottom,
+ JXCategoryComponentPosition_Top
+};
+
+// cell 被选中的类型
+typedef NS_ENUM(NSUInteger, JXCategoryCellSelectedType) {
+ JXCategoryCellSelectedTypeUnknown, // 未知,不是选中(cellForRow方法里面、两个cell过渡时)
+ JXCategoryCellSelectedTypeClick, // 点击选中
+ JXCategoryCellSelectedTypeCode, // 调用方法 selectItemAtIndex: 选中
+ JXCategoryCellSelectedTypeScroll // 通过滚动到某个 cell 选中
+};
+
+// cell 标题锚点位置
+typedef NS_ENUM(NSUInteger, JXCategoryTitleLabelAnchorPointStyle) {
+ JXCategoryTitleLabelAnchorPointStyleCenter,
+ JXCategoryTitleLabelAnchorPointStyleTop,
+ JXCategoryTitleLabelAnchorPointStyleBottom
+};
+
+// 指示器滚动样式
+typedef NS_ENUM(NSUInteger, JXCategoryIndicatorScrollStyle) {
+ JXCategoryIndicatorScrollStyleSimple, // 简单滚动,即从当前位置过渡到目标位置
+ JXCategoryIndicatorScrollStyleSameAsUserScroll // 和用户左右滚动列表时的效果一样
+};
+
+#define JXCategoryViewDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)
diff --git a/Pods/JXCategoryView/Sources/Common/UIColor+JXAdd.h b/Pods/JXCategoryView/Sources/Common/UIColor+JXAdd.h
new file mode 100644
index 0000000..06e1c14
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/UIColor+JXAdd.h
@@ -0,0 +1,18 @@
+//
+// UIColor+JXAdd.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/21.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+
+@interface UIColor (JXAdd)
+
+@property (nonatomic, assign, readonly) CGFloat jx_red;
+@property (nonatomic, assign, readonly) CGFloat jx_green;
+@property (nonatomic, assign, readonly) CGFloat jx_blue;
+@property (nonatomic, assign, readonly) CGFloat jx_alpha;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Common/UIColor+JXAdd.m b/Pods/JXCategoryView/Sources/Common/UIColor+JXAdd.m
new file mode 100644
index 0000000..f76c11b
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Common/UIColor+JXAdd.m
@@ -0,0 +1,35 @@
+//
+// UIColor+JXAdd.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/21.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "UIColor+JXAdd.h"
+
+@implementation UIColor (JXAdd)
+
+- (CGFloat)jx_red {
+ CGFloat r = 0, g, b, a;
+ [self getRed:&r green:&g blue:&b alpha:&a];
+ return r;
+}
+
+- (CGFloat)jx_green {
+ CGFloat r, g = 0, b, a;
+ [self getRed:&r green:&g blue:&b alpha:&a];
+ return g;
+}
+
+- (CGFloat)jx_blue {
+ CGFloat r, g, b = 0, a;
+ [self getRed:&r green:&g blue:&b alpha:&a];
+ return b;
+}
+
+- (CGFloat)jx_alpha {
+ return CGColorGetAlpha(self.CGColor);
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCell.h b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCell.h
new file mode 100644
index 0000000..14d3019
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCell.h
@@ -0,0 +1,13 @@
+//
+// JXCategoryDotCell.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCell.h"
+
+@interface JXCategoryDotCell : JXCategoryTitleCell
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCell.m b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCell.m
new file mode 100644
index 0000000..2022acd
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCell.m
@@ -0,0 +1,64 @@
+//
+// JXCategoryDotCell.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryDotCell.h"
+#import "JXCategoryDotCellModel.h"
+
+@interface JXCategoryDotCell ()
+@property (nonatomic, strong) UIView *dot;
+@end
+
+@implementation JXCategoryDotCell
+
+- (void)initializeViews {
+ [super initializeViews];
+
+ _dot = [[UIView alloc] init];
+ [self.contentView addSubview:self.dot];
+ self.dot.translatesAutoresizingMaskIntoConstraints = NO;
+}
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryDotCellModel *myCellModel = (JXCategoryDotCellModel *)cellModel;
+ self.dot.hidden = !myCellModel.dotHidden;
+ self.dot.backgroundColor = myCellModel.dotColor;
+ self.dot.layer.cornerRadius = myCellModel.dotCornerRadius;
+ [NSLayoutConstraint deactivateConstraints:self.dot.constraints];
+ [self.dot.widthAnchor constraintEqualToConstant:myCellModel.dotSize.width].active = YES;
+ [self.dot.heightAnchor constraintEqualToConstant:myCellModel.dotSize.height].active = YES;
+ switch (myCellModel.relativePosition) {
+ case JXCategoryDotRelativePosition_TopLeft:
+ {
+ [self.dot.centerXAnchor constraintEqualToAnchor:self.titleLabel.leadingAnchor constant:myCellModel.dotOffset.x].active = YES;
+ [self.dot.centerYAnchor constraintEqualToAnchor:self.titleLabel.topAnchor constant:myCellModel.dotOffset.y].active = YES;
+ }
+ break;
+ case JXCategoryDotRelativePosition_TopRight:
+ {
+ [self.dot.centerXAnchor constraintEqualToAnchor:self.titleLabel.trailingAnchor constant:myCellModel.dotOffset.x].active = YES;
+ [self.dot.centerYAnchor constraintEqualToAnchor:self.titleLabel.topAnchor constant:myCellModel.dotOffset.y].active = YES;
+ }
+ break;
+ case JXCategoryDotRelativePosition_BottomLeft:
+ {
+ [self.dot.centerXAnchor constraintEqualToAnchor:self.titleLabel.leadingAnchor constant:myCellModel.dotOffset.x].active = YES;
+ [self.dot.centerYAnchor constraintEqualToAnchor:self.titleLabel.bottomAnchor constant:myCellModel.dotOffset.y].active = YES;
+ }
+ break;
+ case JXCategoryDotRelativePosition_BottomRight:
+ {
+ [self.dot.centerXAnchor constraintEqualToAnchor:self.titleLabel.trailingAnchor constant:myCellModel.dotOffset.x].active = YES;
+ [self.dot.centerYAnchor constraintEqualToAnchor:self.titleLabel.bottomAnchor constant:myCellModel.dotOffset.y].active = YES;
+ }
+ break;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCellModel.h b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCellModel.h
new file mode 100644
index 0000000..b0531a9
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCellModel.h
@@ -0,0 +1,27 @@
+//
+// JXCategoryDotCellModel.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCellModel.h"
+
+typedef NS_ENUM(NSUInteger, JXCategoryDotRelativePosition) {
+ JXCategoryDotRelativePosition_TopLeft = 0,
+ JXCategoryDotRelativePosition_TopRight,
+ JXCategoryDotRelativePosition_BottomLeft,
+ JXCategoryDotRelativePosition_BottomRight,
+};
+
+@interface JXCategoryDotCellModel : JXCategoryTitleCellModel
+
+@property (nonatomic, assign) BOOL dotHidden;
+@property (nonatomic, assign) JXCategoryDotRelativePosition relativePosition;
+@property (nonatomic, assign) CGSize dotSize;
+@property (nonatomic, assign) CGFloat dotCornerRadius;
+@property (nonatomic, strong) UIColor *dotColor;
+@property (nonatomic, assign) CGPoint dotOffset;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCellModel.m b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCellModel.m
new file mode 100644
index 0000000..054cbfc
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotCellModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryDotCellModel.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryDotCellModel.h"
+
+@implementation JXCategoryDotCellModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Dot/JXCategoryDotView.h b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotView.h
new file mode 100644
index 0000000..1cc9ad9
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotView.h
@@ -0,0 +1,30 @@
+//
+// JXCategoryDotView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleView.h"
+#import "JXCategoryDotCell.h"
+#import "JXCategoryDotCellModel.h"
+
+@interface JXCategoryDotView : JXCategoryTitleView
+
+//相对于titleLabel的位置,默认:JXCategoryDotRelativePosition_TopRight
+@property (nonatomic, assign) JXCategoryDotRelativePosition relativePosition;
+//@[@(布尔值)]数组,控制红点是否显示
+@property (nonatomic, strong) NSArray *dotStates;
+//红点的尺寸。默认:CGSizeMake(10, 10)
+@property (nonatomic, assign) CGSize dotSize;
+//红点的圆角值。默认:JXCategoryViewAutomaticDimension(self.dotSize.height/2)
+@property (nonatomic, assign) CGFloat dotCornerRadius;
+//红点的颜色。默认:[UIColor redColor]
+@property (nonatomic, strong) UIColor *dotColor;
+/**
+ 红点 x,y方向的偏移 (+值:水平方向向右,竖直方向向下)
+ */
+@property (nonatomic, assign) CGPoint dotOffset;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Dot/JXCategoryDotView.m b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotView.m
new file mode 100644
index 0000000..847aadb
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Dot/JXCategoryDotView.m
@@ -0,0 +1,52 @@
+//
+// JXCategoryDotView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryDotView.h"
+
+@implementation JXCategoryDotView
+
+- (void)initializeData {
+ [super initializeData];
+
+ _relativePosition = JXCategoryDotRelativePosition_TopRight;
+ _dotSize = CGSizeMake(10, 10);
+ _dotCornerRadius = JXCategoryViewAutomaticDimension;
+ _dotColor = [UIColor redColor];
+ _dotOffset = CGPointZero;
+}
+
+- (Class)preferredCellClass {
+ return [JXCategoryDotCell class];
+}
+
+- (void)refreshDataSource {
+ NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:self.titles.count];
+ for (int i = 0; i < self.titles.count; i++) {
+ JXCategoryDotCellModel *cellModel = [[JXCategoryDotCellModel alloc] init];
+ [tempArray addObject:cellModel];
+ }
+ self.dataSource = [NSArray arrayWithArray:tempArray];
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+ [super refreshCellModel:cellModel index:index];
+
+ JXCategoryDotCellModel *myCellModel = (JXCategoryDotCellModel *)cellModel;
+ myCellModel.dotHidden = [self.dotStates[index] boolValue];
+ myCellModel.relativePosition = self.relativePosition;
+ myCellModel.dotSize = self.dotSize;
+ myCellModel.dotColor = self.dotColor;
+ myCellModel.dotOffset = self.dotOffset;
+ if (self.dotCornerRadius == JXCategoryViewAutomaticDimension) {
+ myCellModel.dotCornerRadius = self.dotSize.height/2;
+ }else {
+ myCellModel.dotCornerRadius = self.dotCornerRadius;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Image/JXCategoryImageCell.h b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCell.h
new file mode 100644
index 0000000..f0dc162
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCell.h
@@ -0,0 +1,15 @@
+//
+// JXCategoryImageCell.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorCell.h"
+
+@interface JXCategoryImageCell : JXCategoryIndicatorCell
+
+@property (nonatomic, strong) UIImageView *imageView;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Image/JXCategoryImageCell.m b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCell.m
new file mode 100644
index 0000000..7384759
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCell.m
@@ -0,0 +1,97 @@
+//
+// JXCategoryImageCell.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryImageCell.h"
+#import "JXCategoryImageCellModel.h"
+
+@interface JXCategoryImageCell()
+@property (nonatomic, strong) id currentImageInfo;
+@property (nonatomic, strong) NSString *currentImageName;
+@property (nonatomic, strong) NSURL *currentImageURL;
+@end
+
+@implementation JXCategoryImageCell
+
+- (void)prepareForReuse {
+ [super prepareForReuse];
+
+ self.currentImageInfo = nil;
+ self.currentImageName = nil;
+ self.currentImageURL = nil;
+}
+
+- (void)initializeViews {
+ [super initializeViews];
+
+ _imageView = [[UIImageView alloc] init];
+ _imageView.contentMode = UIViewContentModeScaleAspectFit;
+ [self.contentView addSubview:_imageView];
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ JXCategoryImageCellModel *myCellModel = (JXCategoryImageCellModel *)self.cellModel;
+ self.imageView.bounds = CGRectMake(0, 0, myCellModel.imageSize.width, myCellModel.imageSize.height);
+ self.imageView.center = self.contentView.center;
+ if (myCellModel.imageCornerRadius && (myCellModel.imageCornerRadius != 0)) {
+ self.imageView.layer.cornerRadius = myCellModel.imageCornerRadius;
+ self.imageView.layer.masksToBounds = YES;
+ }
+}
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryImageCellModel *myCellModel = (JXCategoryImageCellModel *)cellModel;
+ //因为`- (void)reloadData:(JXCategoryBaseCellModel *)cellModel`方法会回调多次,尤其是左右滚动的时候会调用无数次,如果每次都触发图片加载,会非常消耗性能。所以只会在图片发生了变化的时候,才进行图片加载。
+ if (myCellModel.loadImageBlock != nil) {
+ id currentImageInfo = myCellModel.imageInfo;
+ if (myCellModel.isSelected) {
+ currentImageInfo = myCellModel.selectedImageInfo;
+ }
+ if (currentImageInfo && ![currentImageInfo isEqual:self.currentImageInfo]) {
+ self.currentImageInfo = currentImageInfo;
+ if (myCellModel.loadImageBlock) {
+ myCellModel.loadImageBlock(self.imageView, currentImageInfo);
+ }
+ }
+ } else {
+ NSString *currentImageName;
+ NSURL *currentImageURL;
+ if (myCellModel.imageName) {
+ currentImageName = myCellModel.imageName;
+ } else if (myCellModel.imageURL) {
+ currentImageURL = myCellModel.imageURL;
+ }
+ if (myCellModel.isSelected) {
+ if (myCellModel.selectedImageName) {
+ currentImageName = myCellModel.selectedImageName;
+ } else if (myCellModel.selectedImageURL) {
+ currentImageURL = myCellModel.selectedImageURL;
+ }
+ }
+ if (currentImageName && ![currentImageName isEqualToString:self.currentImageName]) {
+ self.currentImageName = currentImageName;
+ self.imageView.image = [UIImage imageNamed:currentImageName];
+ } else if (currentImageURL && ![currentImageURL.absoluteString isEqualToString:self.currentImageURL.absoluteString]) {
+ self.currentImageURL = currentImageURL;
+ if (myCellModel.loadImageCallback) {
+ myCellModel.loadImageCallback(self.imageView, currentImageURL);
+ }
+ }
+ }
+
+ if (myCellModel.isImageZoomEnabled) {
+ self.imageView.transform = CGAffineTransformMakeScale(myCellModel.imageZoomScale, myCellModel.imageZoomScale);
+ }else {
+ self.imageView.transform = CGAffineTransformIdentity;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Image/JXCategoryImageCellModel.h b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCellModel.h
new file mode 100644
index 0000000..0d79fdf
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCellModel.h
@@ -0,0 +1,32 @@
+//
+// JXCategoryImageCellModel.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorCellModel.h"
+
+@interface JXCategoryImageCellModel : JXCategoryIndicatorCellModel
+
+@property (nonatomic, strong) id imageInfo;
+@property (nonatomic, strong) id selectedImageInfo;
+@property (nonatomic, copy) void(^loadImageBlock)(UIImageView *imageView, id info);
+
+@property (nonatomic, assign) CGSize imageSize;
+
+@property (nonatomic, assign) CGFloat imageCornerRadius;
+
+@property (nonatomic, assign, getter=isImageZoomEnabled) BOOL imageZoomEnabled;
+
+@property (nonatomic, assign) CGFloat imageZoomScale;
+
+/// 以下属性将会被弃用
+@property (nonatomic, copy) NSString *imageName; //加载bundle内的图片
+@property (nonatomic, strong) NSURL *imageURL; //图片URL
+@property (nonatomic, copy) NSString *selectedImageName;
+@property (nonatomic, strong) NSURL *selectedImageURL;
+@property (nonatomic, copy) void(^loadImageCallback)(UIImageView *imageView, NSURL *imageURL);
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Image/JXCategoryImageCellModel.m b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCellModel.m
new file mode 100644
index 0000000..a7dbec7
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Image/JXCategoryImageCellModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryImageCellModel.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryImageCellModel.h"
+
+@implementation JXCategoryImageCellModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Image/JXCategoryImageView.h b/Pods/JXCategoryView/Sources/Image/JXCategoryImageView.h
new file mode 100644
index 0000000..a4324d6
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Image/JXCategoryImageView.h
@@ -0,0 +1,32 @@
+//
+// JXCategoryImageView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorView.h"
+#import "JXCategoryImageCell.h"
+#import "JXCategoryImageCellModel.h"
+
+@interface JXCategoryImageView : JXCategoryIndicatorView
+
+//imageInfo数组可以传入imageName字符串或者image的URL地址等,然后会通过loadImageBlock透传回来,把imageView对于图片的加载过程完全交给使用者决定。
+@property (nonatomic, strong) NSArray *imageInfoArray;
+@property (nonatomic, strong) NSArray *selectedImageInfoArray;
+@property (nonatomic, copy) void(^loadImageBlock)(UIImageView *imageView, id info);
+
+@property (nonatomic, assign) CGSize imageSize; //默认值为 CGSizeMake(20, 20)
+@property (nonatomic, assign) CGFloat imageCornerRadius; //图片圆角
+@property (nonatomic, assign, getter=isImageZoomEnabled) BOOL imageZoomEnabled; //默认值为 NO
+@property (nonatomic, assign) CGFloat imageZoomScale; //默认值为 1.2,imageZoomEnabled 为 YES 时才生效
+
+//下面的属性将会被弃用,请使用`imageInfoArray`、`selectedImageInfoArray`、`loadImageBlock`属性完成需求。
+@property (nonatomic, strong) NSArray *imageNames;
+@property (nonatomic, strong) NSArray *imageURLs;
+@property (nonatomic, strong) NSArray *selectedImageNames;
+@property (nonatomic, strong) NSArray *selectedImageURLs;
+@property (nonatomic, copy) void(^loadImageCallback)(UIImageView *imageView, NSURL *imageURL); //使用imageURL从远端下载图片进行加载,建议使用SDWebImage等第三方库进行下载。
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Image/JXCategoryImageView.m b/Pods/JXCategoryView/Sources/Image/JXCategoryImageView.m
new file mode 100644
index 0000000..9c39b02
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Image/JXCategoryImageView.m
@@ -0,0 +1,104 @@
+//
+// JXCategoryImageView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/20.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryImageView.h"
+#import "JXCategoryFactory.h"
+
+@implementation JXCategoryImageView
+
+- (void)dealloc {
+ self.loadImageBlock = nil;
+ self.loadImageCallback = nil;
+}
+
+- (void)initializeData {
+ [super initializeData];
+
+ _imageSize = CGSizeMake(20, 20);
+ _imageZoomEnabled = NO;
+ _imageZoomScale = 1.2;
+ _imageCornerRadius = 0;
+}
+
+- (Class)preferredCellClass {
+ return [JXCategoryImageCell class];
+}
+
+- (void)refreshDataSource {
+ NSUInteger count = 0;
+ if (self.imageInfoArray.count > 0) {
+ count = self.imageInfoArray.count;
+ }else if (self.imageNames.count > 0) {
+ count = self.imageNames.count;
+ }else {
+ count = self.imageURLs.count;
+ }
+ NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:count];
+ for (int i = 0; i < count; i++) {
+ JXCategoryImageCellModel *cellModel = [[JXCategoryImageCellModel alloc] init];
+ [tempArray addObject:cellModel];
+ }
+ self.dataSource = [NSArray arrayWithArray:tempArray];
+}
+
+- (void)refreshSelectedCellModel:(JXCategoryBaseCellModel *)selectedCellModel unselectedCellModel:(JXCategoryBaseCellModel *)unselectedCellModel {
+ [super refreshSelectedCellModel:selectedCellModel unselectedCellModel:unselectedCellModel];
+
+ JXCategoryImageCellModel *myUnselectedCellModel = (JXCategoryImageCellModel *)unselectedCellModel;
+ myUnselectedCellModel.imageZoomScale = 1.0;
+
+ JXCategoryImageCellModel *myselectedCellModel = (JXCategoryImageCellModel *)selectedCellModel;
+ myselectedCellModel.imageZoomScale = self.imageZoomScale;
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+ [super refreshCellModel:cellModel index:index];
+
+ JXCategoryImageCellModel *myCellModel = (JXCategoryImageCellModel *)cellModel;
+ myCellModel.loadImageBlock = self.loadImageBlock;
+ myCellModel.loadImageCallback = self.loadImageCallback;
+ myCellModel.imageSize = self.imageSize;
+ myCellModel.imageCornerRadius = self.imageCornerRadius;
+ if (self.imageInfoArray && self.imageInfoArray.count != 0) {
+ myCellModel.imageInfo = self.imageInfoArray[index];
+ }else if (self.imageNames && self.imageNames.count != 0) {
+ myCellModel.imageName = self.imageNames[index];
+ }else if (self.imageURLs && self.imageURLs.count != 0) {
+ myCellModel.imageURL = self.imageURLs[index];
+ }
+ if (self.selectedImageInfoArray && self.selectedImageInfoArray.count != 0) {
+ myCellModel.selectedImageInfo = self.selectedImageInfoArray[index];
+ }else if (self.selectedImageNames && self.selectedImageNames.count != 0) {
+ myCellModel.selectedImageName = self.selectedImageNames[index];
+ }else if (self.selectedImageURLs && self.selectedImageURLs.count != 0) {
+ myCellModel.selectedImageURL = self.selectedImageURLs[index];
+ }
+ myCellModel.imageZoomEnabled = self.imageZoomEnabled;
+ myCellModel.imageZoomScale = ((index == self.selectedIndex) ? self.imageZoomScale : 1.0);
+}
+
+- (void)refreshLeftCellModel:(JXCategoryBaseCellModel *)leftCellModel rightCellModel:(JXCategoryBaseCellModel *)rightCellModel ratio:(CGFloat)ratio {
+ [super refreshLeftCellModel:leftCellModel rightCellModel:rightCellModel ratio:ratio];
+
+ JXCategoryImageCellModel *leftModel = (JXCategoryImageCellModel *)leftCellModel;
+ JXCategoryImageCellModel *rightModel = (JXCategoryImageCellModel *)rightCellModel;
+
+ if (self.isImageZoomEnabled) {
+ leftModel.imageZoomScale = [JXCategoryFactory interpolationFrom:self.imageZoomScale to:1.0 percent:ratio];
+ rightModel.imageZoomScale = [JXCategoryFactory interpolationFrom:1.0 to:self.imageZoomScale percent:ratio];
+ }
+}
+
+- (CGFloat)preferredCellWidthAtIndex:(NSInteger)index {
+ if (self.cellWidth == JXCategoryViewAutomaticDimension) {
+ return self.imageSize.width;
+ }
+ return self.cellWidth;
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBackgroundView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBackgroundView.h
new file mode 100644
index 0000000..e423efb
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBackgroundView.h
@@ -0,0 +1,14 @@
+//
+// JXCategoryIndicatorBackgroundView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+/// BackgroundView 样式的指示器
+@interface JXCategoryIndicatorBackgroundView : JXCategoryIndicatorComponentView
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBackgroundView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBackgroundView.m
new file mode 100644
index 0000000..4f4942f
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBackgroundView.m
@@ -0,0 +1,101 @@
+//
+// JXCategoryIndicatorBackgroundView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorBackgroundView.h"
+#import "JXCategoryFactory.h"
+
+@implementation JXCategoryIndicatorBackgroundView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (void)configureDefaulteValue {
+ self.indicatorWidth = JXCategoryViewAutomaticDimension;
+ self.indicatorHeight = JXCategoryViewAutomaticDimension;
+ self.indicatorCornerRadius = JXCategoryViewAutomaticDimension;
+ self.indicatorColor = [UIColor lightGrayColor];
+ self.indicatorWidthIncrement = 10;
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ self.layer.cornerRadius = [self indicatorCornerRadiusValue:model.selectedCellFrame];
+ self.backgroundColor = self.indicatorColor;
+
+ CGFloat width = [self indicatorWidthValue:model.selectedCellFrame];
+ CGFloat height = [self indicatorHeightValue:model.selectedCellFrame];
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - width)/2;
+ CGFloat y = (model.selectedCellFrame.size.height - height)/2 - self.verticalMargin;
+ self.frame = CGRectMake(x, y, width, height);
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ CGRect rightCellFrame = model.rightCellFrame;
+ CGRect leftCellFrame = model.leftCellFrame;
+ CGFloat percent = model.percent;
+ CGFloat targetX = 0;
+ CGFloat targetWidth = [self indicatorWidthValue:leftCellFrame];
+
+ if (percent == 0) {
+ targetX = leftCellFrame.origin.x + (leftCellFrame.size.width - targetWidth)/2.0;
+ }else {
+ CGFloat leftWidth = targetWidth;
+ CGFloat rightWidth = [self indicatorWidthValue:rightCellFrame];
+
+ CGFloat leftX = leftCellFrame.origin.x + (leftCellFrame.size.width - leftWidth)/2;
+ CGFloat rightX = rightCellFrame.origin.x + (rightCellFrame.size.width - rightWidth)/2;
+
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:percent];
+
+ if (self.indicatorWidth == JXCategoryViewAutomaticDimension) {
+ targetWidth = [JXCategoryFactory interpolationFrom:leftWidth to:rightWidth percent:percent];
+ }
+ }
+
+ //允许变动frame的情况:1、允许滚动;2、不允许滚动,但是已经通过手势滚动切换一页内容了;
+ if (self.isScrollEnabled == YES || (self.isScrollEnabled == NO && percent == 0)) {
+ CGRect toFrame = self.frame;
+ toFrame.origin.x = targetX;
+ toFrame.size.width = targetWidth;
+ self.frame = toFrame;
+ }
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat width = [self indicatorWidthValue:model.selectedCellFrame];
+ CGRect toFrame = self.frame;
+ toFrame.origin.x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - width)/2;
+ toFrame.size.width = width;
+
+ if (self.isScrollEnabled) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
+ self.frame = toFrame;
+ } completion:^(BOOL finished) {
+ }];
+ }else {
+ self.frame = toFrame;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBallView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBallView.h
new file mode 100644
index 0000000..777d8a3
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBallView.h
@@ -0,0 +1,17 @@
+//
+// JXCategoryIndicatorBallView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/21.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+/// QQ 小红点样式的指示器
+@interface JXCategoryIndicatorBallView : JXCategoryIndicatorComponentView
+
+// 球沿的 X 轴方向上的偏移量。默认值为 20
+@property (nonatomic, assign) CGFloat ballScrollOffsetX;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBallView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBallView.m
new file mode 100644
index 0000000..afaeff0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorBallView.m
@@ -0,0 +1,199 @@
+//
+// JXCategoryIndicatorBallView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/21.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorBallView.h"
+#import "JXCategoryFactory.h"
+
+@interface JXCategoryIndicatorBallView ()
+@property (nonatomic, strong) UIView *smallBall;
+@property (nonatomic, strong) UIView *bigBall;
+@property (nonatomic, strong) CAShapeLayer *shapeLayer;
+@end
+
+@implementation JXCategoryIndicatorBallView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self configureIndicatorBall];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self configureIndicatorBall];
+ }
+ return self;
+}
+
+- (void)configureIndicatorBall {
+ self.indicatorWidth = 15;
+ self.indicatorHeight = 15;
+ _ballScrollOffsetX = 20;
+
+ _smallBall = [[UIView alloc] init];
+ [self addSubview:self.smallBall];
+
+ _bigBall = [[UIView alloc] init];
+ [self addSubview:self.bigBall];
+
+ _shapeLayer = [CAShapeLayer layer];
+ [self.layer addSublayer:self.shapeLayer];
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat ballWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ CGFloat ballHeight = [self indicatorHeightValue:model.selectedCellFrame];
+
+ [CATransaction begin];
+ [CATransaction setDisableActions:YES];
+ self.shapeLayer.fillColor = self.indicatorColor.CGColor;
+ [CATransaction commit];
+
+ self.smallBall.backgroundColor = self.indicatorColor;
+ self.smallBall.layer.cornerRadius = ballHeight/2;
+ self.bigBall.backgroundColor = self.indicatorColor;
+ self.bigBall.layer.cornerRadius = ballHeight/2;
+
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - ballWidth)/2;
+ CGFloat y = self.superview.bounds.size.height - ballHeight - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ y = self.verticalMargin;
+ }
+ self.smallBall.frame = CGRectMake(x, y, ballWidth, ballHeight);
+ self.bigBall.frame = CGRectMake(x, y, ballWidth, ballHeight);
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat ballWidth = [self indicatorWidthValue:model.leftCellFrame];
+ CGFloat ballHeight = [self indicatorHeightValue:model.leftCellFrame];
+ CGRect rightCellFrame = model.rightCellFrame;
+ CGRect leftCellFrame = model.leftCellFrame;
+ CGFloat percent = model.percent;
+ CGFloat targetXOfBigBall = 0;
+ CGFloat targetXOfSmallBall = leftCellFrame.origin.x + (leftCellFrame.size.width - ballWidth)/2;
+ CGFloat targetWidthOfSmallBall = ballWidth;
+
+ if (percent == 0) {
+ targetXOfBigBall = leftCellFrame.origin.x + (leftCellFrame.size.width - ballWidth)/2.0;
+ targetXOfSmallBall = leftCellFrame.origin.x + (leftCellFrame.size.width - targetWidthOfSmallBall)/2.0;
+ }else {
+ CGFloat leftX = leftCellFrame.origin.x + (leftCellFrame.size.width - ballWidth)/2;
+ CGFloat rightX = rightCellFrame.origin.x + (rightCellFrame.size.width - ballWidth)/2;
+
+ //前50%,移动bigBall的x,缩小smallBall;后50%,移动bigBall的x,缩小smallBall,移动smallBall的x
+ if (percent <= 0.5) {
+ targetXOfBigBall = [JXCategoryFactory interpolationFrom:leftX to:(rightX - self.ballScrollOffsetX) percent:percent*2];
+ targetWidthOfSmallBall = [JXCategoryFactory interpolationFrom:ballWidth to:ballWidth/2 percent:percent*2];
+ }else {
+ targetXOfBigBall = [JXCategoryFactory interpolationFrom:(rightX - self.ballScrollOffsetX) to:rightX percent:(percent - 0.5)*2];
+ targetWidthOfSmallBall = [JXCategoryFactory interpolationFrom:ballWidth/2 to:0 percent:(percent - 0.5)*2];
+ targetXOfSmallBall = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:(percent - 0.5)*2];
+ }
+ }
+
+ //允许变动frame的情况:1、允许滚动;2、不允许滚动,但是已经通过手势滚动切换一页内容了;
+ if (self.isScrollEnabled == YES || (self.isScrollEnabled == NO && percent == 0)) {
+ CGRect bigBallFrame = self.bigBall.frame;
+ bigBallFrame.origin.x = targetXOfBigBall;
+ self.bigBall.frame = bigBallFrame;
+ self.bigBall.layer.cornerRadius = bigBallFrame.size.height/2;
+
+ CGFloat targetYOfSmallBall = self.superview.bounds.size.height - ballHeight/2 - targetWidthOfSmallBall/2 - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ targetYOfSmallBall = ballHeight/2 - targetWidthOfSmallBall/2 + self.verticalMargin;
+ }
+ self.smallBall.frame = CGRectMake(targetXOfSmallBall, targetYOfSmallBall, targetWidthOfSmallBall, targetWidthOfSmallBall);
+ self.smallBall.layer.cornerRadius = targetWidthOfSmallBall/2;
+
+ [CATransaction begin];
+ [CATransaction setDisableActions:YES];
+ self.shapeLayer.path = [self getBezierPathWithSmallCir:self.smallBall andBigCir:self.bigBall].CGPath;
+ [CATransaction commit];
+ }
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat ballWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ CGFloat ballHeight = [self indicatorHeightValue:model.selectedCellFrame];
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - ballWidth)/2;
+ CGFloat y = self.superview.bounds.size.height - ballHeight - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ y = self.verticalMargin;
+ }
+ CGRect toFrame = CGRectMake(x, y, ballWidth, ballHeight);
+
+ if (self.isScrollEnabled) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
+ self.smallBall.frame = toFrame;
+ self.bigBall.frame = toFrame;
+ self.smallBall.layer.cornerRadius = ballHeight/2;
+ self.bigBall.layer.cornerRadius = ballHeight/2;
+ } completion:^(BOOL finished) {
+
+ }];
+ }else {
+ self.smallBall.frame = toFrame;
+ self.bigBall.frame = toFrame;
+ self.smallBall.layer.cornerRadius = ballHeight/2;
+ self.bigBall.layer.cornerRadius = ballHeight/2;
+ }
+}
+
+- (UIBezierPath *)getBezierPathWithSmallCir:(UIView *)smallCir andBigCir:(UIView *)bigCir{
+ // 获取最小的圆
+ if (bigCir.frame.size.width < smallCir.frame.size.width) {
+ UIView *view = bigCir;
+ bigCir = smallCir;
+ smallCir = view;
+ }
+ // 获取小圆的信息
+ CGFloat d = self.bigBall.center.x - self.smallBall.center.x;
+ if (d == 0) {
+ return nil;
+ }
+ CGFloat x1 = smallCir.center.x;
+ CGFloat y1 = smallCir.center.y;
+ CGFloat r1 = smallCir.bounds.size.width/2;
+
+ // 获取大圆的信息
+ CGFloat x2 = bigCir.center.x;
+ CGFloat y2 = bigCir.center.y;
+ CGFloat r2 = bigCir.bounds.size.width/2;
+
+ // 获取三角函数
+ CGFloat sinA = (y2 - y1)/d;
+ CGFloat cosA = (x2 - x1)/d;
+
+ // 获取矩形四个点
+ CGPoint pointA = CGPointMake(x1 - sinA*r1, y1 + cosA * r1);
+ CGPoint pointB = CGPointMake(x1 + sinA*r1, y1 - cosA * r1);
+ CGPoint pointC = CGPointMake(x2 + sinA*r2, y2 - cosA * r2);
+ CGPoint pointD = CGPointMake(x2 - sinA*r2, y2 + cosA * r2);
+
+ // 获取控制点,以便画出曲线
+ CGPoint pointO = CGPointMake(pointA.x + d / 2 * cosA , pointA.y + d / 2 * sinA);
+ CGPoint pointP = CGPointMake(pointB.x + d / 2 * cosA , pointB.y + d / 2 * sinA);
+
+ // 创建路径
+ UIBezierPath *path =[UIBezierPath bezierPath];
+ [path moveToPoint:pointA];
+ [path addLineToPoint:pointB];
+ [path addQuadCurveToPoint:pointC controlPoint:pointP];
+ [path addLineToPoint:pointD];
+ [path addQuadCurveToPoint:pointA controlPoint:pointO];
+ return path;
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.h
new file mode 100644
index 0000000..6b2906e
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.h
@@ -0,0 +1,113 @@
+//
+// JXCategoryComponentBaseView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXCategoryIndicatorProtocol.h"
+#import "JXCategoryViewDefines.h"
+
+@interface JXCategoryIndicatorComponentView : UIView
+
+/**
+ 指示器的位置
+
+ 可设置的枚举类型:
+ - 底部:JXCategoryComponentPosition_Bottom
+ - 顶部:JXCategoryComponentPosition_Top
+ */
+@property (nonatomic, assign) JXCategoryComponentPosition componentPosition;
+
+/**
+ 指示器的宽度
+
+ 默认值为 JXCategoryViewAutomaticDimension(表示与 cell 的宽度相等)。
+ 内部通过 `- (CGFloat)indicatorWidthValue:(CGRect)cellFrame` 方法获取实际的值。
+ */
+@property (nonatomic, assign) CGFloat indicatorWidth;
+
+/**
+ 指示器的宽度增量
+
+ 例如:需求是指示器宽度比 cell 宽度多 10pt。就可以将该属性赋值为 10。
+ 最终指示器的宽度 = indicatorWidth + indicatorWidthIncrement。
+ */
+@property (nonatomic, assign) CGFloat indicatorWidthIncrement;
+
+/**
+ 指示器的高度
+
+ 默认值为 3。
+ 内部通过 `- (CGFloat)indicatorHeightValue:(CGRect)cellFrame` 方法获取实际的值。
+ */
+@property (nonatomic, assign) CGFloat indicatorHeight;
+
+/**
+ 指示器的 CornerRadius 圆角半径
+
+ 默认值为 JXCategoryViewAutomaticDimension (等于 indicatorHeight/2)。
+ 内部通过 `- (CGFloat)indicatorCornerRadiusValue:(CGRect)cellFrame` 方法获取实际的值。
+ */
+@property (nonatomic, assign) CGFloat indicatorCornerRadius;
+
+/**
+ 指示器的颜色
+ */
+@property (nonatomic, strong) UIColor *indicatorColor;
+
+/**
+ 指示器在垂直方向上的偏移量
+
+ 数值越大越靠近中心。默认值为 0。
+ */
+@property (nonatomic, assign) CGFloat verticalMargin;
+
+/**
+ 是否允许手势滚动
+
+ 点击切换的时候,是否允许滚动,默认值为 YES。
+ */
+@property (nonatomic, assign, getter=isScrollEnabled) BOOL scrollEnabled;
+
+/**
+ 指示器滚动样式
+
+ 点击切换的时候,如果允许滚动,分为简单滚动和复杂滚动。
+ 默认值为 JXCategoryIndicatorScrollStyleSimple
+ 目前仅JXCategoryIndicatorLineView、JXCategoryIndicatorDotLineView支持,其他子类暂不支持。
+ */
+@property (nonatomic, assign) JXCategoryIndicatorScrollStyle scrollStyle;
+
+/**
+ 滚动动画的时间,默认值为 0.25s
+ */
+@property (nonatomic, assign) NSTimeInterval scrollAnimationDuration;
+
+/**
+ 传入 cellFrame 获取指示器的最终宽度
+
+ @param cellFrame cellFrame
+ @return 指示器的最终宽度
+ */
+- (CGFloat)indicatorWidthValue:(CGRect)cellFrame;
+
+/**
+ 传入 cellFrame 获取指示器的最终高度
+
+ @param cellFrame cellFrame
+ @return 指示器的最终高度
+ */
+- (CGFloat)indicatorHeightValue:(CGRect)cellFrame;
+
+/**
+ 传入 cellFrame 获取指示器的最终圆角
+
+ @param cellFrame cellFrame
+ @return 指示器的最终圆角
+ */
+- (CGFloat)indicatorCornerRadiusValue:(CGRect)cellFrame;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.m
new file mode 100644
index 0000000..f9111d3
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorComponentView.m
@@ -0,0 +1,81 @@
+//
+// JXCategoryComponentBaseView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+@implementation JXCategoryIndicatorComponentView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self configureDefaultValue];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self configureDefaultValue];
+ }
+ return self;
+}
+
+- (void)configureDefaultValue {
+ _componentPosition = JXCategoryComponentPosition_Bottom;
+ _scrollEnabled = YES;
+ _verticalMargin = 0;
+ _scrollAnimationDuration = 0.25;
+ _indicatorWidth = JXCategoryViewAutomaticDimension;
+ _indicatorWidthIncrement = 0;
+ _indicatorHeight = 3;
+ _indicatorCornerRadius = JXCategoryViewAutomaticDimension;
+ _indicatorColor = [UIColor redColor];
+ _scrollStyle = JXCategoryIndicatorScrollStyleSimple;
+}
+
+#pragma mark - Public
+
+- (CGFloat)indicatorWidthValue:(CGRect)cellFrame {
+ if (self.indicatorWidth == JXCategoryViewAutomaticDimension) {
+ return cellFrame.size.width + self.indicatorWidthIncrement;
+ }
+ return self.indicatorWidth + self.indicatorWidthIncrement;
+}
+
+- (CGFloat)indicatorHeightValue:(CGRect)cellFrame {
+ if (self.indicatorHeight == JXCategoryViewAutomaticDimension) {
+ return cellFrame.size.height;
+ }
+ return self.indicatorHeight;
+}
+
+- (CGFloat)indicatorCornerRadiusValue:(CGRect)cellFrame {
+ if (self.indicatorCornerRadius == JXCategoryViewAutomaticDimension) {
+ return [self indicatorHeightValue:cellFrame]/2;
+ }
+ return self.indicatorCornerRadius;
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorDotLineView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorDotLineView.h
new file mode 100644
index 0000000..e58bbdb
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorDotLineView.h
@@ -0,0 +1,17 @@
+//
+// JXCategoryIndicatorDotLineView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/22.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+/// 点线效果的指示器
+@interface JXCategoryIndicatorDotLineView : JXCategoryIndicatorComponentView
+
+// 线状态的最大宽度,默认值为 50
+@property (nonatomic, assign) CGFloat lineWidth;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorDotLineView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorDotLineView.m
new file mode 100644
index 0000000..3a680e4
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorDotLineView.m
@@ -0,0 +1,148 @@
+//
+// JXCategoryIndicatorDotLineView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/22.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorDotLineView.h"
+#import "JXCategoryFactory.h"
+#import "JXCategoryViewAnimator.h"
+
+@interface JXCategoryIndicatorDotLineView ()
+@property (nonatomic, strong) JXCategoryViewAnimator *animator;
+@end
+
+@implementation JXCategoryIndicatorDotLineView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (void)configureDefaulteValue {
+ self.indicatorWidth = 10;
+ self.indicatorHeight = 10;
+ _lineWidth = 50;
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat dotWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ CGFloat dotHeight = [self indicatorHeightValue:model.selectedCellFrame];
+ self.backgroundColor = self.indicatorColor;
+ self.layer.cornerRadius = [self indicatorHeightValue:model.selectedCellFrame]/2;
+
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - dotWidth)/2;
+ CGFloat y = self.superview.bounds.size.height - dotHeight - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ y = self.verticalMargin;
+ }
+ self.frame = CGRectMake(x, y, dotWidth, dotHeight);
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ if (self.animator.isExecuting) {
+ [self.animator invalid];
+ self.animator = nil;
+ }
+ CGFloat dotWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ CGRect rightCellFrame = model.rightCellFrame;
+ CGRect leftCellFrame = model.leftCellFrame;
+ CGFloat percent = model.percent;
+ CGFloat targetX = 0;
+ CGFloat targetWidth = dotWidth;
+ CGFloat leftWidth = dotWidth;
+ CGFloat rightWidth = dotWidth;
+ CGFloat leftX = leftCellFrame.origin.x + (leftCellFrame.size.width - leftWidth)/2;
+ CGFloat rightX = rightCellFrame.origin.x + (rightCellFrame.size.width - rightWidth)/2;
+ CGFloat centerX = leftX + (rightX - leftX - self.lineWidth)/2;
+
+ //前50%,移动x,增加宽度;后50%,移动x并减小width
+ if (percent <= 0.5) {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:centerX percent:percent*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:dotWidth to:self.lineWidth percent:percent*2];
+ }else {
+ targetX = [JXCategoryFactory interpolationFrom:centerX to:rightX percent:(percent - 0.5)*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:self.lineWidth to:dotWidth percent:(percent - 0.5)*2];
+ }
+
+ //允许变动frame的情况:1、允许滚动;2、不允许滚动,但是已经通过手势滚动切换一页内容了;
+ if (self.isScrollEnabled == YES || (self.isScrollEnabled == NO && percent == 0)) {
+ CGRect frame = self.frame;
+ frame.origin.x = targetX;
+ frame.size.width = targetWidth;
+ self.frame = frame;
+ }
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat dotWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - dotWidth)/2;
+ CGRect targetIndicatorFrame = self.frame;
+ targetIndicatorFrame.origin.x = x;
+ if (self.isScrollEnabled) {
+ if (self.scrollStyle == JXCategoryIndicatorScrollStyleSameAsUserScroll && (model.selectedType == JXCategoryCellSelectedTypeClick | model.selectedType == JXCategoryCellSelectedTypeCode)) {
+ if (self.animator.isExecuting) {
+ [self.animator invalid];
+ self.animator = nil;
+ }
+ CGFloat leftX = 0;
+ CGFloat rightX = 0;
+ BOOL isNeedReversePercent = NO;
+ if (self.frame.origin.x > model.selectedCellFrame.origin.x) {
+ leftX = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - dotWidth)/2;;
+ rightX = self.frame.origin.x;
+ isNeedReversePercent = YES;
+ }else {
+ leftX = self.frame.origin.x;
+ rightX = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - dotWidth)/2;
+ }
+ CGFloat centerX = leftX + (rightX - leftX - self.lineWidth)/2;
+ __weak typeof(self) weakSelf = self;
+ self.animator = [[JXCategoryViewAnimator alloc] init];
+ self.animator.progressCallback = ^(CGFloat percent) {
+ if (isNeedReversePercent) {
+ percent = 1 - percent;
+ }
+ CGFloat targetX = 0;
+ CGFloat targetWidth = 0;
+ if (percent <= 0.5) {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:centerX percent:percent*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:dotWidth to:self.lineWidth percent:percent*2];
+ }else {
+ targetX = [JXCategoryFactory interpolationFrom:centerX to:rightX percent:(percent - 0.5)*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:self.lineWidth to:dotWidth percent:(percent - 0.5)*2];
+ }
+ CGRect toFrame = weakSelf.frame;
+ toFrame.origin.x = targetX;
+ toFrame.size.width = targetWidth;
+ weakSelf.frame = toFrame;
+ };
+ [self.animator start];
+ }else if (self.scrollStyle == JXCategoryIndicatorScrollStyleSimple) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
+ self.frame = targetIndicatorFrame;
+ } completion: nil];
+ }
+ }else {
+ self.frame = targetIndicatorFrame;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorImageView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorImageView.h
new file mode 100644
index 0000000..04a1738
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorImageView.h
@@ -0,0 +1,20 @@
+//
+// JXCategoryIndicatorImageView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+@interface JXCategoryIndicatorImageView : JXCategoryIndicatorComponentView
+
+// 指示器图片
+@property (nonatomic, strong, readonly) UIImageView *indicatorImageView;
+// 图片是否开启滚动,默认值为 NO
+@property (nonatomic, assign) BOOL indicatorImageViewRollEnabled;
+// 图片的尺寸,默认值为 CGSizeMake(30, 20)
+@property (nonatomic, assign) CGSize indicatorImageViewSize;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorImageView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorImageView.m
new file mode 100644
index 0000000..02dc891
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorImageView.m
@@ -0,0 +1,117 @@
+//
+// JXCategoryIndicatorImageView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorImageView.h"
+#import "JXCategoryFactory.h"
+
+@implementation JXCategoryIndicatorImageView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self setupIndicatorImageView];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self setupIndicatorImageView];
+ }
+ return self;
+}
+
+- (void)setupIndicatorImageView {
+ _indicatorImageViewSize = CGSizeMake(30, 20);
+ _indicatorImageViewRollEnabled = NO;
+
+ _indicatorImageView = [[UIImageView alloc] init];
+ self.indicatorImageView.frame = CGRectMake(0, 0, self.indicatorImageViewSize.width, self.indicatorImageViewSize.height);
+ self.indicatorImageView.contentMode = UIViewContentModeScaleAspectFit;
+ [self addSubview:self.indicatorImageView];
+}
+
+#pragma mark - Custom Accessors
+
+- (void)setIndicatorImageViewSize:(CGSize)indicatorImageViewSize {
+ _indicatorImageViewSize = indicatorImageViewSize;
+
+ self.indicatorImageView.frame = CGRectMake(0, 0, self.indicatorImageViewSize.width, self.indicatorImageViewSize.height);
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - self.indicatorImageViewSize.width)/2;
+ CGFloat y = self.superview.bounds.size.height - self.indicatorImageViewSize.height - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ y = self.verticalMargin;
+ }
+ self.frame = CGRectMake(x, y, self.indicatorImageViewSize.width, self.indicatorImageViewSize.height);
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ CGRect rightCellFrame = model.rightCellFrame;
+ CGRect leftCellFrame = model.leftCellFrame;
+ CGFloat percent = model.percent;
+ CGFloat targetWidth = self.indicatorImageViewSize.width;
+ CGFloat targetX = 0;
+
+ if (percent == 0) {
+ targetX = leftCellFrame.origin.x + (leftCellFrame.size.width - targetWidth)/2.0;
+ }else {
+ CGFloat leftX = leftCellFrame.origin.x + (leftCellFrame.size.width - targetWidth)/2;
+ CGFloat rightX = rightCellFrame.origin.x + (rightCellFrame.size.width - targetWidth)/2;
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:percent];
+ }
+
+ //允许变动frame的情况:1、允许滚动;2、不允许滚动,但是已经通过手势滚动切换一页内容了;
+ if (self.isScrollEnabled == YES || (self.isScrollEnabled == NO && percent == 0)) {
+ CGRect frame = self.frame;
+ frame.origin.x = targetX;
+ self.frame = frame;
+
+ if (self.indicatorImageViewRollEnabled) {
+ self.indicatorImageView.transform = CGAffineTransformMakeRotation(M_PI*2*percent);
+ }
+ }
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ CGRect toFrame = self.frame;
+ toFrame.origin.x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - self.indicatorImageViewSize.width)/2;
+ if (self.isScrollEnabled) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
+ self.frame = toFrame;
+ } completion:^(BOOL finished) {
+ }];
+ if (self.indicatorImageViewRollEnabled && (model.selectedType == JXCategoryCellSelectedTypeCode || model.selectedType == JXCategoryCellSelectedTypeClick)) {
+ [self.indicatorImageView.layer removeAnimationForKey:@"rotate"];
+ CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
+ if (model.selectedIndex > model.lastSelectedIndex) {
+ rotateAnimation.fromValue = @(0);
+ rotateAnimation.toValue = @(M_PI*2);
+ }else {
+ rotateAnimation.fromValue = @(M_PI*2);
+ rotateAnimation.toValue = @(0);
+ }
+ rotateAnimation.fillMode = kCAFillModeBackwards;
+ rotateAnimation.removedOnCompletion = YES;
+ rotateAnimation.duration = 0.25;
+ [self.indicatorImageView.layer addAnimation:rotateAnimation forKey:@"rotate"];
+ }
+ }else {
+ self.frame = toFrame;
+ }
+}
+
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorLineView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorLineView.h
new file mode 100644
index 0000000..54c784a
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorLineView.h
@@ -0,0 +1,28 @@
+//
+// JXCategoryIndicatorLineView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+typedef NS_ENUM(NSUInteger, JXCategoryIndicatorLineStyle) {
+ JXCategoryIndicatorLineStyle_Normal = 0,
+ JXCategoryIndicatorLineStyle_Lengthen = 1,
+ JXCategoryIndicatorLineStyle_LengthenOffset = 2,
+};
+
+@interface JXCategoryIndicatorLineView : JXCategoryIndicatorComponentView
+
+@property (nonatomic, assign) JXCategoryIndicatorLineStyle lineStyle;
+
+/**
+ line 滚动时沿 x 轴方向上的偏移量,默认值为 10。
+
+ lineStyle 为 JXCategoryIndicatorLineStyle_LengthenOffset 有用。
+ */
+@property (nonatomic, assign) CGFloat lineScrollOffsetX;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorLineView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorLineView.m
new file mode 100644
index 0000000..87ffbe6
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorLineView.m
@@ -0,0 +1,202 @@
+//
+// JXCategoryIndicatorLineView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorLineView.h"
+#import "JXCategoryFactory.h"
+#import "JXCategoryViewDefines.h"
+#import "JXCategoryViewAnimator.h"
+
+@interface JXCategoryIndicatorLineView ()
+@property (nonatomic, strong) JXCategoryViewAnimator *animator;
+@end
+
+@implementation JXCategoryIndicatorLineView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (void)configureDefaulteValue {
+ _lineStyle = JXCategoryIndicatorLineStyle_Normal;
+ _lineScrollOffsetX = 10;
+ self.indicatorHeight = 3;
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ self.backgroundColor = self.indicatorColor;
+ self.layer.cornerRadius = [self indicatorCornerRadiusValue:model.selectedCellFrame];
+
+ CGFloat selectedLineWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - selectedLineWidth)/2;
+ CGFloat y = self.superview.bounds.size.height - [self indicatorHeightValue:model.selectedCellFrame] - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ y = self.verticalMargin;
+ }
+ self.frame = CGRectMake(x, y, selectedLineWidth, [self indicatorHeightValue:model.selectedCellFrame]);
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ if (self.animator.isExecuting) {
+ [self.animator invalid];
+ self.animator = nil;
+ }
+ CGRect rightCellFrame = model.rightCellFrame;
+ CGRect leftCellFrame = model.leftCellFrame;
+ CGFloat percent = model.percent;
+ CGFloat targetX = leftCellFrame.origin.x;
+ CGFloat targetWidth = [self indicatorWidthValue:leftCellFrame];
+
+ CGFloat leftWidth = targetWidth;
+ CGFloat rightWidth = [self indicatorWidthValue:rightCellFrame];
+ CGFloat leftX = leftCellFrame.origin.x + (leftCellFrame.size.width - leftWidth)/2;
+ CGFloat rightX = rightCellFrame.origin.x + (rightCellFrame.size.width - rightWidth)/2;
+
+ if (self.lineStyle == JXCategoryIndicatorLineStyle_Normal) {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:percent];
+ if (self.indicatorWidth == JXCategoryViewAutomaticDimension) {
+ targetWidth = [JXCategoryFactory interpolationFrom:leftWidth to:rightWidth percent:percent];
+ }
+ }else if (self.lineStyle == JXCategoryIndicatorLineStyle_Lengthen) {
+ CGFloat maxWidth = rightX - leftX + rightWidth;
+ //前50%,只增加width;后50%,移动x并减小width
+ if (percent <= 0.5) {
+ targetX = leftX;
+ targetWidth = [JXCategoryFactory interpolationFrom:leftWidth to:maxWidth percent:percent*2];
+ }else {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:(percent - 0.5)*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:maxWidth to:rightWidth percent:(percent - 0.5)*2];
+ }
+ }else if (self.lineStyle == JXCategoryIndicatorLineStyle_LengthenOffset) {
+ //前50%,增加width,并少量移动x;后50%,少量移动x并减小width
+ CGFloat offsetX = self.lineScrollOffsetX;//x的少量偏移量
+ CGFloat maxWidth = rightX - leftX + rightWidth - offsetX*2;
+ if (percent <= 0.5) {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:leftX + offsetX percent:percent*2];;
+ targetWidth = [JXCategoryFactory interpolationFrom:leftWidth to:maxWidth percent:percent*2];
+ }else {
+ targetX = [JXCategoryFactory interpolationFrom:(leftX + offsetX) to:rightX percent:(percent - 0.5)*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:maxWidth to:rightWidth percent:(percent - 0.5)*2];
+ }
+ }
+ //允许变动frame的情况:1、允许滚动;2、不允许滚动,但是已经通过手势滚动切换一页内容了;
+ if (self.isScrollEnabled == YES || (self.isScrollEnabled == NO && percent == 0)) {
+ CGRect frame = self.frame;
+ frame.origin.x = targetX;
+ frame.size.width = targetWidth;
+ self.frame = frame;
+ }
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ CGRect targetIndicatorFrame = self.frame;
+ CGFloat targetIndicatorWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ targetIndicatorFrame.origin.x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - targetIndicatorWidth)/2.0;
+ targetIndicatorFrame.size.width = targetIndicatorWidth;
+ if (self.isScrollEnabled) {
+ if (self.scrollStyle == JXCategoryIndicatorScrollStyleSameAsUserScroll && (model.selectedType == JXCategoryCellSelectedTypeClick | model.selectedType == JXCategoryCellSelectedTypeCode)) {
+ if (self.animator.isExecuting) {
+ [self.animator invalid];
+ self.animator = nil;
+ }
+ CGFloat leftX = 0;
+ CGFloat rightX = 0;
+ CGFloat leftWidth = 0;
+ CGFloat rightWidth = 0;
+ BOOL isNeedReversePercent = NO;
+ if (self.frame.origin.x > model.selectedCellFrame.origin.x) {
+ leftWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ rightWidth = self.frame.size.width;
+ leftX = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - leftWidth)/2;;
+ rightX = self.frame.origin.x;
+ isNeedReversePercent = YES;
+ }else {
+ leftWidth = self.frame.size.width;
+ rightWidth = [self indicatorWidthValue:model.selectedCellFrame];
+ leftX = self.frame.origin.x;
+ rightX = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - rightWidth)/2;
+ }
+ __weak typeof(self) weakSelf = self;
+ if (self.lineStyle == JXCategoryIndicatorLineStyle_Normal) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
+ self.frame = targetIndicatorFrame;
+ } completion: nil];
+ }else if (self.lineStyle == JXCategoryIndicatorLineStyle_Lengthen) {
+ CGFloat maxWidth = rightX - leftX + rightWidth;
+ //前50%,只增加width;后50%,移动x并减小width
+ self.animator = [[JXCategoryViewAnimator alloc] init];
+ self.animator.progressCallback = ^(CGFloat percent) {
+ if (isNeedReversePercent) {
+ percent = 1 - percent;
+ }
+ CGFloat targetX = 0;
+ CGFloat targetWidth = 0;
+ if (percent <= 0.5) {
+ targetX = leftX;
+ targetWidth = [JXCategoryFactory interpolationFrom:leftWidth to:maxWidth percent:percent*2];
+ }else {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:(percent - 0.5)*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:maxWidth to:rightWidth percent:(percent - 0.5)*2];
+ }
+ CGRect toFrame = weakSelf.frame;
+ toFrame.origin.x = targetX;
+ toFrame.size.width = targetWidth;
+ weakSelf.frame = toFrame;
+ };
+ [self.animator start];
+ }else if (self.lineStyle == JXCategoryIndicatorLineStyle_LengthenOffset) {
+ //前50%,增加width,并少量移动x;后50%,少量移动x并减小width
+ CGFloat offsetX = self.lineScrollOffsetX;//x的少量偏移量
+ CGFloat maxWidth = rightX - leftX + rightWidth - offsetX*2;
+ self.animator = [[JXCategoryViewAnimator alloc] init];
+ self.animator.progressCallback = ^(CGFloat percent) {
+ if (isNeedReversePercent) {
+ percent = 1 - percent;
+ }
+ CGFloat targetX = 0;
+ CGFloat targetWidth = 0;
+ if (percent <= 0.5) {
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:leftX + offsetX percent:percent*2];;
+ targetWidth = [JXCategoryFactory interpolationFrom:leftWidth to:maxWidth percent:percent*2];
+ }else {
+ targetX = [JXCategoryFactory interpolationFrom:(leftX + offsetX) to:rightX percent:(percent - 0.5)*2];
+ targetWidth = [JXCategoryFactory interpolationFrom:maxWidth to:rightWidth percent:(percent - 0.5)*2];
+ }
+ CGRect toFrame = weakSelf.frame;
+ toFrame.origin.x = targetX;
+ toFrame.size.width = targetWidth;
+ weakSelf.frame = toFrame;
+ };
+ [self.animator start];
+ }
+ }else if (self.scrollStyle == JXCategoryIndicatorScrollStyleSimple) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
+ self.frame = targetIndicatorFrame;
+ } completion: nil];
+ }
+ }else {
+ self.frame = targetIndicatorFrame;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorRainbowLineView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorRainbowLineView.h
new file mode 100644
index 0000000..5fe134e
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorRainbowLineView.h
@@ -0,0 +1,30 @@
+//
+// JXCategoryIndicatorRainbowLineView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/12/13.
+// Copyright © 2018 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorLineView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ 彩虹效果的指示器
+
+ !!!: 会无视 JXCategoryIndicatorLineView 的 indicatorColor 属性,以 indicatorColors 为准。
+ */
+@interface JXCategoryIndicatorRainbowLineView : JXCategoryIndicatorLineView
+
+/**
+ 指示器颜色数组
+
+ 数量需要与 cell 的数量相等。没有提供默认值,必须要赋值该属性。
+ categoryView 在 reloadData 的时候,也要一并更新该属性,不然会出现数组越界。
+ */
+@property (nonatomic, strong) NSArray *indicatorColors;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorRainbowLineView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorRainbowLineView.m
new file mode 100644
index 0000000..9978c8c
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorRainbowLineView.m
@@ -0,0 +1,38 @@
+//
+// JXCategoryIndicatorRainbowLineView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/12/13.
+// Copyright © 2018 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorRainbowLineView.h"
+#import "JXCategoryFactory.h"
+
+@implementation JXCategoryIndicatorRainbowLineView
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ [super jx_refreshState:model];
+
+ UIColor *color = self.indicatorColors[model.selectedIndex];
+ self.backgroundColor = color;
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ [super jx_contentScrollViewDidScroll:model];
+
+ UIColor *leftColor = self.indicatorColors[model.leftIndex];
+ UIColor *rightColor = self.indicatorColors[model.rightIndex];
+ UIColor *color = [JXCategoryFactory interpolationColorFrom:leftColor to:rightColor percent:model.percent];
+ self.backgroundColor = color;
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ [super jx_selectedCell:model];
+
+ UIColor *color = self.indicatorColors[model.selectedIndex];
+ self.backgroundColor = color;
+}
+
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.h b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.h
new file mode 100644
index 0000000..e4dfdb2
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.h
@@ -0,0 +1,14 @@
+//
+// JXCategoryIndicatorTriangleView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorComponentView.h"
+
+/// 三角形样式的指示器
+@interface JXCategoryIndicatorTriangleView : JXCategoryIndicatorComponentView
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.m b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.m
new file mode 100644
index 0000000..96f5ab0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/IndicatorViews/JXCategoryIndicatorTriangleView.m
@@ -0,0 +1,109 @@
+//
+// JXCategoryIndicatorTriangleView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/17.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorTriangleView.h"
+#import "JXCategoryFactory.h"
+
+@interface JXCategoryIndicatorTriangleView ()
+@property (nonatomic, strong) CAShapeLayer *triangleLayer;
+@end
+
+@implementation JXCategoryIndicatorTriangleView
+
+#pragma mark - Initialize
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ [self configureDefaulteValue];
+ }
+ return self;
+}
+
+- (void)configureDefaulteValue {
+ self.indicatorWidth = 14;
+ self.indicatorHeight = 10;
+
+ _triangleLayer = [CAShapeLayer layer];
+ [self.layer addSublayer:self.triangleLayer];
+}
+
+#pragma mark - JXCategoryIndicatorProtocol
+
+- (void)jx_refreshState:(JXCategoryIndicatorParamsModel *)model {
+ CGFloat x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - [self indicatorWidthValue:model.selectedCellFrame])/2;
+ CGFloat y = self.superview.bounds.size.height - [self indicatorHeightValue:model.selectedCellFrame] - self.verticalMargin;
+ if (self.componentPosition == JXCategoryComponentPosition_Top) {
+ y = self.verticalMargin;
+ }
+ self.frame = CGRectMake(x, y, [self indicatorWidthValue:model.selectedCellFrame], [self indicatorHeightValue:model.selectedCellFrame]);
+
+ [CATransaction begin];
+ [CATransaction setDisableActions:NO];
+ self.triangleLayer.fillColor = self.indicatorColor.CGColor;
+ self.triangleLayer.frame = self.bounds;
+ UIBezierPath *path = [UIBezierPath bezierPath];
+ if (self.componentPosition == JXCategoryComponentPosition_Bottom) {
+ [path moveToPoint:CGPointMake(self.bounds.size.width/2, 0)];
+ [path addLineToPoint:CGPointMake(0, self.bounds.size.height)];
+ [path addLineToPoint:CGPointMake(self.bounds.size.width, self.bounds.size.height)];
+ } else {
+ [path moveToPoint:CGPointMake(0, 0)];
+ [path addLineToPoint:CGPointMake(self.bounds.size.width, 0)];
+ [path addLineToPoint:CGPointMake(self.bounds.size.width/2, self.bounds.size.height)];
+ }
+ [path closePath];
+ self.triangleLayer.path = path.CGPath;
+ [CATransaction commit];
+}
+
+- (void)jx_contentScrollViewDidScroll:(JXCategoryIndicatorParamsModel *)model {
+ CGRect rightCellFrame = model.rightCellFrame;
+ CGRect leftCellFrame = model.leftCellFrame;
+ CGFloat percent = model.percent;
+ CGFloat targetWidth = [self indicatorWidthValue:model.leftCellFrame];
+ CGFloat targetX = 0;
+
+ if (percent == 0) {
+ targetX = leftCellFrame.origin.x + (leftCellFrame.size.width - targetWidth)/2.0;
+ } else {
+ CGFloat leftX = leftCellFrame.origin.x + (leftCellFrame.size.width - targetWidth)/2;
+ CGFloat rightX = rightCellFrame.origin.x + (rightCellFrame.size.width - targetWidth)/2;
+ targetX = [JXCategoryFactory interpolationFrom:leftX to:rightX percent:percent];
+ }
+
+ //允许变动frame的情况:1、允许滚动;2、不允许滚动,但是已经通过手势滚动切换一页内容了;
+ if (self.isScrollEnabled == YES || (self.isScrollEnabled == NO && percent == 0)) {
+ CGRect frame = self.frame;
+ frame.origin.x = targetX;
+ self.frame = frame;
+ }
+}
+
+- (void)jx_selectedCell:(JXCategoryIndicatorParamsModel *)model {
+ CGRect toFrame = self.frame;
+ toFrame.origin.x = model.selectedCellFrame.origin.x + (model.selectedCellFrame.size.width - [self indicatorWidthValue:model.selectedCellFrame])/2;
+ if (self.isScrollEnabled) {
+ [UIView animateWithDuration:self.scrollAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
+ self.frame = toFrame;
+ } completion:^(BOOL finished) {
+ }];
+ } else {
+ self.frame = toFrame;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCell.h b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCell.h
new file mode 100644
index 0000000..27796d5
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCell.h
@@ -0,0 +1,13 @@
+//
+// JXCategoryComponetCell.h
+// DQGuess
+//
+// Created by jiaxin on 2018/7/25.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryBaseCell.h"
+
+@interface JXCategoryIndicatorCell : JXCategoryBaseCell
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCell.m b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCell.m
new file mode 100644
index 0000000..390701f
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCell.m
@@ -0,0 +1,52 @@
+//
+// JXCategoryComponetCell.m
+// DQGuess
+//
+// Created by jiaxin on 2018/7/25.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryIndicatorCell.h"
+#import "JXCategoryIndicatorCellModel.h"
+
+@interface JXCategoryIndicatorCell ()
+@property (nonatomic, strong) UIView *separatorLine;
+@end
+
+@implementation JXCategoryIndicatorCell
+
+- (void)initializeViews {
+ [super initializeViews];
+
+ self.separatorLine = [[UIView alloc] init];
+ self.separatorLine.hidden = YES;
+ [self.contentView addSubview:self.separatorLine];
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ JXCategoryIndicatorCellModel *model = (JXCategoryIndicatorCellModel *)self.cellModel;
+ CGFloat lineWidth = model.separatorLineSize.width;
+ CGFloat lineHeight = model.separatorLineSize.height;
+
+ self.separatorLine.frame = CGRectMake(self.bounds.size.width - lineWidth + self.cellModel.cellSpacing/2, (self.bounds.size.height - lineHeight)/2.0, lineWidth, lineHeight);
+}
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryIndicatorCellModel *model = (JXCategoryIndicatorCellModel *)cellModel;
+ self.separatorLine.backgroundColor = model.separatorLineColor;
+ self.separatorLine.hidden = !model.isSepratorLineShowEnabled;
+
+ if (model.isCellBackgroundColorGradientEnabled) {
+ if (model.isSelected) {
+ self.contentView.backgroundColor = model.cellBackgroundSelectedColor;
+ }else {
+ self.contentView.backgroundColor = model.cellBackgroundUnselectedColor;
+ }
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCellModel.h b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCellModel.h
new file mode 100644
index 0000000..21effb0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCellModel.h
@@ -0,0 +1,24 @@
+//
+// JXCategoryComponentCellModel.h
+// DQGuess
+//
+// Created by jiaxin on 2018/7/25.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import
+#import "JXCategoryBaseCellModel.h"
+
+@interface JXCategoryIndicatorCellModel : JXCategoryBaseCellModel
+
+@property (nonatomic, assign, getter=isSepratorLineShowEnabled) BOOL sepratorLineShowEnabled;
+@property (nonatomic, strong) UIColor *separatorLineColor;
+@property (nonatomic, assign) CGSize separatorLineSize;
+
+@property (nonatomic, assign) CGRect backgroundViewMaskFrame; // 底部指示器的 frame 转换到 cell 的 frame
+
+@property (nonatomic, assign, getter=isCellBackgroundColorGradientEnabled) BOOL cellBackgroundColorGradientEnabled;
+@property (nonatomic, strong) UIColor *cellBackgroundSelectedColor;
+@property (nonatomic, strong) UIColor *cellBackgroundUnselectedColor;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCellModel.m b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCellModel.m
new file mode 100644
index 0000000..d79d6f4
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorCellModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryComponentCellModel.m
+// DQGuess
+//
+// Created by jiaxin on 2018/7/25.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryIndicatorCellModel.h"
+
+@implementation JXCategoryIndicatorCellModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorView.h b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorView.h
new file mode 100644
index 0000000..a172268
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorView.h
@@ -0,0 +1,48 @@
+//
+// JXCategoryComponentView.h
+// DQGuess
+//
+// Created by jiaxin on 2018/7/25.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryBaseView.h"
+#import "JXCategoryIndicatorCell.h"
+#import "JXCategoryIndicatorCellModel.h"
+#import "JXCategoryIndicatorProtocol.h"
+
+@interface JXCategoryIndicatorView : JXCategoryBaseView
+
+@property (nonatomic, strong) NSArray *> *indicators;
+
+//----------------------ellBackgroundColor-----------------------//
+//cell的背景色是否渐变。默认:NO
+@property (nonatomic, assign, getter=isCellBackgroundColorGradientEnabled) BOOL cellBackgroundColorGradientEnabled;
+//cell普通状态的背景色。默认:[UIColor clearColor]
+@property (nonatomic, strong) UIColor *cellBackgroundUnselectedColor;
+//cell选中状态的背景色。默认:[UIColor grayColor]
+@property (nonatomic, strong) UIColor *cellBackgroundSelectedColor;
+
+//----------------------separatorLine-----------------------//
+//是否显示分割线。默认为NO
+@property (nonatomic, assign, getter=isSeparatorLineShowEnabled) BOOL separatorLineShowEnabled;
+//分割线颜色。默认为[UIColor lightGrayColor]
+@property (nonatomic, strong) UIColor *separatorLineColor;
+//分割线的size。默认为CGSizeMake(1/[UIScreen mainScreen].scale, 20)
+@property (nonatomic, assign) CGSize separatorLineSize;
+
+@end
+
+@interface JXCategoryIndicatorView (UISubclassingIndicatorHooks)
+
+/**
+ 当contentScrollView滚动时候,处理跟随手势的过渡效果。
+ 根据cellModel的左右位置、是否选中、ratio进行过滤数据计算。
+
+ @param leftCellModel 左边的cellModel
+ @param rightCellModel 右边的cellModel
+ @param ratio 从左往右方向计算的百分比
+ */
+- (void)refreshLeftCellModel:(JXCategoryBaseCellModel *)leftCellModel rightCellModel:(JXCategoryBaseCellModel *)rightCellModel ratio:(CGFloat)ratio NS_REQUIRES_SUPER;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorView.m b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorView.m
new file mode 100644
index 0000000..861ccde
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Indicator/JXCategoryIndicatorView.m
@@ -0,0 +1,209 @@
+//
+// JXCategoryIndicatorView.m
+// DQGuess
+//
+// Created by jiaxin on 2018/7/25.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryIndicatorView.h"
+#import "JXCategoryIndicatorBackgroundView.h"
+#import "JXCategoryFactory.h"
+
+@interface JXCategoryIndicatorView()
+
+@end
+
+@implementation JXCategoryIndicatorView
+
+- (void)initializeData {
+ [super initializeData];
+
+ _separatorLineShowEnabled = NO;
+ _separatorLineColor = [UIColor lightGrayColor];
+ _separatorLineSize = CGSizeMake(1/[UIScreen mainScreen].scale, 20);
+ _cellBackgroundColorGradientEnabled = NO;
+ _cellBackgroundUnselectedColor = [UIColor whiteColor];
+ _cellBackgroundSelectedColor = [UIColor lightGrayColor];
+}
+
+- (void)initializeViews {
+ [super initializeViews];
+}
+
+- (void)setIndicators:(NSArray *> *)indicators {
+ _indicators = indicators;
+
+ self.collectionView.indicators = indicators;
+}
+
+- (void)refreshState {
+ [super refreshState];
+
+ CGRect selectedCellFrame = CGRectZero;
+ JXCategoryIndicatorCellModel *selectedCellModel;
+ for (int i = 0; i < self.dataSource.count; i++) {
+ JXCategoryIndicatorCellModel *cellModel = (JXCategoryIndicatorCellModel *)self.dataSource[i];
+ cellModel.sepratorLineShowEnabled = self.isSeparatorLineShowEnabled;
+ cellModel.separatorLineColor = self.separatorLineColor;
+ cellModel.separatorLineSize = self.separatorLineSize;
+ cellModel.backgroundViewMaskFrame = CGRectZero;
+ cellModel.cellBackgroundColorGradientEnabled = self.isCellBackgroundColorGradientEnabled;
+ cellModel.cellBackgroundSelectedColor = self.cellBackgroundSelectedColor;
+ cellModel.cellBackgroundUnselectedColor = self.cellBackgroundUnselectedColor;
+ if (i == self.dataSource.count - 1) {
+ cellModel.sepratorLineShowEnabled = NO;
+ }
+ if (i == self.selectedIndex) {
+ selectedCellModel = cellModel;
+ selectedCellFrame = [self getTargetCellFrame:i];
+ }
+ }
+
+ for (UIView *indicator in self.indicators) {
+ if (self.dataSource.count <= 0) {
+ indicator.hidden = YES;
+ } else {
+ indicator.hidden = NO;
+ JXCategoryIndicatorParamsModel *indicatorParamsModel = [[JXCategoryIndicatorParamsModel alloc] init];
+ indicatorParamsModel.selectedIndex = self.selectedIndex;
+ indicatorParamsModel.selectedCellFrame = selectedCellFrame;
+ [indicator jx_refreshState:indicatorParamsModel];
+
+ if ([indicator isKindOfClass:[JXCategoryIndicatorBackgroundView class]]) {
+ CGRect maskFrame = indicator.frame;
+ maskFrame.origin.x = maskFrame.origin.x - selectedCellFrame.origin.x;
+ selectedCellModel.backgroundViewMaskFrame = maskFrame;
+ }
+ }
+ }
+}
+
+- (void)refreshSelectedCellModel:(JXCategoryBaseCellModel *)selectedCellModel unselectedCellModel:(JXCategoryBaseCellModel *)unselectedCellModel {
+ [super refreshSelectedCellModel:selectedCellModel unselectedCellModel:unselectedCellModel];
+
+ JXCategoryIndicatorCellModel *myUnselectedCellModel = (JXCategoryIndicatorCellModel *)unselectedCellModel;
+ myUnselectedCellModel.backgroundViewMaskFrame = CGRectZero;
+ myUnselectedCellModel.cellBackgroundUnselectedColor = self.cellBackgroundUnselectedColor;
+ myUnselectedCellModel.cellBackgroundSelectedColor = self.cellBackgroundSelectedColor;
+
+ JXCategoryIndicatorCellModel *myselectedCellModel = (JXCategoryIndicatorCellModel *)selectedCellModel;
+ myselectedCellModel.cellBackgroundUnselectedColor = self.cellBackgroundUnselectedColor;
+ myselectedCellModel.cellBackgroundSelectedColor = self.cellBackgroundSelectedColor;
+}
+
+- (void)contentOffsetOfContentScrollViewDidChanged:(CGPoint)contentOffset {
+ [super contentOffsetOfContentScrollViewDidChanged:contentOffset];
+
+ CGFloat ratio = contentOffset.x/self.contentScrollView.bounds.size.width;
+ if (ratio > self.dataSource.count - 1 || ratio < 0) {
+ //超过了边界,不需要处理
+ return;
+ }
+ ratio = MAX(0, MIN(self.dataSource.count - 1, ratio));
+ NSInteger baseIndex = floorf(ratio);
+ if (baseIndex + 1 >= self.dataSource.count) {
+ //右边越界了,不需要处理
+ return;
+ }
+ CGFloat remainderRatio = ratio - baseIndex;
+
+ CGRect leftCellFrame = [self getTargetCellFrame:baseIndex];
+ CGRect rightCellFrame = [self getTargetCellFrame:baseIndex + 1];
+
+ JXCategoryIndicatorParamsModel *indicatorParamsModel = [[JXCategoryIndicatorParamsModel alloc] init];
+ indicatorParamsModel.selectedIndex = self.selectedIndex;
+ indicatorParamsModel.leftIndex = baseIndex;
+ indicatorParamsModel.leftCellFrame = leftCellFrame;
+ indicatorParamsModel.rightIndex = baseIndex + 1;
+ indicatorParamsModel.rightCellFrame = rightCellFrame;
+ indicatorParamsModel.percent = remainderRatio;
+ if (remainderRatio == 0) {
+ for (UIView *indicator in self.indicators) {
+ [indicator jx_contentScrollViewDidScroll:indicatorParamsModel];
+ }
+ } else {
+ JXCategoryIndicatorCellModel *leftCellModel = (JXCategoryIndicatorCellModel *)self.dataSource[baseIndex];
+ leftCellModel.selectedType = JXCategoryCellSelectedTypeUnknown;
+ JXCategoryIndicatorCellModel *rightCellModel = (JXCategoryIndicatorCellModel *)self.dataSource[baseIndex + 1];
+ rightCellModel.selectedType = JXCategoryCellSelectedTypeUnknown;
+ [self refreshLeftCellModel:leftCellModel rightCellModel:rightCellModel ratio:remainderRatio];
+
+ for (UIView *indicator in self.indicators) {
+ [indicator jx_contentScrollViewDidScroll:indicatorParamsModel];
+ if ([indicator isKindOfClass:[JXCategoryIndicatorBackgroundView class]]) {
+ CGRect leftMaskFrame = indicator.frame;
+ leftMaskFrame.origin.x = leftMaskFrame.origin.x - leftCellFrame.origin.x;
+ leftCellModel.backgroundViewMaskFrame = leftMaskFrame;
+
+ CGRect rightMaskFrame = indicator.frame;
+ rightMaskFrame.origin.x = rightMaskFrame.origin.x - rightCellFrame.origin.x;
+ rightCellModel.backgroundViewMaskFrame = rightMaskFrame;
+ }
+ }
+
+ JXCategoryBaseCell *leftCell = (JXCategoryBaseCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:baseIndex inSection:0]];
+ [leftCell reloadData:leftCellModel];
+ JXCategoryBaseCell *rightCell = (JXCategoryBaseCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:baseIndex + 1 inSection:0]];
+ [rightCell reloadData:rightCellModel];
+ }
+}
+
+- (BOOL)selectCellAtIndex:(NSInteger)index selectedType:(JXCategoryCellSelectedType)selectedType {
+ NSInteger lastSelectedIndex = self.selectedIndex;
+ BOOL result = [super selectCellAtIndex:index selectedType:selectedType];
+ if (!result) {
+ return NO;
+ }
+
+ CGRect clickedCellFrame = [self getTargetSelectedCellFrame:index selectedType:selectedType];
+
+ JXCategoryIndicatorCellModel *selectedCellModel = (JXCategoryIndicatorCellModel *)self.dataSource[index];
+ selectedCellModel.selectedType = selectedType;
+ for (UIView *indicator in self.indicators) {
+ JXCategoryIndicatorParamsModel *indicatorParamsModel = [[JXCategoryIndicatorParamsModel alloc] init];
+ indicatorParamsModel.lastSelectedIndex = lastSelectedIndex;
+ indicatorParamsModel.selectedIndex = index;
+ indicatorParamsModel.selectedCellFrame = clickedCellFrame;
+ indicatorParamsModel.selectedType = selectedType;
+ [indicator jx_selectedCell:indicatorParamsModel];
+ if ([indicator isKindOfClass:[JXCategoryIndicatorBackgroundView class]]) {
+ CGRect maskFrame = indicator.frame;
+ maskFrame.origin.x = maskFrame.origin.x - clickedCellFrame.origin.x;
+ selectedCellModel.backgroundViewMaskFrame = maskFrame;
+ }
+ }
+
+ JXCategoryIndicatorCell *selectedCell = (JXCategoryIndicatorCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
+ [selectedCell reloadData:selectedCellModel];
+
+ return YES;
+}
+
+@end
+
+@implementation JXCategoryIndicatorView (UISubclassingIndicatorHooks)
+
+- (void)refreshLeftCellModel:(JXCategoryBaseCellModel *)leftCellModel rightCellModel:(JXCategoryBaseCellModel *)rightCellModel ratio:(CGFloat)ratio {
+ if (self.isCellBackgroundColorGradientEnabled) {
+ //处理cell背景色渐变
+ JXCategoryIndicatorCellModel *leftModel = (JXCategoryIndicatorCellModel *)leftCellModel;
+ JXCategoryIndicatorCellModel *rightModel = (JXCategoryIndicatorCellModel *)rightCellModel;
+ if (leftModel.isSelected) {
+ leftModel.cellBackgroundSelectedColor = [JXCategoryFactory interpolationColorFrom:self.cellBackgroundSelectedColor to:self.cellBackgroundUnselectedColor percent:ratio];
+ leftModel.cellBackgroundUnselectedColor = self.cellBackgroundUnselectedColor;
+ }else {
+ leftModel.cellBackgroundUnselectedColor = [JXCategoryFactory interpolationColorFrom:self.cellBackgroundSelectedColor to:self.cellBackgroundUnselectedColor percent:ratio];
+ leftModel.cellBackgroundSelectedColor = self.cellBackgroundSelectedColor;
+ }
+ if (rightModel.isSelected) {
+ rightModel.cellBackgroundSelectedColor = [JXCategoryFactory interpolationColorFrom:self.cellBackgroundUnselectedColor to:self.cellBackgroundSelectedColor percent:ratio];
+ rightModel.cellBackgroundUnselectedColor = self.cellBackgroundUnselectedColor;
+ }else {
+ rightModel.cellBackgroundUnselectedColor = [JXCategoryFactory interpolationColorFrom:self.cellBackgroundUnselectedColor to:self.cellBackgroundSelectedColor percent:ratio];
+ rightModel.cellBackgroundSelectedColor = self.cellBackgroundSelectedColor;
+ }
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/JXCategoryView.h b/Pods/JXCategoryView/Sources/JXCategoryView.h
new file mode 100644
index 0000000..d90c0cc
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/JXCategoryView.h
@@ -0,0 +1,23 @@
+
+
+#import "JXCategoryBaseView.h"
+#import "JXCategoryIndicatorView.h"
+#import "JXCategoryTitleView.h"
+#import "JXCategoryImageView.h"
+#import "JXCategoryTitleImageView.h"
+#import "JXCategoryNumberView.h"
+#import "JXCategoryDotView.h"
+
+#import "JXCategoryFactory.h"
+#import "JXCategoryIndicatorProtocol.h"
+#import "JXCategoryViewDefines.h"
+#import "JXCategoryListContainerView.h"
+
+#import "JXCategoryIndicatorComponentView.h"
+#import "JXCategoryIndicatorLineView.h"
+#import "JXCategoryIndicatorTriangleView.h"
+#import "JXCategoryIndicatorImageView.h"
+#import "JXCategoryIndicatorBackgroundView.h"
+#import "JXCategoryIndicatorBallView.h"
+#import "JXCategoryIndicatorRainbowLineView.h"
+
diff --git a/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCell.h b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCell.h
new file mode 100644
index 0000000..acbc2db
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCell.h
@@ -0,0 +1,13 @@
+//
+// JXCategoryNumberCell.h
+// DQGuess
+//
+// Created by jiaxin on 2018/4/9.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryTitleCell.h"
+
+@interface JXCategoryNumberCell : JXCategoryTitleCell
+@property (nonatomic, strong) UILabel *numberLabel;
+@end
diff --git a/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCell.m b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCell.m
new file mode 100644
index 0000000..e9bcbd4
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCell.m
@@ -0,0 +1,62 @@
+//
+// JXCategoryNumberCell.m
+// DQGuess
+//
+// Created by jiaxin on 2018/4/9.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryNumberCell.h"
+#import "JXCategoryNumberCellModel.h"
+
+@interface JXCategoryNumberCell ()
+@property (nonatomic, strong) NSLayoutConstraint *numberCenterXConstraint;
+@property (nonatomic, strong) NSLayoutConstraint *numberCenterYConstraint;
+@property (nonatomic, strong) NSLayoutConstraint *numberHeightConstraint;
+@property (nonatomic, strong) NSLayoutConstraint *numberWidthConstraint;
+@end
+
+@implementation JXCategoryNumberCell
+
+- (void)prepareForReuse {
+ [super prepareForReuse];
+
+ self.numberLabel.text = nil;
+}
+
+- (void)initializeViews {
+ [super initializeViews];
+
+ self.numberLabel = [[UILabel alloc] init];
+ self.numberLabel.textAlignment = NSTextAlignmentCenter;
+ self.numberLabel.layer.masksToBounds = YES;
+ [self.contentView addSubview:self.numberLabel];
+ self.numberLabel.translatesAutoresizingMaskIntoConstraints = NO;
+ self.numberCenterXConstraint = [self.numberLabel.centerXAnchor constraintEqualToAnchor:self.titleLabel.trailingAnchor];
+ self.numberCenterYConstraint = [self.numberLabel.centerYAnchor constraintEqualToAnchor:self.titleLabel.topAnchor];
+ self.numberHeightConstraint = [self.numberLabel.heightAnchor constraintEqualToConstant:0];
+ self.numberWidthConstraint = [self.numberLabel.widthAnchor constraintEqualToConstant:0];
+ [NSLayoutConstraint activateConstraints:@[self.numberCenterXConstraint, self.numberCenterYConstraint, self.numberWidthConstraint, self.numberHeightConstraint]];
+}
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryNumberCellModel *myCellModel = (JXCategoryNumberCellModel *)cellModel;
+ self.numberLabel.hidden = (myCellModel.count == 0);
+ self.numberLabel.backgroundColor = myCellModel.numberBackgroundColor;
+ self.numberLabel.font = myCellModel.numberLabelFont;
+ self.numberLabel.textColor = myCellModel.numberTitleColor;
+ self.numberLabel.text = myCellModel.numberString;
+ self.numberLabel.layer.cornerRadius = myCellModel.numberLabelHeight/2.0;
+ self.numberHeightConstraint.constant = myCellModel.numberLabelHeight;
+ self.numberCenterXConstraint.constant = myCellModel.numberLabelOffset.x;
+ self.numberCenterYConstraint.constant = myCellModel.numberLabelOffset.y;
+ if (myCellModel.count < 10 && myCellModel.shouldMakeRoundWhenSingleNumber) {
+ self.numberWidthConstraint.constant = myCellModel.numberLabelHeight;
+ }else {
+ self.numberWidthConstraint.constant = myCellModel.numberStringWidth + myCellModel.numberLabelWidthIncrement;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCellModel.h b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCellModel.h
new file mode 100644
index 0000000..0622a64
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCellModel.h
@@ -0,0 +1,25 @@
+//
+// JXCategoryNumberCellModel.h
+// DQGuess
+//
+// Created by jiaxin on 2018/4/24.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryTitleCellModel.h"
+
+@interface JXCategoryNumberCellModel : JXCategoryTitleCellModel
+
+@property (nonatomic, assign) NSInteger count;
+@property (nonatomic, copy) NSString *numberString;
+@property (nonatomic, assign, readonly) CGFloat numberStringWidth;
+@property (nonatomic, copy) void(^numberStringFormatterBlock)(NSInteger number);
+@property (nonatomic, strong) UIColor *numberBackgroundColor;
+@property (nonatomic, strong) UIColor *numberTitleColor;
+@property (nonatomic, assign) CGFloat numberLabelWidthIncrement;
+@property (nonatomic, assign) CGFloat numberLabelHeight;
+@property (nonatomic, strong) UIFont *numberLabelFont;
+@property (nonatomic, assign) CGPoint numberLabelOffset;
+@property (nonatomic, assign) BOOL shouldMakeRoundWhenSingleNumber;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCellModel.m b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCellModel.m
new file mode 100644
index 0000000..43a940a
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberCellModel.m
@@ -0,0 +1,37 @@
+//
+// JXCategoryNumberCellModel.m
+// DQGuess
+//
+// Created by jiaxin on 2018/4/24.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryNumberCellModel.h"
+
+@implementation JXCategoryNumberCellModel
+
+- (void)setNumberString:(NSString *)numberString {
+ _numberString = numberString;
+
+ [self updateNumberSizeWidthIfNeeded];
+}
+
+- (void)setNumberLabelHeight:(CGFloat)numberLabelHeight {
+ _numberLabelHeight = numberLabelHeight;
+
+ [self updateNumberSizeWidthIfNeeded];
+}
+
+- (void)setNumberLabelFont:(UIFont *)numberLabelFont {
+ _numberLabelFont = numberLabelFont;
+
+ [self updateNumberSizeWidthIfNeeded];
+}
+
+- (void)updateNumberSizeWidthIfNeeded {
+ if (self.numberLabelFont != nil) {
+ _numberStringWidth = [self.numberString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, self.numberLabelHeight) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.numberLabelFont} context:nil].size.width;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Number/JXCategoryNumberView.h b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberView.h
new file mode 100644
index 0000000..af033a4
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberView.h
@@ -0,0 +1,60 @@
+//
+// JXCategoryNumberView.h
+// DQGuess
+//
+// Created by jiaxin on 2018/4/9.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryTitleView.h"
+#import "JXCategoryNumberCell.h"
+#import "JXCategoryNumberCellModel.h"
+
+@interface JXCategoryNumberView : JXCategoryTitleView
+
+/**
+ 需要与titles的count对应
+ */
+@property (nonatomic, strong) NSArray *counts;
+
+/**
+ 内部默认不会格式化数字,直接转成字符串显示。比如业务需要数字超过999显示999+,可以通过该block实现。
+ */
+@property (nonatomic, copy) NSString *(^numberStringFormatterBlock)(NSInteger number);
+
+/**
+ numberLabel的font,默认:[UIFont systemFontOfSize:11]
+ */
+@property (nonatomic, strong) UIFont *numberLabelFont;
+
+/**
+ 数字的背景色,默认:[UIColor colorWithRed:241/255.0 green:147/255.0 blue:95/255.0 alpha:1]
+ */
+@property (nonatomic, strong) UIColor *numberBackgroundColor;
+
+/**
+ 数字的title颜色,默认:[UIColor whiteColor]
+ */
+@property (nonatomic, strong) UIColor *numberTitleColor;
+
+/**
+ numberLabel的宽度补偿,label真实的宽度是文字内容的宽度加上补偿的宽度,默认:10
+ */
+@property (nonatomic, assign) CGFloat numberLabelWidthIncrement;
+
+/**
+ numberLabel的高度,默认:14
+ */
+@property (nonatomic, assign) CGFloat numberLabelHeight;
+
+/**
+ numberLabel x,y方向的偏移 (+值:水平方向向右,竖直方向向下)
+ */
+@property (nonatomic, assign) CGPoint numberLabelOffset;
+
+/**
+当是单一数字时,是否让numberLabel变成圆。即numberLabel的宽度等于高度,cornerRadius等于高度/2。当为true,单一数字时会忽略numberLabelWidthIncrement属性。默认为NO;
+*/
+@property (nonatomic, assign) BOOL shouldMakeRoundWhenSingleNumber;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Number/JXCategoryNumberView.m b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberView.m
new file mode 100644
index 0000000..c7a7b40
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Number/JXCategoryNumberView.m
@@ -0,0 +1,61 @@
+//
+// JXCategoryNumberView.m
+// DQGuess
+//
+// Created by jiaxin on 2018/4/9.
+// Copyright © 2018年 jingbo. All rights reserved.
+//
+
+#import "JXCategoryNumberView.h"
+
+@implementation JXCategoryNumberView
+
+- (void)dealloc {
+ self.numberStringFormatterBlock = nil;
+}
+
+- (void)initializeData {
+ [super initializeData];
+
+ self.cellSpacing = 25;
+ _numberTitleColor = [UIColor whiteColor];
+ _numberBackgroundColor = [UIColor colorWithRed:241/255.0 green:147/255.0 blue:95/255.0 alpha:1];
+ _numberLabelHeight = 14;
+ _numberLabelWidthIncrement = 10;
+ _numberLabelFont = [UIFont systemFontOfSize:11];
+ _shouldMakeRoundWhenSingleNumber = NO;
+}
+
+- (Class)preferredCellClass {
+ return [JXCategoryNumberCell class];
+}
+
+- (void)refreshDataSource {
+ NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:self.titles.count];
+ for (int i = 0; i < self.titles.count; i++) {
+ JXCategoryNumberCellModel *cellModel = [[JXCategoryNumberCellModel alloc] init];
+ [tempArray addObject:cellModel];
+ }
+ self.dataSource = [NSArray arrayWithArray:tempArray];
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+ [super refreshCellModel:cellModel index:index];
+
+ JXCategoryNumberCellModel *myCellModel = (JXCategoryNumberCellModel *)cellModel;
+ myCellModel.count = [self.counts[index] integerValue];
+ if (self.numberStringFormatterBlock != nil) {
+ myCellModel.numberString = self.numberStringFormatterBlock(myCellModel.count);
+ }else {
+ myCellModel.numberString = [NSString stringWithFormat:@"%ld", (long)myCellModel.count];
+ }
+ myCellModel.numberBackgroundColor = self.numberBackgroundColor;
+ myCellModel.numberTitleColor = self.numberTitleColor;
+ myCellModel.numberLabelHeight = self.numberLabelHeight;
+ myCellModel.numberLabelOffset = self.numberLabelOffset;
+ myCellModel.numberLabelWidthIncrement = self.numberLabelWidthIncrement;
+ myCellModel.numberLabelFont = self.numberLabelFont;
+ myCellModel.shouldMakeRoundWhenSingleNumber = self.shouldMakeRoundWhenSingleNumber;
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/PrivacyInfo.xcprivacy b/Pods/JXCategoryView/Sources/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/JXCategoryView/Sources/RLTManager/RTLManager.h b/Pods/JXCategoryView/Sources/RLTManager/RTLManager.h
new file mode 100644
index 0000000..6c0471e
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/RLTManager/RTLManager.h
@@ -0,0 +1,20 @@
+//
+// RTLManager.h
+// JXCategoryView
+//
+// Created by jiaxin on 2020/7/3.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RTLManager : NSObject
+
++ (BOOL)supportRTL;
++ (void)horizontalFlipView:(UIView *)view;
++ (void)horizontalFlipViewIfNeeded:(UIView *)view;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/JXCategoryView/Sources/RLTManager/RTLManager.m b/Pods/JXCategoryView/Sources/RLTManager/RTLManager.m
new file mode 100644
index 0000000..9ce9eab
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/RLTManager/RTLManager.m
@@ -0,0 +1,26 @@
+//
+// RTLManager.m
+// JXCategoryView
+//
+// Created by jiaxin on 2020/7/3.
+//
+
+#import "RTLManager.h"
+
+@implementation RTLManager
+
++ (BOOL)supportRTL {
+ return [UIView userInterfaceLayoutDirectionForSemanticContentAttribute:UIView.appearance.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft;
+}
+
++ (void)horizontalFlipView:(UIView *)view {
+ view.transform = CGAffineTransformMakeScale(-1, 1);
+}
+
++ (void)horizontalFlipViewIfNeeded:(UIView *)view {
+ if ([self supportRTL]) {
+ [self horizontalFlipView:view];
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCell.h b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCell.h
new file mode 100644
index 0000000..8ab54d6
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCell.h
@@ -0,0 +1,27 @@
+//
+// JXCategoryTitleCell.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorCell.h"
+#import "JXCategoryViewDefines.h"
+@class JXCategoryTitleCellModel;
+
+@interface JXCategoryTitleCell : JXCategoryIndicatorCell
+
+@property (nonatomic, strong) UILabel *titleLabel;
+@property (nonatomic, strong) UILabel *maskTitleLabel;
+@property (nonatomic, strong) NSLayoutConstraint *titleLabelCenterX;
+@property (nonatomic, strong) NSLayoutConstraint *titleLabelCenterY;
+@property (nonatomic, strong) NSLayoutConstraint *maskTitleLabelCenterX;
+
+- (JXCategoryCellSelectedAnimationBlock)preferredTitleZoomAnimationBlock:(JXCategoryTitleCellModel *)cellModel baseScale:(CGFloat)baseScale;
+
+- (JXCategoryCellSelectedAnimationBlock)preferredTitleStrokeWidthAnimationBlock:(JXCategoryTitleCellModel *)cellModel attributedString:(NSMutableAttributedString *)attributedString;
+
+- (JXCategoryCellSelectedAnimationBlock)preferredTitleColorAnimationBlock:(JXCategoryTitleCellModel *)cellModel;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCell.m b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCell.m
new file mode 100644
index 0000000..ae2b446
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCell.m
@@ -0,0 +1,240 @@
+//
+// JXCategoryTitleCell.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCell.h"
+#import "JXCategoryTitleCellModel.h"
+#import "JXCategoryFactory.h"
+#import "RTLManager.h"
+
+@interface JXCategoryTitleCell ()
+@property (nonatomic, strong) CALayer *titleMaskLayer;
+@property (nonatomic, strong) CALayer *maskTitleMaskLayer;
+@property (nonatomic, strong) NSLayoutConstraint *maskTitleLabelCenterY;
+@end
+
+@implementation JXCategoryTitleCell
+
+- (void)initializeViews {
+ [super initializeViews];
+
+ self.isAccessibilityElement = true;
+ self.accessibilityTraits = UIAccessibilityTraitButton;
+ _titleLabel = [[UILabel alloc] init];
+ self.titleLabel.clipsToBounds = YES;
+ self.titleLabel.textAlignment = NSTextAlignmentCenter;
+ self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
+ [self.contentView addSubview:self.titleLabel];
+
+ self.titleLabelCenterX = [self.titleLabel.centerXAnchor constraintEqualToAnchor:self.contentView.centerXAnchor constant:0];
+ self.titleLabelCenterY = [self.titleLabel.centerYAnchor constraintEqualToAnchor:self.contentView.centerYAnchor constant:0];
+
+ _titleMaskLayer = [CALayer layer];
+ self.titleMaskLayer.backgroundColor = [UIColor redColor].CGColor;
+
+ _maskTitleLabel = [[UILabel alloc] init];
+ self.maskTitleLabel.hidden = YES;
+ self.maskTitleLabel.translatesAutoresizingMaskIntoConstraints = NO;
+ self.maskTitleLabel.textAlignment = NSTextAlignmentCenter;
+ [self.contentView addSubview:self.maskTitleLabel];
+
+ self.maskTitleLabelCenterX = [self.maskTitleLabel.centerXAnchor constraintEqualToAnchor:self.contentView.centerXAnchor];
+ self.maskTitleLabelCenterY = [self.maskTitleLabel.centerYAnchor constraintEqualToAnchor:self.contentView.centerYAnchor];
+
+ _maskTitleMaskLayer = [CALayer layer];
+ self.maskTitleMaskLayer.backgroundColor = [UIColor redColor].CGColor;
+ self.maskTitleLabel.layer.mask = self.maskTitleMaskLayer;
+
+ [NSLayoutConstraint activateConstraints:@[self.titleLabelCenterX, self.titleLabelCenterY, self.maskTitleLabelCenterX, self.maskTitleLabelCenterY]];
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ JXCategoryTitleCellModel *myCellModel = (JXCategoryTitleCellModel *)self.cellModel;
+ switch (myCellModel.titleLabelAnchorPointStyle) {
+ case JXCategoryTitleLabelAnchorPointStyleCenter: {
+ self.titleLabel.layer.anchorPoint = CGPointMake(0.5, 0.5);
+ self.maskTitleLabel.layer.anchorPoint = CGPointMake(0.5, 0.5);
+ self.titleLabelCenterY.constant = 0 + myCellModel.titleLabelVerticalOffset;
+ break;
+ }
+ case JXCategoryTitleLabelAnchorPointStyleTop: {
+ self.titleLabel.layer.anchorPoint = CGPointMake(0.5, 0);
+ self.maskTitleLabel.layer.anchorPoint = CGPointMake(0.5, 0);
+ CGFloat percent = (myCellModel.titleLabelCurrentZoomScale - myCellModel.titleLabelNormalZoomScale)/(myCellModel.titleLabelSelectedZoomScale - myCellModel.titleLabelNormalZoomScale);
+ self.titleLabelCenterY.constant = -myCellModel.titleHeight/2 - myCellModel.titleLabelVerticalOffset - myCellModel.titleLabelZoomSelectedVerticalOffset*percent;
+ break;
+ }
+ case JXCategoryTitleLabelAnchorPointStyleBottom: {
+ self.titleLabel.layer.anchorPoint = CGPointMake(0.5, 1);
+ self.maskTitleLabel.layer.anchorPoint = CGPointMake(0.5, 1);
+ CGFloat percent = (myCellModel.titleLabelCurrentZoomScale - myCellModel.titleLabelNormalZoomScale)/(myCellModel.titleLabelSelectedZoomScale - myCellModel.titleLabelNormalZoomScale);
+ self.titleLabelCenterY.constant = myCellModel.titleHeight/2 + myCellModel.titleLabelVerticalOffset + myCellModel.titleLabelZoomSelectedVerticalOffset*percent;
+ break;
+ }
+ }
+}
+
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryTitleCellModel *myCellModel = (JXCategoryTitleCellModel *)cellModel;
+ self.accessibilityLabel = myCellModel.title;
+ self.titleLabel.numberOfLines = myCellModel.titleNumberOfLines;
+ self.maskTitleLabel.numberOfLines = myCellModel.titleNumberOfLines;
+
+ if (myCellModel.isTitleLabelZoomEnabled) {
+ //先把font设置为缩放的最大值,再缩小到最小值,最后根据当前的titleLabelZoomScale值,进行缩放更新。这样就能避免transform从小到大时字体模糊
+ UIFont *maxScaleFont = [UIFont fontWithDescriptor:myCellModel.titleFont.fontDescriptor size:myCellModel.titleFont.pointSize*myCellModel.titleLabelSelectedZoomScale];
+ CGFloat baseScale = myCellModel.titleFont.lineHeight/maxScaleFont.lineHeight;
+ if (myCellModel.isSelectedAnimationEnabled && [self checkCanStartSelectedAnimation:myCellModel]) {
+ JXCategoryCellSelectedAnimationBlock block = [self preferredTitleZoomAnimationBlock:myCellModel baseScale:baseScale];
+ [self addSelectedAnimationBlock:block];
+ } else {
+ self.titleLabel.font = maxScaleFont;
+ self.maskTitleLabel.font = maxScaleFont;
+ CGAffineTransform currentTransform = CGAffineTransformMakeScale(baseScale*myCellModel.titleLabelCurrentZoomScale, baseScale*myCellModel.titleLabelCurrentZoomScale);
+ self.titleLabel.transform = currentTransform;
+ self.maskTitleLabel.transform = currentTransform;
+ }
+ } else {
+ if (myCellModel.isSelected) {
+ self.titleLabel.font = myCellModel.titleSelectedFont;
+ self.maskTitleLabel.font = myCellModel.titleSelectedFont;
+ } else {
+ self.titleLabel.font = myCellModel.titleFont;
+ self.maskTitleLabel.font = myCellModel.titleFont;
+ }
+ }
+
+ NSString *titleString = myCellModel.title ? myCellModel.title : @"";
+ NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:titleString];
+ if (myCellModel.isTitleLabelStrokeWidthEnabled) {
+ if (myCellModel.isSelectedAnimationEnabled && [self checkCanStartSelectedAnimation:myCellModel]) {
+ JXCategoryCellSelectedAnimationBlock block = [self preferredTitleStrokeWidthAnimationBlock:myCellModel attributedString:attributedString];
+ [self addSelectedAnimationBlock:block];
+ } else {
+ [attributedString addAttribute:NSStrokeWidthAttributeName value:@(myCellModel.titleLabelCurrentStrokeWidth) range:NSMakeRange(0, titleString.length)];
+ self.titleLabel.attributedText = attributedString;
+ self.maskTitleLabel.attributedText = attributedString;
+ }
+ } else {
+ self.titleLabel.attributedText = attributedString;
+ self.maskTitleLabel.attributedText = attributedString;
+ }
+
+ if (myCellModel.isTitleLabelMaskEnabled) {
+ self.maskTitleLabel.hidden = NO;
+ self.titleLabel.textColor = myCellModel.titleNormalColor;
+ self.maskTitleLabel.textColor = myCellModel.titleSelectedColor;
+ [self.contentView setNeedsLayout];
+ [self.contentView layoutIfNeeded];
+
+ CGRect topMaskframe = myCellModel.backgroundViewMaskFrame;
+ //将相对于cell的backgroundViewMaskFrame转换为相对于maskTitleLabel
+ //使用self.bounds.size.width而不是self.contentView.bounds.size.width。因为某些情况下,会出现self.bounds是正确的,而self.contentView.bounds还是重用前的状态。
+ topMaskframe.origin.y = 0;
+ CGRect bottomMaskFrame = topMaskframe;
+ CGFloat maskStartX = 0;
+ if (self.maskTitleLabel.bounds.size.width >= self.bounds.size.width) {
+ topMaskframe.origin.x -= (self.maskTitleLabel.bounds.size.width -self.bounds.size.width)/2;
+ bottomMaskFrame.size.width = self.maskTitleLabel.bounds.size.width;
+ maskStartX = -(self.maskTitleLabel.bounds.size.width -self.bounds.size.width)/2;
+ } else {
+ bottomMaskFrame.size.width = self.bounds.size.width;
+ topMaskframe.origin.x -= (self.bounds.size.width -self.maskTitleLabel.bounds.size.width)/2;
+ maskStartX = 0;
+ }
+ bottomMaskFrame.origin.x = topMaskframe.origin.x;
+ if (topMaskframe.origin.x > maskStartX) {
+ bottomMaskFrame.origin.x = topMaskframe.origin.x - bottomMaskFrame.size.width;
+ } else {
+ bottomMaskFrame.origin.x = CGRectGetMaxX(topMaskframe);
+ }
+
+ // 适配RTL布局(镜像x值)
+ if ([RTLManager supportRTL]) {
+ topMaskframe.origin.x = self.maskTitleMaskLayer.superlayer.frame.size.width - CGRectGetMaxX(topMaskframe);
+ bottomMaskFrame.origin.x = self.titleMaskLayer.superlayer.frame.size.width - CGRectGetMaxX(bottomMaskFrame);
+ }
+
+ [CATransaction begin];
+ [CATransaction setDisableActions:YES];
+ if (topMaskframe.size.width > 0 && CGRectIntersectsRect(topMaskframe, self.maskTitleLabel.frame)) {
+ self.titleLabel.layer.mask = self.titleMaskLayer;
+ self.maskTitleMaskLayer.frame = topMaskframe;
+ self.titleMaskLayer.frame = bottomMaskFrame;
+ } else {
+ self.maskTitleMaskLayer.frame = topMaskframe;
+ self.titleLabel.layer.mask = nil;
+ }
+ [CATransaction commit];
+ } else {
+ self.maskTitleLabel.hidden = YES;
+ self.titleLabel.layer.mask = nil;
+ if (myCellModel.isSelectedAnimationEnabled && [self checkCanStartSelectedAnimation:myCellModel]) {
+ JXCategoryCellSelectedAnimationBlock block = [self preferredTitleColorAnimationBlock:myCellModel];
+ [self addSelectedAnimationBlock:block];
+ } else {
+ self.titleLabel.textColor = myCellModel.titleCurrentColor;
+ }
+ }
+
+ [self startSelectedAnimationIfNeeded:myCellModel];
+}
+
+#pragma mark - Public
+
+- (JXCategoryCellSelectedAnimationBlock)preferredTitleZoomAnimationBlock:(JXCategoryTitleCellModel *)cellModel baseScale:(CGFloat)baseScale {
+ __weak typeof(self) weakSelf = self;
+ return ^(CGFloat percent) {
+ if (cellModel.isSelected) {
+ //将要选中,scale从小到大插值渐变
+ cellModel.titleLabelCurrentZoomScale = [JXCategoryFactory interpolationFrom:cellModel.titleLabelNormalZoomScale to:cellModel.titleLabelSelectedZoomScale percent:percent];
+ } else {
+ //将要取消选中,scale从大到小插值渐变
+ cellModel.titleLabelCurrentZoomScale = [JXCategoryFactory interpolationFrom:cellModel.titleLabelSelectedZoomScale to:cellModel.titleLabelNormalZoomScale percent:percent];
+ }
+ CGAffineTransform currentTransform = CGAffineTransformMakeScale(baseScale*cellModel.titleLabelCurrentZoomScale, baseScale*cellModel.titleLabelCurrentZoomScale);
+ weakSelf.titleLabel.transform = currentTransform;
+ weakSelf.maskTitleLabel.transform = currentTransform;
+ };
+}
+
+- (JXCategoryCellSelectedAnimationBlock)preferredTitleStrokeWidthAnimationBlock:(JXCategoryTitleCellModel *)cellModel attributedString:(NSMutableAttributedString *)attributedString {
+ __weak typeof(self) weakSelf = self;
+ return ^(CGFloat percent) {
+ if (cellModel.isSelected) {
+ //将要选中,StrokeWidth从小到大插值渐变
+ cellModel.titleLabelCurrentStrokeWidth = [JXCategoryFactory interpolationFrom:cellModel.titleLabelNormalStrokeWidth to:cellModel.titleLabelSelectedStrokeWidth percent:percent];
+ } else {
+ //将要取消选中,StrokeWidth从大到小插值渐变
+ cellModel.titleLabelCurrentStrokeWidth = [JXCategoryFactory interpolationFrom:cellModel.titleLabelSelectedStrokeWidth to:cellModel.titleLabelNormalStrokeWidth percent:percent];
+ }
+ [attributedString addAttribute:NSStrokeWidthAttributeName value:@(cellModel.titleLabelCurrentStrokeWidth) range:NSMakeRange(0, attributedString.string.length)];
+ weakSelf.titleLabel.attributedText = attributedString;
+ weakSelf.maskTitleLabel.attributedText = attributedString;
+ };
+}
+
+- (JXCategoryCellSelectedAnimationBlock)preferredTitleColorAnimationBlock:(JXCategoryTitleCellModel *)cellModel {
+ __weak typeof(self) weakSelf = self;
+ return ^(CGFloat percent) {
+ if (cellModel.isSelected) {
+ //将要选中,textColor从titleNormalColor到titleSelectedColor插值渐变
+ cellModel.titleCurrentColor = [JXCategoryFactory interpolationColorFrom:cellModel.titleNormalColor to:cellModel.titleSelectedColor percent:percent];
+ } else {
+ //将要取消选中,textColor从titleSelectedColor到titleNormalColor插值渐变
+ cellModel.titleCurrentColor = [JXCategoryFactory interpolationColorFrom:cellModel.titleSelectedColor to:cellModel.titleNormalColor percent:percent];
+ }
+ weakSelf.titleLabel.textColor = cellModel.titleCurrentColor;
+ };
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCellModel.h b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCellModel.h
new file mode 100644
index 0000000..ea7a298
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCellModel.h
@@ -0,0 +1,44 @@
+//
+// JXCategoryTitleCellModel.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorCellModel.h"
+#import
+#import "JXCategoryViewDefines.h"
+
+@interface JXCategoryTitleCellModel : JXCategoryIndicatorCellModel
+
+@property (nonatomic, copy) NSString *title;
+
+@property (nonatomic, assign, readonly) CGFloat titleHeight;
+
+@property (nonatomic, assign) NSInteger titleNumberOfLines;
+@property (nonatomic, assign) CGFloat titleLabelVerticalOffset;
+
+@property (nonatomic, strong) UIColor *titleNormalColor;
+@property (nonatomic, strong) UIColor *titleCurrentColor;
+@property (nonatomic, strong) UIColor *titleSelectedColor;
+
+@property (nonatomic, strong) UIFont *titleFont;
+@property (nonatomic, strong) UIFont *titleSelectedFont;
+
+@property (nonatomic, assign, getter=isTitleLabelMaskEnabled) BOOL titleLabelMaskEnabled;
+@property (nonatomic, assign, getter=isTitleLabelZoomEnabled) BOOL titleLabelZoomEnabled;
+
+@property (nonatomic, assign) CGFloat titleLabelNormalZoomScale;
+@property (nonatomic, assign) CGFloat titleLabelCurrentZoomScale;
+@property (nonatomic, assign) CGFloat titleLabelSelectedZoomScale;
+@property (nonatomic, assign) CGFloat titleLabelZoomSelectedVerticalOffset;
+
+@property (nonatomic, assign, getter=isTitleLabelStrokeWidthEnabled) BOOL titleLabelStrokeWidthEnabled;
+@property (nonatomic, assign) CGFloat titleLabelNormalStrokeWidth;
+@property (nonatomic, assign) CGFloat titleLabelCurrentStrokeWidth;
+@property (nonatomic, assign) CGFloat titleLabelSelectedStrokeWidth;
+
+@property (nonatomic, assign) JXCategoryTitleLabelAnchorPointStyle titleLabelAnchorPointStyle;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCellModel.m b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCellModel.m
new file mode 100644
index 0000000..bf0a27c
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleCellModel.m
@@ -0,0 +1,31 @@
+//
+// JXCategoryTitleCellModel.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCellModel.h"
+
+@implementation JXCategoryTitleCellModel
+
+- (void)setTitle:(NSString *)title {
+ _title = title;
+
+ [self updateNumberSizeWidthIfNeeded];
+}
+
+- (void)setTitleFont:(UIFont *)titleFont {
+ _titleFont = titleFont;
+
+ [self updateNumberSizeWidthIfNeeded];
+}
+
+- (void)updateNumberSizeWidthIfNeeded {
+ if (self.titleFont) {
+ _titleHeight = [self.title boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.titleFont} context:nil].size.height;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Title/JXCategoryTitleView.h b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleView.h
new file mode 100644
index 0000000..33af07b
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleView.h
@@ -0,0 +1,63 @@
+//
+// JXCategoryView.h
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryIndicatorView.h"
+#import "JXCategoryTitleCell.h"
+#import "JXCategoryTitleCellModel.h"
+#import "JXCategoryViewDefines.h"
+
+@class JXCategoryTitleView;
+
+@protocol JXCategoryTitleViewDataSource
+@optional
+// 如果将JXCategoryTitleView嵌套进UITableView的cell,每次重用的时候,JXCategoryTitleView进行reloadData时,会重新计算所有的title宽度。所以该应用场景,需要UITableView的cellModel缓存titles的文字宽度,再通过该代理方法返回给JXCategoryTitleView。
+// 如果实现了该方法就以该方法返回的宽度为准,不触发内部默认的文字宽度计算。
+- (CGFloat)categoryTitleView:(JXCategoryTitleView *)titleView widthForTitle:(NSString *)title;
+@end
+
+
+@interface JXCategoryTitleView : JXCategoryIndicatorView
+
+@property (nonatomic, weak) id titleDataSource;
+
+@property (nonatomic, strong) NSArray *titles;
+
+@property (nonatomic, assign) NSInteger titleNumberOfLines; //默认:1
+
+@property (nonatomic, strong) UIColor *titleColor; //默认:[UIColor blackColor]
+
+@property (nonatomic, strong) UIColor *titleSelectedColor; //默认:[UIColor redColor]
+
+@property (nonatomic, strong) UIFont *titleFont; //默认:[UIFont systemFontOfSize:15]
+
+@property (nonatomic, strong) UIFont *titleSelectedFont; //文字被选中的字体。默认:与titleFont一样
+
+@property (nonatomic, assign, getter=isTitleColorGradientEnabled) BOOL titleColorGradientEnabled; //默认:NO,title的颜色是否渐变过渡
+
+@property (nonatomic, assign, getter=isTitleLabelMaskEnabled) BOOL titleLabelMaskEnabled; //默认:NO,titleLabel是否遮罩过滤。
+
+//----------------------titleLabelZoomEnabled-----------------------//
+@property (nonatomic, assign, getter=isTitleLabelZoomEnabled) BOOL titleLabelZoomEnabled; //默认为NO。为YES时titleSelectedFont失效,以titleFont为准。
+
+@property (nonatomic, assign, getter=isTitleLabelZoomScrollGradientEnabled) BOOL titleLabelZoomScrollGradientEnabled; //手势滚动中,是否需要更新状态。默认为YES
+
+@property (nonatomic, assign) CGFloat titleLabelZoomScale; //默认1.2,titleLabelZoomEnabled为YES才生效。是对字号的缩放,比如titleFont的pointSize为10,放大之后字号就是10*1.2=12。
+
+@property (nonatomic, assign) CGFloat titleLabelZoomSelectedVerticalOffset; //titleLabelZoomEnabled设置为YES,会对titleLabel进行transform缩放,当titleLabelZoomScale过大时(比如设置为2),选中的文本被放大之后底部会有很大的空白,从视觉上看就跟其他未选中的文本不在一个水平线上。这个时候就可以用这个值进行调整。
+
+//----------------------titleLabelStrokeWidth-----------------------//
+@property (nonatomic, assign, getter=isTitleLabelStrokeWidthEnabled) BOOL titleLabelStrokeWidthEnabled; //默认:NO
+
+@property (nonatomic, assign) CGFloat titleLabelSelectedStrokeWidth; //默认:-3,用于控制字体的粗细(底层通过NSStrokeWidthAttributeName实现)。使用该属性,务必让titleFont和titleSelectedFont设置为一样的!!!
+
+//----------------------titleLabel缩放中心位置-----------------------//
+@property (nonatomic, assign) CGFloat titleLabelVerticalOffset; //titleLabel锚点垂直方向的位置偏移,数值越大越偏离中心,默认为:0
+
+@property (nonatomic, assign) JXCategoryTitleLabelAnchorPointStyle titleLabelAnchorPointStyle; //titleLabel锚点位置,用于调整titleLabel缩放时的基准位置。默认为:JXCategoryTitleLabelAnchorPointStyleCenter
+
+@end
diff --git a/Pods/JXCategoryView/Sources/Title/JXCategoryTitleView.m b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleView.m
new file mode 100644
index 0000000..ac2d5a0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/Title/JXCategoryTitleView.m
@@ -0,0 +1,164 @@
+//
+// JXCategoryView.m
+// UI系列测试
+//
+// Created by jiaxin on 2018/3/15.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleView.h"
+#import "JXCategoryFactory.h"
+
+@implementation JXCategoryTitleView
+
+- (void)initializeData {
+ [super initializeData];
+
+ _titleNumberOfLines = 1;
+ _titleLabelZoomEnabled = NO;
+ _titleLabelZoomScale = 1.2;
+ _titleColor = [UIColor blackColor];
+ _titleSelectedColor = [UIColor redColor];
+ _titleFont = [UIFont systemFontOfSize:15];
+ _titleColorGradientEnabled = NO;
+ _titleLabelMaskEnabled = NO;
+ _titleLabelZoomScrollGradientEnabled = YES;
+ _titleLabelStrokeWidthEnabled = NO;
+ _titleLabelSelectedStrokeWidth = -3;
+ _titleLabelVerticalOffset = 0;
+ _titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter;
+}
+
+- (UIFont *)titleSelectedFont {
+ if (_titleSelectedFont) {
+ return _titleSelectedFont;
+ }
+ return self.titleFont;
+}
+
+#pragma mark - Override
+
+- (Class)preferredCellClass {
+ return [JXCategoryTitleCell class];
+}
+
+- (void)refreshDataSource {
+ NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:self.titles.count];
+ for (int i = 0; i < self.titles.count; i++) {
+ JXCategoryTitleCellModel *cellModel = [[JXCategoryTitleCellModel alloc] init];
+ [tempArray addObject:cellModel];
+ }
+ self.dataSource = [NSArray arrayWithArray:tempArray];
+}
+
+- (void)refreshSelectedCellModel:(JXCategoryBaseCellModel *)selectedCellModel unselectedCellModel:(JXCategoryBaseCellModel *)unselectedCellModel {
+ [super refreshSelectedCellModel:selectedCellModel unselectedCellModel:unselectedCellModel];
+
+ JXCategoryTitleCellModel *myUnselectedCellModel = (JXCategoryTitleCellModel *)unselectedCellModel;
+ JXCategoryTitleCellModel *myselectedCellModel = (JXCategoryTitleCellModel *)selectedCellModel;
+ if (self.isSelectedAnimationEnabled && (selectedCellModel.selectedType == JXCategoryCellSelectedTypeClick || selectedCellModel.selectedType == JXCategoryCellSelectedTypeCode)) {
+ //开启了动画过渡,且cell在屏幕内,current的属性值会在cell里面进行动画插值更新
+ //1、当unselectedCell在屏幕外的时候,还是需要在这里更新值
+ //2、当selectedCell在屏幕外的时候,还是需要在这里更新值(比如调用selectItemAtIndex方法选中的时候)
+ BOOL isUnselectedCellVisible = NO;
+ BOOL isSelectedCellVisible = NO;
+ NSArray *indexPaths = [self.collectionView indexPathsForVisibleItems];
+ for (NSIndexPath *indexPath in indexPaths) {
+ if (indexPath.item == myUnselectedCellModel.index) {
+ isUnselectedCellVisible = YES;
+ continue;
+ } else if (indexPath.item == myselectedCellModel.index) {
+ isSelectedCellVisible = YES;
+ continue;
+ }
+ }
+ if (!isUnselectedCellVisible) {
+ //但是当unselectedCell在屏幕外时,不会在cell里面通过动画插值更新,在这里直接更新
+ myUnselectedCellModel.titleCurrentColor = myUnselectedCellModel.titleNormalColor;
+ myUnselectedCellModel.titleLabelCurrentZoomScale = myUnselectedCellModel.titleLabelNormalZoomScale;
+ myUnselectedCellModel.titleLabelCurrentStrokeWidth = myUnselectedCellModel.titleLabelNormalStrokeWidth;
+ }
+ if (!isSelectedCellVisible) {
+ //但是当selectedCell在屏幕外时,不会在cell里面通过动画插值更新,在这里直接更新
+ myselectedCellModel.titleCurrentColor = myselectedCellModel.titleSelectedColor;
+ myselectedCellModel.titleLabelCurrentZoomScale = myselectedCellModel.titleLabelSelectedZoomScale;
+ myselectedCellModel.titleLabelCurrentStrokeWidth = myselectedCellModel.titleLabelSelectedStrokeWidth;
+ }
+ } else {
+ //没有开启动画,可以直接更新属性
+ myselectedCellModel.titleCurrentColor = myselectedCellModel.titleSelectedColor;
+ myselectedCellModel.titleLabelCurrentZoomScale = myselectedCellModel.titleLabelSelectedZoomScale;
+ myselectedCellModel.titleLabelCurrentStrokeWidth = myselectedCellModel.titleLabelSelectedStrokeWidth;
+
+ myUnselectedCellModel.titleCurrentColor = myUnselectedCellModel.titleNormalColor;
+ myUnselectedCellModel.titleLabelCurrentZoomScale = myUnselectedCellModel.titleLabelNormalZoomScale;
+ myUnselectedCellModel.titleLabelCurrentStrokeWidth = myUnselectedCellModel.titleLabelNormalStrokeWidth;
+ }
+}
+
+- (void)refreshLeftCellModel:(JXCategoryBaseCellModel *)leftCellModel rightCellModel:(JXCategoryBaseCellModel *)rightCellModel ratio:(CGFloat)ratio {
+ [super refreshLeftCellModel:leftCellModel rightCellModel:rightCellModel ratio:ratio];
+
+ JXCategoryTitleCellModel *leftModel = (JXCategoryTitleCellModel *)leftCellModel;
+ JXCategoryTitleCellModel *rightModel = (JXCategoryTitleCellModel *)rightCellModel;
+
+ if (self.isTitleLabelZoomEnabled && self.isTitleLabelZoomScrollGradientEnabled) {
+ leftModel.titleLabelCurrentZoomScale = [JXCategoryFactory interpolationFrom:self.titleLabelZoomScale to:1.0 percent:ratio];
+ rightModel.titleLabelCurrentZoomScale = [JXCategoryFactory interpolationFrom:1.0 to:self.titleLabelZoomScale percent:ratio];
+ }
+
+ if (self.isTitleLabelStrokeWidthEnabled) {
+ leftModel.titleLabelCurrentStrokeWidth = [JXCategoryFactory interpolationFrom:leftModel.titleLabelSelectedStrokeWidth to:leftModel.titleLabelNormalStrokeWidth percent:ratio];
+ rightModel.titleLabelCurrentStrokeWidth = [JXCategoryFactory interpolationFrom:rightModel.titleLabelNormalStrokeWidth to:rightModel.titleLabelSelectedStrokeWidth percent:ratio];
+ }
+
+ if (self.isTitleColorGradientEnabled) {
+ leftModel.titleCurrentColor = [JXCategoryFactory interpolationColorFrom:self.titleSelectedColor to:self.titleColor percent:ratio];
+ rightModel.titleCurrentColor = [JXCategoryFactory interpolationColorFrom:self.titleColor to:self.titleSelectedColor percent:ratio];
+ }
+}
+
+- (CGFloat)preferredCellWidthAtIndex:(NSInteger)index {
+ if (self.cellWidth == JXCategoryViewAutomaticDimension) {
+ if (self.titleDataSource && [self.titleDataSource respondsToSelector:@selector(categoryTitleView:widthForTitle:)]) {
+ return [self.titleDataSource categoryTitleView:self widthForTitle:self.titles[index]];
+ } else {
+ return ceilf([self.titles[index] boundingRectWithSize:CGSizeMake(MAXFLOAT, self.bounds.size.height) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : self.titleFont} context:nil].size.width);
+ }
+ } else {
+ return self.cellWidth;
+ }
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+ [super refreshCellModel:cellModel index:index];
+
+ JXCategoryTitleCellModel *model = (JXCategoryTitleCellModel *)cellModel;
+ model.title = self.titles[index];
+ model.titleNumberOfLines = self.titleNumberOfLines;
+ model.titleFont = self.titleFont;
+ model.titleSelectedFont = self.titleSelectedFont;
+ model.titleNormalColor = self.titleColor;
+ model.titleSelectedColor = self.titleSelectedColor;
+ model.titleLabelMaskEnabled = self.isTitleLabelMaskEnabled;
+ model.titleLabelZoomEnabled = self.isTitleLabelZoomEnabled;
+ model.titleLabelNormalZoomScale = 1;
+ model.titleLabelZoomSelectedVerticalOffset = self.titleLabelZoomSelectedVerticalOffset;
+ model.titleLabelSelectedZoomScale = self.titleLabelZoomScale;
+ model.titleLabelStrokeWidthEnabled = self.isTitleLabelStrokeWidthEnabled;
+ model.titleLabelNormalStrokeWidth = 0;
+ model.titleLabelSelectedStrokeWidth = self.titleLabelSelectedStrokeWidth;
+ model.titleLabelVerticalOffset = self.titleLabelVerticalOffset;
+ model.titleLabelAnchorPointStyle = self.titleLabelAnchorPointStyle;
+ if (index == self.selectedIndex) {
+ model.titleCurrentColor = model.titleSelectedColor;
+ model.titleLabelCurrentZoomScale = model.titleLabelSelectedZoomScale;
+ model.titleLabelCurrentStrokeWidth= model.titleLabelSelectedStrokeWidth;
+ }else {
+ model.titleCurrentColor = model.titleNormalColor;
+ model.titleLabelCurrentZoomScale = model.titleLabelNormalZoomScale;
+ model.titleLabelCurrentStrokeWidth = model.titleLabelNormalStrokeWidth;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCell.h b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCell.h
new file mode 100644
index 0000000..e430a67
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCell.h
@@ -0,0 +1,15 @@
+//
+// JXCategoryImageCell.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/8.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCell.h"
+
+@interface JXCategoryTitleImageCell : JXCategoryTitleCell
+
+@property (nonatomic, strong) UIImageView *imageView;
+
+@end
diff --git a/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCell.m b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCell.m
new file mode 100644
index 0000000..ae6c39d
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCell.m
@@ -0,0 +1,148 @@
+//
+// JXCategoryImageCell.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/8.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleImageCell.h"
+#import "JXCategoryTitleImageCellModel.h"
+
+@interface JXCategoryTitleImageCell()
+@property (nonatomic, strong) id currentImageInfo;
+@property (nonatomic, strong) NSString *currentImageName;
+@property (nonatomic, strong) NSURL *currentImageURL;
+@property (nonatomic, strong) UIStackView *stackView;
+@property (nonatomic, strong) NSLayoutConstraint *imageViewWidthConstraint;
+@property (nonatomic, strong) NSLayoutConstraint *imageViewHeightConstraint;
+@end
+
+@implementation JXCategoryTitleImageCell
+
+- (void)prepareForReuse {
+ [super prepareForReuse];
+
+ self.currentImageInfo = nil;
+ self.currentImageName = nil;
+ self.currentImageURL = nil;
+}
+
+- (void)initializeViews {
+ [super initializeViews];
+
+ [self.titleLabel removeFromSuperview];
+
+ _imageView = [[UIImageView alloc] init];
+ self.imageView.translatesAutoresizingMaskIntoConstraints = NO;
+ self.imageView.contentMode = UIViewContentModeScaleAspectFit;
+ self.imageViewWidthConstraint = [self.imageView.widthAnchor constraintEqualToConstant:0];
+ self.imageViewWidthConstraint.active = YES;
+ self.imageViewHeightConstraint = [self.imageView.heightAnchor constraintEqualToConstant:0];
+ self.imageViewHeightConstraint.active = YES;
+
+ _stackView = [[UIStackView alloc] init];
+ self.stackView.alignment = UIStackViewAlignmentCenter;
+ [self.contentView addSubview:self.stackView];
+ self.stackView.translatesAutoresizingMaskIntoConstraints = NO;
+ [self.stackView.centerXAnchor constraintEqualToAnchor:self.contentView.centerXAnchor].active = YES;
+ [self.stackView.centerYAnchor constraintEqualToAnchor:self.contentView.centerYAnchor].active = YES;
+}
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryTitleImageCellModel *myCellModel = (JXCategoryTitleImageCellModel *)cellModel;
+
+ self.titleLabel.hidden = NO;
+ self.imageView.hidden = NO;
+ [self.stackView removeArrangedSubview:self.titleLabel];
+ [self.stackView removeArrangedSubview:self.imageView];
+ CGSize imageSize = myCellModel.imageSize;
+ self.imageViewWidthConstraint.constant = imageSize.width;
+ self.imageViewHeightConstraint.constant = imageSize.height;
+ self.stackView.spacing = myCellModel.titleImageSpacing;
+
+ switch (myCellModel.imageType) {
+ case JXCategoryTitleImageType_TopImage: {
+ self.stackView.axis = UILayoutConstraintAxisVertical;
+ [self.stackView addArrangedSubview:self.imageView];
+ [self.stackView addArrangedSubview:self.titleLabel];
+ break;
+ }
+ case JXCategoryTitleImageType_LeftImage: {
+ self.stackView.axis = UILayoutConstraintAxisHorizontal;
+ [self.stackView addArrangedSubview:self.imageView];
+ [self.stackView addArrangedSubview:self.titleLabel];
+ break;
+ }
+ case JXCategoryTitleImageType_BottomImage: {
+ self.stackView.axis = UILayoutConstraintAxisVertical;
+ [self.stackView addArrangedSubview:self.titleLabel];
+ [self.stackView addArrangedSubview:self.imageView];
+ break;
+ }
+ case JXCategoryTitleImageType_RightImage: {
+ self.stackView.axis = UILayoutConstraintAxisHorizontal;
+ [self.stackView addArrangedSubview:self.titleLabel];
+ [self.stackView addArrangedSubview:self.imageView];
+ break;
+ }
+ case JXCategoryTitleImageType_OnlyImage: {
+ self.titleLabel.hidden = YES;
+ [self.stackView addArrangedSubview:self.imageView];
+ break;
+ }
+ case JXCategoryTitleImageType_OnlyTitle: {
+ self.imageView.hidden = YES;
+ [self.stackView addArrangedSubview:self.titleLabel];
+ break;
+ }
+ }
+
+ //因为`- (void)reloadData:(JXCategoryBaseCellModel *)cellModel`方法会回调多次,尤其是左右滚动的时候会调用无数次,如果每次都触发图片加载,会非常消耗性能。所以只会在图片发生了变化的时候,才进行图片加载。
+ if (myCellModel.loadImageBlock != nil) {
+ id currentImageInfo = myCellModel.imageInfo;
+ if (myCellModel.isSelected) {
+ currentImageInfo = myCellModel.selectedImageInfo;
+ }
+ if (currentImageInfo && ![currentImageInfo isEqual:self.currentImageInfo]) {
+ self.currentImageInfo = currentImageInfo;
+ if (myCellModel.loadImageBlock) {
+ myCellModel.loadImageBlock(self.imageView, currentImageInfo);
+ }
+ }
+ }else {
+ NSString *currentImageName;
+ NSURL *currentImageURL;
+ if (myCellModel.imageName) {
+ currentImageName = myCellModel.imageName;
+ } else if (myCellModel.imageURL) {
+ currentImageURL = myCellModel.imageURL;
+ }
+ if (myCellModel.isSelected) {
+ if (myCellModel.selectedImageName) {
+ currentImageName = myCellModel.selectedImageName;
+ } else if (myCellModel.selectedImageURL) {
+ currentImageURL = myCellModel.selectedImageURL;
+ }
+ }
+ if (currentImageName && ![currentImageName isEqualToString:self.currentImageName]) {
+ self.currentImageName = currentImageName;
+ self.imageView.image = [UIImage imageNamed:currentImageName];
+ } else if (currentImageURL && ![currentImageURL.absoluteString isEqualToString:self.currentImageURL.absoluteString]) {
+ self.currentImageURL = currentImageURL;
+ if (myCellModel.loadImageCallback) {
+ myCellModel.loadImageCallback(self.imageView, currentImageURL);
+ }
+ }
+ }
+
+ if (myCellModel.isImageZoomEnabled) {
+ self.imageView.transform = CGAffineTransformMakeScale(myCellModel.imageZoomScale, myCellModel.imageZoomScale);
+ } else {
+ self.imageView.transform = CGAffineTransformIdentity;
+ }
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCellModel.h b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCellModel.h
new file mode 100644
index 0000000..bd0111a
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCellModel.h
@@ -0,0 +1,43 @@
+//
+// JXCategoryTitleImageCellModel.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/8.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCellModel.h"
+
+typedef NS_ENUM(NSUInteger, JXCategoryTitleImageType) {
+ JXCategoryTitleImageType_TopImage = 0,
+ JXCategoryTitleImageType_LeftImage,
+ JXCategoryTitleImageType_BottomImage,
+ JXCategoryTitleImageType_RightImage,
+ JXCategoryTitleImageType_OnlyImage,
+ JXCategoryTitleImageType_OnlyTitle,
+};
+
+@interface JXCategoryTitleImageCellModel : JXCategoryTitleCellModel
+
+@property (nonatomic, assign) JXCategoryTitleImageType imageType;
+
+@property (nonatomic, strong) id imageInfo;
+@property (nonatomic, strong) id selectedImageInfo;
+@property (nonatomic, copy) void(^loadImageBlock)(UIImageView *imageView, id info);
+
+@property (nonatomic, assign) CGSize imageSize; //默认CGSizeMake(20, 20)
+
+@property (nonatomic, assign) CGFloat titleImageSpacing; //titleLabel和ImageView的间距,默认5
+
+@property (nonatomic, assign, getter=isImageZoomEnabled) BOOL imageZoomEnabled;
+
+@property (nonatomic, assign) CGFloat imageZoomScale;
+
+/// 以下属性将会被弃用
+@property (nonatomic, copy) NSString *imageName; //加载bundle内的图片
+@property (nonatomic, strong) NSURL *imageURL; //图片URL
+@property (nonatomic, copy) NSString *selectedImageName;
+@property (nonatomic, strong) NSURL *selectedImageURL;
+@property (nonatomic, copy) void(^loadImageCallback)(UIImageView *imageView, NSURL *imageURL);
+
+@end
diff --git a/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCellModel.m b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCellModel.m
new file mode 100644
index 0000000..ecf3539
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageCellModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryTitleImageCellModel.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/8.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleImageCellModel.h"
+
+@implementation JXCategoryTitleImageCellModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageView.h b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageView.h
new file mode 100644
index 0000000..9a48f43
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageView.h
@@ -0,0 +1,42 @@
+//
+// JXCategoryTitleImageView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/8.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleView.h"
+#import "JXCategoryTitleImageCell.h"
+#import "JXCategoryTitleImageCellModel.h"
+
+@interface JXCategoryTitleImageView : JXCategoryTitleView
+
+//imageInfo数组可以传入imageName字符串或者image的URL地址等,然后会通过loadImageBlock透传回来,把imageView对于图片的加载过程完全交给使用者决定。
+@property (nonatomic, strong) NSArray *imageInfoArray;
+@property (nonatomic, strong) NSArray *selectedImageInfoArray;
+@property (nonatomic, copy) void(^loadImageBlock)(UIImageView *imageView, id info);
+//图片尺寸。默认CGSizeMake(20, 20)
+@property (nonatomic, assign) CGSize imageSize;
+//titleLabel和ImageView的间距,默认5
+@property (nonatomic, assign) CGFloat titleImageSpacing;
+//图片是否缩放。默认为NO
+@property (nonatomic, assign, getter=isImageZoomEnabled) BOOL imageZoomEnabled;
+//图片缩放的最大scale。默认1.2,imageZoomEnabled为YES才生效
+@property (nonatomic, assign) CGFloat imageZoomScale;
+//默认@[JXCategoryTitleImageType_LeftImage...]
+@property (nonatomic, strong) NSArray *imageTypes;
+
+//下面的属性将会被弃用,请使用`imageInfoArray`、`selectedImageInfoArray`、`loadImageBlock`属性完成需求。
+//普通状态下的imageNames,通过[UIImage imageNamed:]方法加载
+@property (nonatomic, strong) NSArray *imageNames;
+//选中状态下的imageNames,通过[UIImage imageNamed:]方法加载。可选
+@property (nonatomic, strong) NSArray *selectedImageNames;
+//普通状态下的imageURLs,通过loadImageCallback回调加载
+@property (nonatomic, strong) NSArray *imageURLs;
+//选中状态下的selectedImageURLs,通过loadImageCallback回调加载
+@property (nonatomic, strong) NSArray *selectedImageURLs;
+//使用imageURL从远端下载图片进行加载,建议使用SDWebImage等第三方库进行下载。
+@property (nonatomic, copy) void(^loadImageCallback)(UIImageView *imageView, NSURL *imageURL);
+
+@end
diff --git a/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageView.m b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageView.m
new file mode 100644
index 0000000..ad2f560
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/TitleImage/JXCategoryTitleImageView.m
@@ -0,0 +1,126 @@
+//
+// JXCategoryTitleImageView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/8/8.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleImageView.h"
+#import "JXCategoryTitleImageCell.h"
+#import "JXCategoryTitleImageCellModel.h"
+#import "JXCategoryFactory.h"
+
+@implementation JXCategoryTitleImageView
+
+- (void)dealloc {
+ self.loadImageBlock = nil;
+ self.loadImageCallback = nil;
+}
+
+- (void)initializeData {
+ [super initializeData];
+
+ _imageSize = CGSizeMake(20, 20);
+ _titleImageSpacing = 5;
+ _imageZoomEnabled = NO;
+ _imageZoomScale = 1.2;
+}
+
+- (Class)preferredCellClass {
+ return [JXCategoryTitleImageCell class];
+}
+
+- (void)refreshDataSource {
+ NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:self.titles.count];
+ for (int i = 0; i < self.titles.count; i++) {
+ JXCategoryTitleImageCellModel *cellModel = [[JXCategoryTitleImageCellModel alloc] init];
+ [tempArray addObject:cellModel];
+ }
+ self.dataSource = [NSArray arrayWithArray:tempArray];
+
+ if (!self.imageTypes || (self.imageTypes.count == 0)) {
+ NSMutableArray *types = [NSMutableArray arrayWithCapacity:self.titles.count];
+ for (int i = 0; i< self.titles.count; i++) {
+ [types addObject:@(JXCategoryTitleImageType_LeftImage)];
+ }
+ self.imageTypes = [NSArray arrayWithArray:types];
+ }
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+ [super refreshCellModel:cellModel index:index];
+
+ JXCategoryTitleImageCellModel *myCellModel = (JXCategoryTitleImageCellModel *)cellModel;
+ myCellModel.loadImageBlock = self.loadImageBlock;
+ myCellModel.loadImageCallback = self.loadImageCallback;
+ myCellModel.imageType = [self.imageTypes[index] integerValue];
+ myCellModel.imageSize = self.imageSize;
+ myCellModel.titleImageSpacing = self.titleImageSpacing;
+ if (self.imageInfoArray && self.imageInfoArray.count != 0) {
+ myCellModel.imageInfo = self.imageInfoArray[index];
+ }else if (self.imageNames && self.imageNames.count != 0) {
+ myCellModel.imageName = self.imageNames[index];
+ }else if (self.imageURLs && self.imageURLs.count != 0) {
+ myCellModel.imageURL = self.imageURLs[index];
+ }
+ if (self.selectedImageInfoArray && self.selectedImageInfoArray.count != 0) {
+ myCellModel.selectedImageInfo = self.selectedImageInfoArray[index];
+ }else if (self.selectedImageNames && self.selectedImageNames.count != 0) {
+ myCellModel.selectedImageName = self.selectedImageNames[index];
+ }else if (self.selectedImageURLs && self.selectedImageURLs.count != 0) {
+ myCellModel.selectedImageURL = self.selectedImageURLs[index];
+ }
+ myCellModel.imageZoomEnabled = self.imageZoomEnabled;
+ myCellModel.imageZoomScale = ((index == self.selectedIndex) ? self.imageZoomScale : 1.0);
+}
+
+- (void)refreshSelectedCellModel:(JXCategoryBaseCellModel *)selectedCellModel unselectedCellModel:(JXCategoryBaseCellModel *)unselectedCellModel {
+ [super refreshSelectedCellModel:selectedCellModel unselectedCellModel:unselectedCellModel];
+
+ JXCategoryTitleImageCellModel *myUnselectedCellModel = (JXCategoryTitleImageCellModel *)unselectedCellModel;
+ myUnselectedCellModel.imageZoomScale = 1.0;
+
+ JXCategoryTitleImageCellModel *myselectedCellModel = (JXCategoryTitleImageCellModel *)selectedCellModel;
+ myselectedCellModel.imageZoomScale = self.imageZoomScale;
+}
+
+- (void)refreshLeftCellModel:(JXCategoryBaseCellModel *)leftCellModel rightCellModel:(JXCategoryBaseCellModel *)rightCellModel ratio:(CGFloat)ratio {
+ [super refreshLeftCellModel:leftCellModel rightCellModel:rightCellModel ratio:ratio];
+
+ JXCategoryTitleImageCellModel *leftModel = (JXCategoryTitleImageCellModel *)leftCellModel;
+ JXCategoryTitleImageCellModel *rightModel = (JXCategoryTitleImageCellModel *)rightCellModel;
+
+ if (self.isImageZoomEnabled) {
+ leftModel.imageZoomScale = [JXCategoryFactory interpolationFrom:self.imageZoomScale to:1.0 percent:ratio];
+ rightModel.imageZoomScale = [JXCategoryFactory interpolationFrom:1.0 to:self.imageZoomScale percent:ratio];
+ }
+}
+
+- (CGFloat)preferredCellWidthAtIndex:(NSInteger)index {
+ if (self.cellWidth == JXCategoryViewAutomaticDimension) {
+ CGFloat titleWidth = [super preferredCellWidthAtIndex:index];
+ JXCategoryTitleImageType type = [self.imageTypes[index] integerValue];
+ CGFloat cellWidth = 0;
+ switch (type) {
+ case JXCategoryTitleImageType_OnlyTitle:
+ cellWidth = titleWidth;
+ break;
+ case JXCategoryTitleImageType_OnlyImage:
+ cellWidth = self.imageSize.width;
+ break;
+ case JXCategoryTitleImageType_LeftImage:
+ case JXCategoryTitleImageType_RightImage:
+ cellWidth = titleWidth + self.titleImageSpacing + self.imageSize.width;
+ break;
+ case JXCategoryTitleImageType_TopImage:
+ case JXCategoryTitleImageType_BottomImage:
+ cellWidth = MAX(titleWidth, self.imageSize.width);
+ break;
+ }
+ return cellWidth;
+ }
+ return self.cellWidth;
+}
+
+@end
diff --git a/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCell.h b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCell.h
new file mode 100644
index 0000000..804a6fb
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCell.h
@@ -0,0 +1,17 @@
+//
+// JXCategoryTitleVerticalZoomCell.h
+// JXCategoryView
+//
+// Created by jiaxin on 2019/2/14.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCell.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JXCategoryTitleVerticalZoomCell : JXCategoryTitleCell
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCell.m b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCell.m
new file mode 100644
index 0000000..3d13438
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCell.m
@@ -0,0 +1,45 @@
+//
+// JXCategoryTitleVerticalZoomCell.m
+// JXCategoryView
+//
+// Created by jiaxin on 2019/2/14.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleVerticalZoomCell.h"
+#import "JXCategoryTitleVerticalZoomCellModel.h"
+
+@implementation JXCategoryTitleVerticalZoomCell
+
+- (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
+ [super reloadData:cellModel];
+
+ JXCategoryTitleVerticalZoomCellModel *myCellModel = (JXCategoryTitleVerticalZoomCellModel *)cellModel;
+
+ if (myCellModel.isTitleLabelZoomEnabled) {
+ //先把font设置为缩放的最大值,再缩小到最小值,最后根据当前的titleLabelZoomScale值,进行缩放更新。这样就能避免transform从小到大时字体模糊
+ UIFont *maxScaleFont = [UIFont fontWithDescriptor:myCellModel.titleFont.fontDescriptor size:myCellModel.titleFont.pointSize*myCellModel.maxVerticalFontScale];
+ CGFloat baseScale = myCellModel.titleFont.lineHeight/maxScaleFont.lineHeight;
+ if (myCellModel.isSelectedAnimationEnabled && [self checkCanStartSelectedAnimation:myCellModel]) {
+ JXCategoryCellSelectedAnimationBlock block = [self preferredTitleZoomAnimationBlock:myCellModel baseScale:baseScale];
+ [self addSelectedAnimationBlock:block];
+ } else {
+ self.titleLabel.font = maxScaleFont;
+ self.maskTitleLabel.font = maxScaleFont;
+ CGAffineTransform currentTransform = CGAffineTransformMakeScale(baseScale*myCellModel.titleLabelCurrentZoomScale, baseScale*myCellModel.titleLabelCurrentZoomScale);
+ self.titleLabel.transform = currentTransform;
+ self.maskTitleLabel.transform = currentTransform;
+ }
+ } else {
+ if (myCellModel.isSelected) {
+ self.titleLabel.font = myCellModel.titleSelectedFont;
+ self.maskTitleLabel.font = myCellModel.titleSelectedFont;
+ }else {
+ self.titleLabel.font = myCellModel.titleFont;
+ self.maskTitleLabel.font = myCellModel.titleFont;
+ }
+ }
+
+ [self.titleLabel sizeToFit];
+}
+@end
diff --git a/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCellModel.h b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCellModel.h
new file mode 100644
index 0000000..3c7ea4b
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCellModel.h
@@ -0,0 +1,19 @@
+//
+// JXCategoryTitleVerticalZoomCellModel.h
+// JXCategoryView
+//
+// Created by jiaxin on 2019/2/14.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleCellModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JXCategoryTitleVerticalZoomCellModel : JXCategoryTitleCellModel
+
+@property (nonatomic, assign) CGFloat maxVerticalFontScale;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCellModel.m b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCellModel.m
new file mode 100644
index 0000000..3bf0ba0
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomCellModel.m
@@ -0,0 +1,13 @@
+//
+// JXCategoryTitleVerticalZoomCellModel.m
+// JXCategoryView
+//
+// Created by jiaxin on 2019/2/14.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleVerticalZoomCellModel.h"
+
+@implementation JXCategoryTitleVerticalZoomCellModel
+
+@end
diff --git a/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.h b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.h
new file mode 100644
index 0000000..e3eb813
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.h
@@ -0,0 +1,34 @@
+//
+// JXCategoryTitleVerticalZoomView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2019/2/14.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ 垂直方向的缩放值范围:minVerticalFontScale~maxVerticalFontScale;
+ 垂直方向cellSpacing范围:minVerticalCellSpacing~maxVerticalCellSpacing,用于达到缩小时cell更加紧凑
+ 根据UI设计师给你的参数,去多次尝试设置上面的值来达到同样的效果。多尝试几次就知道每个属性设置之后的效果。
+ */
+@interface JXCategoryTitleVerticalZoomView : JXCategoryTitleView
+
+@property (nonatomic, assign) CGFloat maxVerticalFontScale; //垂直方向最大的缩放值
+@property (nonatomic, assign) CGFloat minVerticalFontScale; //垂直方向最小的缩放值
+@property (nonatomic, assign) CGFloat maxVerticalCellSpacing; //垂直方向最大的cellSpacing
+@property (nonatomic, assign) CGFloat minVerticalCellSpacing; //垂直方向最小的cellSpacing
+
+/**
+ 当前列表滚动时,根据当前垂直方向categoryView高度变化的百分比,刷新布局
+
+ @param percent 当前垂直方向categoryView高度变化百分比
+ */
+- (void)listDidScrollWithVerticalHeightPercent:(CGFloat)percent;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.m b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.m
new file mode 100644
index 0000000..b8fe745
--- /dev/null
+++ b/Pods/JXCategoryView/Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.m
@@ -0,0 +1,94 @@
+//
+// JXCategoryTitleVerticalZoomView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2019/2/14.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXCategoryTitleVerticalZoomView.h"
+#import "JXCategoryTitleVerticalZoomCellModel.h"
+#import "JXCategoryTitleVerticalZoomCell.h"
+#import "JXCategoryFactory.h"
+
+@interface JXCategoryTitleVerticalZoomView ()
+@property (nonatomic, assign) CGFloat currentVerticalScale; //当前垂直方向的缩放基准值
+@end
+
+@implementation JXCategoryTitleVerticalZoomView
+
+- (void)initializeData {
+ [super initializeData];
+
+ _maxVerticalFontScale = 2;
+ _minVerticalFontScale = 1.3;
+ _currentVerticalScale = _maxVerticalFontScale;
+ self.cellWidthZoomEnabled = YES;
+ self.cellWidthZoomScale = _maxVerticalFontScale;
+ self.contentEdgeInsetLeft = 15;
+ self.titleLabelZoomScale = _currentVerticalScale;
+ self.titleLabelZoomEnabled = YES;
+ self.selectedAnimationEnabled = YES;
+ _maxVerticalCellSpacing = 20;
+ _minVerticalCellSpacing = 10;
+ self.cellSpacing = _maxVerticalCellSpacing;
+}
+
+- (void)listDidScrollWithVerticalHeightPercent:(CGFloat)percent {
+ CGFloat currentScale = [JXCategoryFactory interpolationFrom:self.minVerticalFontScale to:self.maxVerticalFontScale percent:percent];
+ BOOL shouldReloadData = NO;
+ if (self.currentVerticalScale != currentScale) {
+ //有变化才允许reloadData
+ shouldReloadData = YES;
+ }
+ self.currentVerticalScale = currentScale;
+ self.cellWidthZoomScale = currentScale;
+ self.cellSpacing = [JXCategoryFactory interpolationFrom:self.minVerticalCellSpacing to:self.maxVerticalCellSpacing percent:percent];
+ if (shouldReloadData) {
+ [self refreshDataSource];
+ [self refreshState];
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ [self.collectionView reloadData];
+ }
+}
+
+- (void)setCurrentVerticalScale:(CGFloat)currentVerticalScale {
+ _currentVerticalScale = currentVerticalScale;
+
+ self.titleLabelZoomScale = currentVerticalScale;
+}
+
+- (void)setMaxVerticalCellSpacing:(CGFloat)maxVerticalCellSpacing {
+ _maxVerticalCellSpacing = maxVerticalCellSpacing;
+
+ self.cellSpacing = maxVerticalCellSpacing;
+}
+
+- (void)setMaxVerticalFontScale:(CGFloat)maxVerticalFontScale {
+ _maxVerticalFontScale = maxVerticalFontScale;
+
+ self.titleLabelZoomScale = maxVerticalFontScale;
+ self.cellWidthZoomScale = maxVerticalFontScale;
+}
+
+- (Class)preferredCellClass {
+ return [JXCategoryTitleVerticalZoomCell class];
+}
+
+- (void)refreshDataSource {
+ NSMutableArray *tempArray = [NSMutableArray array];
+ for (int i = 0; i < self.titles.count; i++) {
+ JXCategoryTitleVerticalZoomCellModel *cellModel = [[JXCategoryTitleVerticalZoomCellModel alloc] init];
+ [tempArray addObject:cellModel];
+ }
+ self.dataSource = tempArray;
+}
+
+- (void)refreshCellModel:(JXCategoryBaseCellModel *)cellModel index:(NSInteger)index {
+ [super refreshCellModel:cellModel index:index];
+
+ JXCategoryTitleVerticalZoomCellModel *model = (JXCategoryTitleVerticalZoomCellModel *)cellModel;
+ model.maxVerticalFontScale = self.maxVerticalFontScale;
+}
+
+@end
diff --git a/Pods/JXPagingView/LICENSE b/Pods/JXPagingView/LICENSE
new file mode 100644
index 0000000..0fdb1e7
--- /dev/null
+++ b/Pods/JXPagingView/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 暴走的鑫鑫
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/JXPagingView/README.md b/Pods/JXPagingView/README.md
new file mode 100644
index 0000000..b8f2efd
--- /dev/null
+++ b/Pods/JXPagingView/README.md
@@ -0,0 +1,294 @@
+# JXPagingView
+
+类似微博主页、简书主页、QQ联系人页面等效果。多页面嵌套,既可以上下滑动,也可以左右滑动切换页面。支持HeaderView悬浮、支持下拉刷新、上拉加载更多。
+
+## 功能特点
+
+- 支持OC与Swift;
+- 支持列表懒加载,等到列表真正显示的时候才加载,而不是一次性加载所有列表;
+- 支持首页下拉刷新、列表视图下拉刷新、列表视图上拉加载更多;
+- 支持悬浮SectionHeader的垂直位置调整;
+- 支持从顶部用力往上滚动,下面的列表会跟着滚动,而不会突然卡主,需要使用`JXPagerSmoothView`类;
+- 列表封装简洁,只要遵从`JXPagingViewListViewDelegate`协议即可。UIView、UIViewController等都可以;
+- 使用JXCategoryView/JXSegmentedView分类控制器,几乎支持所有主流效果、高度自定义、可灵活扩展;
+- 支持横竖屏切换;
+- 支持点击状态栏滚动当前列表到顶部;
+- 支持列表显示和消失的生命周期方法;
+- isListHorizontalScrollEnabled属性控制列表是否可以左右滑动,默认YES;
+- 支持`FDFullscreenPopGesture`等全屏手势兼容处理;
+
+## 预览
+
+| 效果 | 预览图 |
+|-------|-------|
+| **头图缩放**
参考[ZoomViewController](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagerViewExample-OC/JXPagerViewExample-OC/Example/Zoom/ZoomViewController.m)类 |  |
+| **主页下拉刷新&列表上拉加载更多**
参考[RefreshViewController](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagerViewExample-OC/JXPagerViewExample-OC/Example/Refresh/RefreshViewController.m)类 |  |
+| **列表下拉刷新**
参考[ListRefreshViewController](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagerViewExample-OC/JXPagerViewExample-OC/Example/Refresh/ListRefreshViewController.m)类 |  |
+| **悬浮sectionHeader位置调整** |  |
+| **导航栏隐藏**
参考[NaviBarHiddenViewController](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagerViewExample-OC/JXPagerViewExample-OC/Example/NavigationBarHidden/NaviBarHiddenViewController.m)类 |  |
+| **CollectionView列表示例**
参考[CollectionViewViewController.swift](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagingViewExample/JXPagingViewExample/Example/CollectionView/CollectionViewViewController.swift)类
只有swift的demo工程有该示例 |  |
+| **HeaderView更新高度示例**
参考[HeightChangeAnimationViewController.swift](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagingViewExample/JXPagingViewExample/Example/HeightChange/HeightChangeAnimationViewController.swift)类
只有swift demo工程才有该示例 |  |
+| **PagingView嵌套CategoryView**
参考[NestViewController](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagerViewExample-OC/JXPagerViewExample-OC/Example/Nest/NestViewController.m)类
只有 **OC!OC!OC!** 的demo工程才有该示例
操作比较特殊,如果需要此效果,
请认真参考源码,有问题多试试
参考NestViewController.h类 |  |
+| **CategoryView嵌套PagingView**
参考[NestViewController.swift](https://github.com/pujiaxin33/JXPagingView/tree/master/Examples/JXPagingViewExample/JXPagingViewExample/Example/CategoryNestPaging/NestViewController.swift)类
只有 **Swift!Swift!Swift!** 的demo工程才有该示例
操作比较特殊,如果需要此效果,
请认真参考源码,有问题多试试
参考NestViewController.swift类 |  |
+| **点击状态栏** |  |
+| **横竖屏旋转** |  |
+| **JXPageListView**
顶部需要自定义cell的场景,类似于电商APP首页,滑动到列表最底部才是分类控制器
该效果是另一个库,点击查看[JXPageListView](https://github.com/pujiaxin33/JXPageListView)
该效果是另一个库,点击查看[JXPageListView](https://github.com/pujiaxin33/JXPageListView)
该效果是另一个库,点击查看[JXPageListView](https://github.com/pujiaxin33/JXPageListView) |  |
+| **JXPagerSmoothView**
类似淘宝、转转首页
从顶部用力往上滚动,下面的列表会继续滚动 |  |
+
+## 安装
+
+### 手动
+
+**Swift版本:** Clone代码,拖入JXPagingView-Swift文件夹,使用`JXPagingView`类;
+
+**OC版本:** Clone代码,拖入JXPagerView文件夹,使用`JXPagerView`类;
+
+### CocoaPods
+
+- **Swift版本**
+
+支持swift版本:5.0+
+
+```ruby
+target '' do
+ pod 'JXPagingView/Paging'
+end
+```
+
+- **OC版本**
+```ruby
+target '' do
+ pod 'JXPagingView/Pager'
+end
+```
+
+Swift与OC的仓库地址不一样,请注意选择!
+
+先`pod repo update`然后再`pod install`
+
+
+## 使用
+
+swift版本使用类似,只是类名及相关API更改为`JXPagingView`,具体细节请查看Swfit工程。
+
+### 1、初始化`JXCategoryTitleView`和`JXPagerView`
+
+```Objective-C
+self.categoryView = [[JXCategoryTitleView alloc] initWithFrame:frame];
+//配置categoryView,细节参考源码
+
+self.pagerView = [[JXPagerView alloc] initWithDelegate:self];
+[self.view addSubview:self.pagerView];
+
+//⚠️⚠️⚠️将pagerView的listContainerView和categoryView.listContainer进行关联,这样列表就可以和categoryView联动了。⚠️⚠️⚠️
+self.categoryView.listContainer = (id)self.pagerView.listContainerView;
+```
+
+**Swift版本列表关联代码**
+```Swift
+//给JXPagingListContainerView添加extension,表示遵从JXSegmentedViewListContainer的协议
+extension JXPagingListContainerView: JXSegmentedViewListContainer {}
+//⚠️⚠️⚠️将pagingView的listContainerView和segmentedView.listContainer进行关联,这样列表就可以和categoryView联动了。⚠️⚠️⚠️
+segmentedView.listContainer = pagingView.listContainerView
+```
+
+### 2、实现`JXPagerViewDelegate`协议
+
+```Objective-C
+/**
+ 返回tableHeaderView的高度,因为内部需要比对判断,只能是整型数
+ */
+- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView {
+ return JXTableHeaderViewHeight;
+}
+
+/**
+ 返回tableHeaderView
+ */
+- (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView {
+ return self.userHeaderView;
+}
+
+
+/**
+ 返回悬浮HeaderView的高度,因为内部需要比对判断,只能是整型数
+ */
+- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
+ return JXheightForHeaderInSection;
+}
+
+
+/**
+ 返回悬浮HeaderView
+ */
+- (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
+ return self.categoryView;
+}
+
+/**
+ 返回列表的数量
+ */
+- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView {
+ //和categoryView的item数量一致
+ return self.titles.count;
+}
+
+/**
+ 根据index初始化一个对应列表实例。注意:一定要是新生成的实例!!!
+ 只要遵循JXPagerViewListViewDelegate即可,无论你返回的是UIView还是UIViewController都可以。
+ */
+- (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index {
+ TestListBaseView *listView = [[TestListBaseView alloc] init];
+ if (index == 0) {
+ listView.dataSource = @[@"橡胶火箭", @"橡胶火箭炮", @"橡胶机关枪"...].mutableCopy;
+ }else if (index == 1) {
+ listView.dataSource = @[@"吃烤肉", @"吃鸡腿肉", @"吃牛肉", @"各种肉"].mutableCopy;
+ }else {
+ listView.dataSource = @[@"【剑士】罗罗诺亚·索隆", @"【航海士】娜美", @"【狙击手】乌索普"...].mutableCopy;
+ }
+ [listView beginFirstRefresh];
+ return listView;
+}
+```
+
+### 3、实现`JXPagerViewListViewDelegate`协议
+
+列表可以是任意类,UIView、UIViewController等等都可以,只要实现了`JXPagerViewListViewDelegate`协议就行。
+
+⚠️⚠️⚠️一定要保证`scrollCallback`的正确回调,许多朋友都容易疏忽这一点,导致异常,务必重点注意!
+
+下面的使用代码参考的是`TestListBaseView`类
+
+```Objective-C
+/**
+ 返回listView。如果是vc包裹的就是vc.view;如果是自定义view包裹的,就是自定义view自己。
+ */
+- (UIView *)listView {
+ return self;
+}
+
+/**
+ 返回listView内部持有的UIScrollView或UITableView或UICollectionView
+ 主要用于mainTableView已经显示了header,listView的contentOffset需要重置时,内部需要访问到外部传入进来的listView内的scrollView
+ */
+- (UIScrollView *)listScrollView {
+ return self.tableView;
+}
+
+
+/**
+ 当listView内部持有的UIScrollView或UITableView或UICollectionView的代理方法`scrollViewDidScroll`回调时,需要调用该代理方法传入的callback
+ */
+- (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback {
+ self.scrollCallback = callback;
+}
+```
+
+### 4、列表回调处理
+
+`TestListBaseView`在其`tableView`的滚动回调中,通过调用上面持有的scrollCallback,把列表的滚动事件回调给JXPagerView内部。
+```Objective-C
+- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
+ !self.scrollCallback ?: self.scrollCallback(scrollView);
+}
+```
+
+## 实现原理
+
+[实现原理](https://github.com/pujiaxin33/JXPagingView/blob/master/Document/JXPagingView%E5%8E%9F%E7%90%86.md)
+
+## `JXPagerSmoothView`
+
+如果你需要类似于**淘宝**、**转转**首页从顶部header用力往上滚动之后,下面的列表会跟着滚动的效果。因为`JXPagerView`的实现原理限制,当用户从顶部header的位置用力往上滚动,`JXPagerView`会在`JXCategoryView`刚好在顶部的时候突然停住。这个时候就需要使用`JXPagerSmoothView`,swift版本叫`JXPagingSmoothView`。
+
+因为与`JXPagerView`的原理完全不同,所以各自会有一些特性的区别,但是从使用体验来说,是完全一致的。具体使用细节请参考demo示例。
+
+实现原理参考[JXPagerSmoothView文章解析](https://juejin.im/post/5ddb2fe4f265da7def5424c7)
+
+
+## 特殊说明
+
+### JXCategoryView、JXSegmentedView
+悬浮的HeaderView,用的是我写的:[OC版本-JXCategoryView](https://github.com/pujiaxin33/JXCategoryView) 、[Swift版本-JXSegmentedView](https://github.com/pujiaxin33/JXSegmentedView)。几乎实现了所有主流效果,而且非常容易自定义扩展,强烈推荐阅读。
+
+
+### 头图缩放说明
+头图缩放原理,参考这个库:[JXTableViewZoomHeaderImageView](https://github.com/pujiaxin33/JXTableViewZoomHeaderImageView)
+
+### 列表下拉刷新说明
+
+需要使用`JXPagerListRefreshView`类(是`JXPagerView`的子类)
+
+### JXPagerListContainerType说明
+
+UIScrollView:优势:没有其他副作用。劣势:实时的视图内存占用相对大一点,因为所有加载之后的列表视图都在视图层级里面。
+UICollectionView:优势:因为列表被添加到cell上,实时的视图内存占用更少,适合内存要求特别高的场景。劣势:因为cell重用机制的问题,导致列表被移除屏幕外之后,会被放入缓存区,而不存在于视图层级中。如果刚好你的列表使用了下拉刷新视图,在快速切换过程中,就会导致下拉刷新回调不成功的问题。(使用MJRefresh会出现此问题)一句话概括:使用CollectionView的时候,就不要让列表使用下拉刷新加载。
+
+### 关于下方列表视图的代理方法`- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath`有时候需要点击两次才回调
+
+出现步骤:当手指放在下方列表视图往下拉,直到TableHeaderView完全显示。
+
+原因:经过上面的步骤之后,手指已经离开屏幕且列表视图已经完全静止,UIScrollView的isDragging属性却依然是true。就导致了后续的第一次点击,让系统认为当前UIScrollView依然在滚动,该点击就让UIScrollView停止下来,没有继续转发给UITableView,就没有转化成didSelectRow事件。
+
+解决方案:经过N种尝试之后,还是没有回避掉系统的`isDragging`异常为true的bug。大家可以在自定义cell最下方放置一个与cell同大小的button,把button的touchUpInside事件当做`didSelectRow`的回调。因为UIButton在响应链中的优先级要高于UIGestureRecognizer。
+
+代码:请参考`TestTableViewCell`类的配置。
+
+### 指定默认选中index
+
+默认显示index=2的列表,代码如下:
+```
+self.pagerView.defaultSelectedIndex = 2;
+self.categoryView.defaultSelectedIndex = 2;
+```
+
+### 顶部轮播图手势处理
+
+如果TableHeaderView添加了轮播图,获取其他可以横向滚动的UIScrollView。如果不处理,就会出现左右滚动轮播图的时候又可以触发整个页面的上下滚动。为了规避该问题,请参考示例仓库中`BannerViewController`类的处理方法。即可同一时间只允许左右滚动或者上下滚动。
+
+### 关于列表用UIViewController封装且要支持横竖屏的tips
+
+在列表UIViewController类里面一定要加上下面这段代码:(不要问我为什么,我也不知道,谁知道系统内部是怎么操作的,反正加上就没毛病了)
+```
+- (void)loadView {
+ self.view = [[UIView alloc] init];
+}
+```
+
+### `JXPagerSmoothView` header有UITextField或者`UITextView`
+详情参考OC版本示例【滚动延续 Header有输入框】
+
+列表自定义子类化`UITableView`或者`UICollectionView`,然后重载`scrollRectToVisible`方法,示例代码如下。
+```Object-C
+@implementation TestTableView
+- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated {
+ [self setContentOffset:CGPointMake(self.contentOffset.x, rect.origin.y) animated:animated];
+}
+@end
+```
+
+### `FDFullscreenPopGesture`等全屏手势兼容处理
+
+[全屏手势兼容处理文档,点击查看 ❗️❗️❗️](https://github.com/pujiaxin33/JXPagingView/blob/master/Document/%E5%85%A8%E5%B1%8F%E6%89%8B%E5%8A%BF%E5%A4%84%E7%90%86.md)
+
+
+## 迁移指南
+- **0.0.9版本**:将下面两个API的返回值修改为了NSUInteger(swift版本为Int),之前版本是CGFloat,升级为0.0.9及以上的时候,记得修改一下使用地方的返回值类型,不然会引起crash。
+ - `- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView`
+ - `- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView`
+- **1.0.0版本**:
+ 删除代理方法`- (NSArray > *)listViewsInPagerView:(JXPagerView *)pagerView;`,请参考示例使用下面两个代理方法:
+ - `- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView;`
+ - `- (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index;`
+- **2.0.0版本**:`JXPagerListContainerView`进行了重构,列表拥有了完整的生命周期方法。列表是`UIViewController`类,`viewWillAppear`等生命周期方法将会正确触发。
+-
+ - 删除了collectionView,用`scrollView`属性替换。
+ - 和`CategoryView`的联动绑定代码更新为`self.categoryView.listContainer = (id)self.pagerView.listContainerView;`。
+ - `JXPagerView`新增`- (instancetype)initWithDelegate:(id)delegate listContainerType:(JXPagerListContainerType)type`初始化方法,可以指定列表容器为`UIScrollView`或者`UICollectionView`;
+
+
+## 补充
+
+有不明白的地方,建议多看下源码。再有疑问的,欢迎提Issue交流🤝
+
+
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerListContainerView.h b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListContainerView.h
new file mode 100644
index 0000000..6287361
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListContainerView.h
@@ -0,0 +1,128 @@
+//
+// JXCategoryListScrollView.h
+// JXCategoryView
+//
+// Created by jiaxin on 2018/9/12.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+@class JXPagerListContainerView;
+@class JXPagerListContainerScrollView;
+
+@protocol JXPagerViewListViewDelegate
+
+/**
+ 返回listView。如果是vc包裹的就是vc.view;如果是自定义view包裹的,就是自定义view自己。
+
+ @return UIView
+ */
+- (UIView *)listView;
+
+/**
+ 返回listView内部持有的UIScrollView或UITableView或UICollectionView
+ 主要用于mainTableView已经显示了header,listView的contentOffset需要重置时,内部需要访问到外部传入进来的listView内的scrollView
+
+ @return listView内部持有的UIScrollView或UITableView或UICollectionView
+ */
+- (UIScrollView *)listScrollView;
+
+/**
+ 当listView内部持有的UIScrollView或UITableView或UICollectionView的代理方法`scrollViewDidScroll`回调时,需要调用该代理方法传入的callback
+
+ @param callback `scrollViewDidScroll`回调时调用的callback
+ */
+- (void)listViewDidScrollCallback:(void (^)(UIScrollView *scrollView))callback;
+
+@optional
+
+- (void)listScrollViewWillResetContentOffset;
+- (void)listWillAppear;
+- (void)listDidAppear;
+- (void)listWillDisappear;
+- (void)listDidDisappear;
+
+@end
+
+/**
+ 列表容器视图的类型
+
+ - ScrollView: UIScrollView。优势:没有其他副作用。劣势:实时的视图内存占用相对大一点,因为所有加载之后的列表视图都在视图层级里面。
+ - CollectionView: 使用UICollectionView。优势:因为列表被添加到cell上,实时的视图内存占用更少,适合内存要求特别高的场景。劣势:因为cell重用机制的问题,导致列表被移除屏幕外之后,会被放入缓存区,而不存在于视图层级中。如果刚好你的列表使用了下拉刷新视图,在快速切换过程中,就会导致下拉刷新回调不成功的问题。一句话概括:使用CollectionView的时候,就不要让列表使用下拉刷新加载。
+ */
+typedef NS_ENUM(NSUInteger, JXPagerListContainerType) {
+ JXPagerListContainerType_ScrollView,
+ JXPagerListContainerType_CollectionView,
+};
+
+@protocol JXPagerListContainerViewDelegate
+/**
+ 返回list的数量
+
+ @param listContainerView 列表的容器视图
+ @return list的数量
+ */
+- (NSInteger)numberOfListsInlistContainerView:(JXPagerListContainerView *)listContainerView;
+
+/**
+ 根据index返回一个对应列表实例,需要是遵从`JXPagerViewListViewDelegate`协议的对象。
+ 你可以代理方法调用的时候初始化对应列表,达到懒加载的效果。这也是默认推荐的初始化列表方法。你也可以提前创建好列表,等该代理方法回调的时候再返回也可以,达到预加载的效果。
+ 如果列表是用自定义UIView封装的,就让自定义UIView遵从`JXPagerViewListViewDelegate`协议,该方法返回自定义UIView即可。
+ 如果列表是用自定义UIViewController封装的,就让自定义UIViewController遵从`JXPagerViewListViewDelegate`协议,该方法返回自定义UIViewController即可。
+
+ @param listContainerView 列表的容器视图
+ @param index 目标下标
+ @return 遵从JXPagerViewListViewDelegate协议的list实例
+ */
+- (id)listContainerView:(JXPagerListContainerView *)listContainerView initListForIndex:(NSInteger)index;
+
+@optional
+/**
+ 返回自定义UIScrollView或UICollectionView的Class
+ 某些特殊情况需要自己处理UIScrollView内部逻辑。比如项目用了FDFullscreenPopGesture,需要处理手势相关代理。
+
+ @param listContainerView JXPagerListContainerView
+ @return 自定义UIScrollView实例
+ */
+- (Class)scrollViewClassInlistContainerView:(JXPagerListContainerView *)listContainerView;
+
+/**
+ 控制能否初始化对应index的列表。有些业务需求,需要在某些情况才允许初始化某些列表,通过通过该代理实现控制。
+ */
+- (BOOL)listContainerView:(JXPagerListContainerView *)listContainerView canInitListAtIndex:(NSInteger)index;
+- (void)listContainerViewDidScroll:(UIScrollView *)scrollView;
+- (void)listContainerViewWillBeginDragging:(JXPagerListContainerView *)listContainerView;
+- (void)listContainerViewWDidEndScroll:(JXPagerListContainerView *)listContainerView;
+- (void)listContainerView:(JXPagerListContainerView *)listContainerView listDidAppearAtIndex:(NSInteger)index;
+
+@end
+
+@interface JXPagerListContainerView : UIView
+
+@property (nonatomic, assign, readonly) JXPagerListContainerType containerType;
+@property (nonatomic, strong, readonly) UIScrollView *scrollView;
+@property (nonatomic, strong, readonly) NSDictionary > *validListDict; //已经加载过的列表字典。key是index,value是对应的列表
+@property (nonatomic, strong) UIColor *listCellBackgroundColor; //默认:[UIColor whiteColor]
+/**
+ 滚动切换的时候,滚动距离超过一页的多少百分比,就触发列表的初始化。默认0.01(即列表显示了一点就触发加载)。范围0~1,开区间不包括0和1
+ */
+@property (nonatomic, assign) CGFloat initListPercent;
+///当使用Category嵌套Paging的时候,需要设置为YES,默认为NO;
+@property (nonatomic, assign, getter=isCategoryNestPagingEnabled) BOOL categoryNestPagingEnabled;
+@property (nonatomic, assign, readonly) NSInteger currentIndex;
+
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
+- (instancetype)initWithType:(JXPagerListContainerType)type delegate:(id)delegate NS_DESIGNATED_INITIALIZER;
+
+@end
+
+@interface JXPagerListContainerView (ListContainer)
+- (void)setDefaultSelectedIndex:(NSInteger)index;
+- (UIScrollView *)contentScrollView;
+- (void)reloadData;
+- (void)scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio selectedIndex:(NSInteger)selectedIndex;
+- (void)didClickSelectedItemAtIndex:(NSInteger)index;
+@end
+
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerListContainerView.m b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListContainerView.m
new file mode 100644
index 0000000..14358b7
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListContainerView.m
@@ -0,0 +1,597 @@
+//
+// JXPagerListContainerView.m
+// JXCategoryView
+//
+// Created by jiaxin on 2018/9/12.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXPagerListContainerView.h"
+#import
+
+@interface JXPagerListContainerScrollView: UIScrollView
+@property (nonatomic, assign, getter=isCategoryNestPagingEnabled) BOOL categoryNestPagingEnabled;
+@end
+@implementation JXPagerListContainerScrollView
+- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
+ if (self.isCategoryNestPagingEnabled) {
+ if ([gestureRecognizer isMemberOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")]) {
+ CGFloat velocityX = [(UIPanGestureRecognizer *)gestureRecognizer velocityInView:gestureRecognizer.view].x;
+ //x大于0就是往右滑
+ if (velocityX > 0) {
+ if (self.contentOffset.x == 0) {
+ return NO;
+ }
+ }else if (velocityX < 0) {
+ //x小于0就是往左滑
+ if (self.contentOffset.x + self.bounds.size.width == self.contentSize.width) {
+ return NO;
+ }
+ }
+ }
+ }
+ return YES;
+}
+@end
+
+@interface JXPagerListContainerCollectionView: UICollectionView
+@property (nonatomic, assign, getter=isCategoryNestPagingEnabled) BOOL categoryNestPagingEnabled;
+@end
+@implementation JXPagerListContainerCollectionView
+- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
+ if (self.isCategoryNestPagingEnabled) {
+ if ([gestureRecognizer isMemberOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")]) {
+ CGFloat velocityX = [(UIPanGestureRecognizer *)gestureRecognizer velocityInView:gestureRecognizer.view].x;
+ //x大于0就是往右滑
+ if (velocityX > 0) {
+ if (self.contentOffset.x == 0) {
+ return NO;
+ }
+ }else if (velocityX < 0) {
+ //x小于0就是往左滑
+ if (self.contentOffset.x + self.bounds.size.width == self.contentSize.width) {
+ return NO;
+ }
+ }
+ }
+ }
+ return YES;
+}
+@end
+
+@interface JXPagerListContainerViewController : UIViewController
+@property (copy) void(^viewWillAppearBlock)(void);
+@property (copy) void(^viewDidAppearBlock)(void);
+@property (copy) void(^viewWillDisappearBlock)(void);
+@property (copy) void(^viewDidDisappearBlock)(void);
+@end
+
+@implementation JXPagerListContainerViewController
+- (void)dealloc
+{
+ self.viewWillAppearBlock = nil;
+ self.viewDidAppearBlock = nil;
+ self.viewWillDisappearBlock = nil;
+ self.viewDidDisappearBlock = nil;
+}
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+ self.viewWillAppearBlock();
+}
+- (void)viewDidAppear:(BOOL)animated {
+ [super viewDidAppear:animated];
+ self.viewDidAppearBlock();
+}
+- (void)viewWillDisappear:(BOOL)animated {
+ [super viewWillDisappear:animated];
+ self.viewWillDisappearBlock();
+}
+- (void)viewDidDisappear:(BOOL)animated {
+ [super viewDidDisappear:animated];
+ self.viewDidDisappearBlock();
+}
+- (BOOL)shouldAutomaticallyForwardAppearanceMethods { return NO; }
+@end
+
+@interface JXPagerListContainerView ()
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, strong) UIScrollView *scrollView;
+@property (nonatomic, assign) NSInteger currentIndex;
+@property (nonatomic, strong) NSMutableDictionary > *validListDict;
+@property (nonatomic, assign) NSInteger willAppearIndex;
+@property (nonatomic, assign) NSInteger willDisappearIndex;
+@property (nonatomic, strong) UICollectionView *collectionView;
+@property (nonatomic, strong) JXPagerListContainerViewController *containerVC;
+@end
+
+@implementation JXPagerListContainerView
+
+- (instancetype)initWithType:(JXPagerListContainerType)type delegate:(id)delegate{
+ self = [super initWithFrame:CGRectZero];
+ if (self) {
+ _containerType = type;
+ _delegate = delegate;
+ _validListDict = [NSMutableDictionary dictionary];
+ _willAppearIndex = -1;
+ _willDisappearIndex = -1;
+ _initListPercent = 0.01;
+ [self initializeViews];
+ }
+ return self;
+}
+
+- (void)initializeViews {
+ _listCellBackgroundColor = [UIColor whiteColor];
+ _containerVC = [[JXPagerListContainerViewController alloc] init];
+ self.containerVC.view.backgroundColor = [UIColor clearColor];
+ [self addSubview:self.containerVC.view];
+ __weak typeof(self) weakSelf = self;
+ self.containerVC.viewWillAppearBlock = ^{
+ [weakSelf listWillAppear:weakSelf.currentIndex];
+ };
+ self.containerVC.viewDidAppearBlock = ^{
+ [weakSelf listDidAppear:weakSelf.currentIndex];
+ };
+ self.containerVC.viewWillDisappearBlock = ^{
+ [weakSelf listWillDisappear:weakSelf.currentIndex];
+ };
+ self.containerVC.viewDidDisappearBlock = ^{
+ [weakSelf listDidDisappear:weakSelf.currentIndex];
+ };
+ if (self.containerType == JXPagerListContainerType_ScrollView) {
+ if (self.delegate &&
+ [self.delegate respondsToSelector:@selector(scrollViewClassInlistContainerView:)] &&
+ [[self.delegate scrollViewClassInlistContainerView:self] isKindOfClass:object_getClass([UIScrollView class])]) {
+ _scrollView = (UIScrollView *)[[[self.delegate scrollViewClassInlistContainerView:self] alloc] init];
+ }else {
+ _scrollView = [[JXPagerListContainerScrollView alloc] init];
+ }
+ self.scrollView.backgroundColor = [UIColor clearColor];
+ self.scrollView.delegate = self;
+ self.scrollView.pagingEnabled = YES;
+ self.scrollView.showsHorizontalScrollIndicator = NO;
+ self.scrollView.showsVerticalScrollIndicator = NO;
+ self.scrollView.scrollsToTop = NO;
+ self.scrollView.bounces = NO;
+ if (@available(iOS 11.0, *)) {
+ self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ [self.containerVC.view addSubview:self.scrollView];
+ }else {
+ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+ layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+ layout.minimumLineSpacing = 0;
+ layout.minimumInteritemSpacing = 0;
+ if (self.delegate &&
+ [self.delegate respondsToSelector:@selector(scrollViewClassInlistContainerView:)] &&
+ [[self.delegate scrollViewClassInlistContainerView:self] isKindOfClass:object_getClass([UICollectionView class])]) {
+ _collectionView = (UICollectionView *)[[[self.delegate scrollViewClassInlistContainerView:self] alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+ }else {
+ _collectionView = [[JXPagerListContainerCollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+ }
+ self.collectionView.backgroundColor = [UIColor clearColor];
+ self.collectionView.pagingEnabled = YES;
+ self.collectionView.showsHorizontalScrollIndicator = NO;
+ self.collectionView.showsVerticalScrollIndicator = NO;
+ self.collectionView.scrollsToTop = NO;
+ self.collectionView.bounces = NO;
+ self.collectionView.dataSource = self;
+ self.collectionView.delegate = self;
+ [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
+ if (@available(iOS 10.0, *)) {
+ self.collectionView.prefetchingEnabled = NO;
+ }
+ if (@available(iOS 11.0, *)) {
+ self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ [self.containerVC.view addSubview:self.collectionView];
+ //让外部统一访问scrollView
+ _scrollView = _collectionView;
+ }
+}
+
+- (void)willMoveToSuperview:(UIView *)newSuperview {
+ [super willMoveToSuperview:newSuperview];
+
+ UIResponder *next = newSuperview;
+ while (next != nil) {
+ if ([next isKindOfClass:[UIViewController class]]) {
+ [((UIViewController *)next) addChildViewController:self.containerVC];
+ break;
+ }
+ next = next.nextResponder;
+ }
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ self.containerVC.view.frame = self.bounds;
+ if (self.containerType == JXPagerListContainerType_ScrollView) {
+ if (CGRectEqualToRect(self.scrollView.frame, CGRectZero) || !CGSizeEqualToSize(self.scrollView.bounds.size, self.bounds.size)) {
+ self.scrollView.frame = self.bounds;
+ self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width*[self.delegate numberOfListsInlistContainerView:self], self.scrollView.bounds.size.height);
+ [_validListDict enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull index, id _Nonnull list, BOOL * _Nonnull stop) {
+ [list listView].frame = CGRectMake(index.intValue*self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
+ }];
+ self.scrollView.contentOffset = CGPointMake(self.currentIndex*self.scrollView.bounds.size.width, 0);
+ }else {
+ self.scrollView.frame = self.bounds;
+ self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width*[self.delegate numberOfListsInlistContainerView:self], self.scrollView.bounds.size.height);
+ }
+ }else {
+ if (CGRectEqualToRect(self.collectionView.frame, CGRectZero) || !CGSizeEqualToSize(self.collectionView.bounds.size, self.bounds.size)) {
+ self.collectionView.frame = self.bounds;
+ [self.collectionView.collectionViewLayout invalidateLayout];
+ [self.collectionView reloadData];
+ [self.collectionView setContentOffset:CGPointMake(self.collectionView.bounds.size.width*self.currentIndex, 0) animated:NO];
+ }else {
+ self.collectionView.frame = self.bounds;
+ }
+ }
+}
+
+
+- (void)setinitListPercent:(CGFloat)initListPercent {
+ _initListPercent = initListPercent;
+ if (initListPercent <= 0 || initListPercent >= 1) {
+ NSAssert(NO, @"initListPercent值范围为开区间(0,1),即不包括0和1");
+ }
+}
+
+- (void)setCategoryNestPagingEnabled:(BOOL)categoryNestPagingEnabled {
+ _categoryNestPagingEnabled = categoryNestPagingEnabled;
+ if ([self.scrollView isKindOfClass:[JXPagerListContainerScrollView class]]) {
+ ((JXPagerListContainerScrollView *)self.scrollView).categoryNestPagingEnabled = categoryNestPagingEnabled;
+ }else if ([self.scrollView isKindOfClass:[JXPagerListContainerCollectionView class]]) {
+ ((JXPagerListContainerCollectionView *)self.scrollView).categoryNestPagingEnabled = categoryNestPagingEnabled;
+ }
+}
+
+#pragma mark - UICollectionViewDelegate, UICollectionViewDataSource
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+ return [self.delegate numberOfListsInlistContainerView:self];
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+ UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
+ cell.contentView.backgroundColor = self.listCellBackgroundColor;
+ for (UIView *subview in cell.contentView.subviews) {
+ [subview removeFromSuperview];
+ }
+ id list = _validListDict[@(indexPath.item)];
+ if (list != nil) {
+ //fixme:如果list是UIViewController,如果这里的frame修改是`[list listView].frame = cell.bounds;`。那么就必须给list vc添加如下代码:
+ //- (void)loadView {
+ // self.view = [[UIView alloc] init];
+ //}
+ //所以,总感觉是把UIViewController当做普通view使用,导致了系统内部的bug。所以,缓兵之计就是用下面的方法,暂时解决问题。
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [list listView].frame = cell.contentView.bounds;
+ } else {
+ [list listView].frame = cell.bounds;
+ }
+ [cell.contentView addSubview:[list listView]];
+ }
+ return cell;
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+ return self.bounds.size;
+}
+
+#pragma mark - UIScrollViewDelegate
+
+- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewDidScroll:)]) {
+ [self.delegate listContainerViewDidScroll:scrollView];
+ }
+ if (!scrollView.isDragging && !scrollView.isTracking && !scrollView.isDecelerating) {
+ return;
+ }
+ CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ NSInteger maxCount = round(scrollView.contentSize.width/scrollView.bounds.size.width);
+ NSInteger leftIndex = floorf(ratio);
+ leftIndex = MAX(0, MIN(maxCount - 1, leftIndex));
+ NSInteger rightIndex = leftIndex + 1;
+ if (ratio < 0 || rightIndex >= maxCount) {
+ [self listDidAppearOrDisappear:scrollView];
+ return;
+ }
+ CGFloat remainderRatio = ratio - leftIndex;
+ if (rightIndex == self.currentIndex) {
+ //当前选中的在右边,用户正在从右边往左边滑动
+ if (self.validListDict[@(leftIndex)] == nil && remainderRatio < (1 - self.initListPercent)) {
+ [self initListIfNeededAtIndex:leftIndex];
+ }else if (self.validListDict[@(leftIndex)] != nil) {
+ if (self.willAppearIndex == -1) {
+ self.willAppearIndex = leftIndex;
+ [self listWillAppear:self.willAppearIndex];
+ }
+ }
+ if (self.willDisappearIndex == -1) {
+ self.willDisappearIndex = rightIndex;
+ [self listWillDisappear:self.willDisappearIndex];
+ }
+ }else {
+ //当前选中的在左边,用户正在从左边往右边滑动
+ if (self.validListDict[@(rightIndex)] == nil && remainderRatio > self.initListPercent) {
+ [self initListIfNeededAtIndex:rightIndex];
+ }else if (self.validListDict[@(rightIndex)] != nil) {
+ if (self.willAppearIndex == -1) {
+ self.willAppearIndex = rightIndex;
+ [self listWillAppear:self.willAppearIndex];
+ }
+ }
+ if (self.willDisappearIndex == -1) {
+ self.willDisappearIndex = leftIndex;
+ [self listWillDisappear:self.willDisappearIndex];
+ }
+ }
+ [self listDidAppearOrDisappear:scrollView];
+}
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
+ if (self.willDisappearIndex != -1) {
+ [self listWillAppear:self.willDisappearIndex];
+ [self listWillDisappear:self.willAppearIndex];
+ [self listDidAppear:self.willDisappearIndex];
+ [self listDidDisappear:self.willAppearIndex];
+ self.willDisappearIndex = -1;
+ self.willAppearIndex = -1;
+ }
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewWDidEndScroll:)]) {
+ [self.delegate listContainerViewWDidEndScroll:self];
+ }
+}
+
+- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewWillBeginDragging:)]) {
+ [self.delegate listContainerViewWillBeginDragging:self];
+ }
+}
+
+- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
+ if (!decelerate) {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewWDidEndScroll:)]) {
+ [self.delegate listContainerViewWDidEndScroll:self];
+ }
+ }
+}
+
+- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerViewWDidEndScroll:)]) {
+ [self.delegate listContainerViewWDidEndScroll:self];
+ }
+}
+
+#pragma mark - JXCategoryViewListContainer
+
+- (UIScrollView *)contentScrollView {
+ return self.scrollView;
+}
+
+- (void)setDefaultSelectedIndex:(NSInteger)index {
+ self.currentIndex = index;
+}
+
+- (void)scrollingFromLeftIndex:(NSInteger)leftIndex toRightIndex:(NSInteger)rightIndex ratio:(CGFloat)ratio selectedIndex:(NSInteger)selectedIndex {
+}
+
+- (void)didClickSelectedItemAtIndex:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ self.willAppearIndex = -1;
+ self.willDisappearIndex = -1;
+ if (self.currentIndex != index) {
+ [self listWillDisappear:self.currentIndex];
+ [self listDidDisappear:self.currentIndex];
+ [self listWillAppear:index];
+ [self listDidAppear:index];
+ }
+}
+
+- (void)reloadData {
+ for (id list in _validListDict.allValues) {
+ [[list listView] removeFromSuperview];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [(UIViewController *)list removeFromParentViewController];
+ }
+ }
+ [_validListDict removeAllObjects];
+
+ if (self.containerType == JXPagerListContainerType_ScrollView) {
+ self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width*[self.delegate numberOfListsInlistContainerView:self], self.scrollView.bounds.size.height);
+ }else {
+ [self.collectionView reloadData];
+ }
+ [self listWillAppear:self.currentIndex];
+ [self listDidAppear:self.currentIndex];
+}
+
+#pragma mark - Private
+
+- (void)initListIfNeededAtIndex:(NSInteger)index {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerView:canInitListAtIndex:)]) {
+ BOOL canInitList = [self.delegate listContainerView:self canInitListAtIndex:index];
+ if (!canInitList) {
+ return;
+ }
+ }
+ id list = _validListDict[@(index)];
+ if (list != nil) {
+ //列表已经创建好了
+ return;
+ }
+ list = [self.delegate listContainerView:self initListForIndex:index];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [self.containerVC addChildViewController:(UIViewController *)list];
+ }
+ _validListDict[@(index)] = list;
+
+ switch (self.containerType) {
+ case JXPagerListContainerType_ScrollView: {
+ [list listView].frame = CGRectMake(index*self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
+ [self.scrollView addSubview:[list listView]];
+ break;
+ }
+ case JXPagerListContainerType_CollectionView: {
+ UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
+ if (cell != nil) {
+ for (UIView *subview in cell.contentView.subviews) {
+ [subview removeFromSuperview];
+ }
+ [list listView].frame = cell.contentView.bounds;
+ [cell.contentView addSubview:[list listView]];
+ }
+ break;
+ }
+
+ }
+}
+
+- (void)listWillAppear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ id list = _validListDict[@(index)];
+ if (list != nil) {
+ if (list && [list respondsToSelector:@selector(listWillAppear)]) {
+ [list listWillAppear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC beginAppearanceTransition:YES animated:NO];
+ }
+ }else {
+ //当前列表未被创建(页面初始化或通过点击触发的listWillAppear)
+ BOOL canInitList = YES;
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerView:canInitListAtIndex:)]) {
+ canInitList = [self.delegate listContainerView:self canInitListAtIndex:index];
+ }
+ if (canInitList) {
+ id list = _validListDict[@(index)];
+ if (list == nil) {
+ list = [self.delegate listContainerView:self initListForIndex:index];
+ if ([list isKindOfClass:[UIViewController class]]) {
+ [self.containerVC addChildViewController:(UIViewController *)list];
+ }
+ _validListDict[@(index)] = list;
+ }
+ if (self.containerType == JXPagerListContainerType_ScrollView) {
+ if ([list listView].superview == nil) {
+ [list listView].frame = CGRectMake(index*self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
+ [self.scrollView addSubview:[list listView]];
+
+ if (list && [list respondsToSelector:@selector(listWillAppear)]) {
+ [list listWillAppear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC beginAppearanceTransition:YES animated:NO];
+ }
+ }
+ }else {
+ UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
+ for (UIView *subview in cell.contentView.subviews) {
+ [subview removeFromSuperview];
+ }
+ [list listView].frame = cell.contentView.bounds;
+ [cell.contentView addSubview:[list listView]];
+
+ if (list && [list respondsToSelector:@selector(listWillAppear)]) {
+ [list listWillAppear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC beginAppearanceTransition:YES animated:NO];
+ }
+ }
+ }
+ }
+}
+
+- (void)listDidAppear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ self.currentIndex = index;
+ id list = _validListDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listDidAppear)]) {
+ [list listDidAppear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC endAppearanceTransition];
+ }
+ if (self.delegate && [self.delegate respondsToSelector:@selector(listContainerView:listDidAppearAtIndex:)]) {
+ [self.delegate listContainerView:self listDidAppearAtIndex:index];
+ }
+}
+
+- (void)listWillDisappear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ id list = _validListDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listWillDisappear)]) {
+ [list listWillDisappear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC beginAppearanceTransition:NO animated:NO];
+ }
+}
+
+- (void)listDidDisappear:(NSInteger)index {
+ if (![self checkIndexValid:index]) {
+ return;
+ }
+ id list = _validListDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listDidDisappear)]) {
+ [list listDidDisappear];
+ }
+ if ([list isKindOfClass:[UIViewController class]]) {
+ UIViewController *listVC = (UIViewController *)list;
+ [listVC endAppearanceTransition];
+ }
+}
+
+- (BOOL)checkIndexValid:(NSInteger)index {
+ NSUInteger count = [self.delegate numberOfListsInlistContainerView:self];
+ if (count <= 0 || index >= count) {
+ return NO;
+ }
+ return YES;
+}
+
+- (void)listDidAppearOrDisappear:(UIScrollView *)scrollView {
+ CGFloat currentIndexPercent = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ if (self.willAppearIndex != -1 || self.willDisappearIndex != -1) {
+ NSInteger disappearIndex = self.willDisappearIndex;
+ NSInteger appearIndex = self.willAppearIndex;
+ if (self.willAppearIndex > self.willDisappearIndex) {
+ //将要出现的列表在右边
+ if (currentIndexPercent >= self.willAppearIndex) {
+ self.willDisappearIndex = -1;
+ self.willAppearIndex = -1;
+ [self listDidDisappear:disappearIndex];
+ [self listDidAppear:appearIndex];
+ }
+ }else {
+ //将要出现的列表在左边
+ if (currentIndexPercent <= self.willAppearIndex) {
+ self.willDisappearIndex = -1;
+ self.willAppearIndex = -1;
+ [self listDidDisappear:disappearIndex];
+ [self listDidAppear:appearIndex];
+ }
+ }
+ }
+}
+
+@end
+
+
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerListRefreshView.h b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListRefreshView.h
new file mode 100644
index 0000000..e347531
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListRefreshView.h
@@ -0,0 +1,14 @@
+//
+// JXPagingListRefreshView.h
+// JXPagingView
+//
+// Created by jiaxin on 2018/8/28.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXPagerView.h"
+
+@interface JXPagerListRefreshView : JXPagerView
+
+@end
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerListRefreshView.m b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListRefreshView.m
new file mode 100644
index 0000000..c5b371c
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerListRefreshView.m
@@ -0,0 +1,109 @@
+//
+// JXPagerListRefreshView.m
+// JXPagerView
+//
+// Created by jiaxin on 2018/8/28.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXPagerListRefreshView.h"
+
+@interface JXPagerListRefreshView()
+@property (nonatomic, assign) CGFloat lastScrollingListViewContentOffsetY;
+@end
+
+@implementation JXPagerListRefreshView
+
+- (instancetype)initWithDelegate:(id)delegate listContainerType:(JXPagerListContainerType)type {
+ self = [super initWithDelegate:delegate listContainerType:type];
+ if (self) {
+ self.mainTableView.bounces = NO;
+ }
+ return self;
+}
+
+- (void)preferredProcessListViewDidScroll:(UIScrollView *)scrollView {
+ BOOL shouldProcess = YES;
+ if (self.currentScrollingListView.contentOffset.y > self.lastScrollingListViewContentOffsetY) {
+ //往上滚动
+ }else {
+ //往下滚动
+ if (self.mainTableView.contentOffset.y == 0) {
+ shouldProcess = NO;
+ }else {
+ if (self.mainTableView.contentOffset.y < self.mainTableViewMaxContentOffsetY) {
+ //mainTableView的header还没有消失,让listScrollView一直为0
+ if (self.currentList && [self.currentList respondsToSelector:@selector(listScrollViewWillResetContentOffset)]) {
+ [self.currentList listScrollViewWillResetContentOffset];
+ }
+ [self setListScrollViewToMinContentOffsetY:self.currentScrollingListView];
+ if (self.automaticallyDisplayListVerticalScrollIndicator) {
+ self.currentScrollingListView.showsVerticalScrollIndicator = NO;
+ }
+ }
+ }
+ }
+ if (shouldProcess) {
+ if (self.mainTableView.contentOffset.y < self.mainTableViewMaxContentOffsetY) {
+ //处于下拉刷新的状态,scrollView.contentOffset.y为负数,就重置为0
+ if (self.currentScrollingListView.contentOffset.y > [self minContentOffsetYInListScrollView:self.currentScrollingListView]) {
+ //mainTableView的header还没有消失,让listScrollView一直为0
+ if (self.currentList && [self.currentList respondsToSelector:@selector(listScrollViewWillResetContentOffset)]) {
+ [self.currentList listScrollViewWillResetContentOffset];
+ }
+ [self setListScrollViewToMinContentOffsetY:self.currentScrollingListView];
+ if (self.automaticallyDisplayListVerticalScrollIndicator) {
+ self.currentScrollingListView.showsVerticalScrollIndicator = NO;
+ }
+ }
+ } else {
+ //mainTableView的header刚好消失,固定mainTableView的位置,显示listScrollView的滚动条
+ self.mainTableView.contentOffset = CGPointMake(0, self.mainTableViewMaxContentOffsetY);
+ if (self.automaticallyDisplayListVerticalScrollIndicator) {
+ self.currentScrollingListView.showsVerticalScrollIndicator = YES;
+ }
+ }
+ }
+ self.lastScrollingListViewContentOffsetY = self.currentScrollingListView.contentOffset.y;
+}
+
+- (void)preferredProcessMainTableViewDidScroll:(UIScrollView *)scrollView {
+ if (self.pinSectionHeaderVerticalOffset != 0) {
+ if (!(self.currentScrollingListView != nil && self.currentScrollingListView.contentOffset.y > [self minContentOffsetYInListScrollView:self.currentScrollingListView])) {
+ //没有处于滚动某一个listView的状态
+ if (scrollView.contentOffset.y <= 0) {
+ self.mainTableView.bounces = NO;
+ self.mainTableView.contentOffset = CGPointZero;
+ return;
+ }else {
+ self.mainTableView.bounces = YES;
+ }
+ }
+ }
+ if (self.currentScrollingListView != nil && self.currentScrollingListView.contentOffset.y > [self minContentOffsetYInListScrollView:self.currentScrollingListView]) {
+ //mainTableView的header已经滚动不见,开始滚动某一个listView,那么固定mainTableView的contentOffset,让其不动
+ [self setMainTableViewToMaxContentOffsetY];
+ }
+
+ if (scrollView.contentOffset.y < self.mainTableViewMaxContentOffsetY) {
+ //mainTableView已经显示了header,listView的contentOffset需要重置
+ for (id list in self.validListDict.allValues) {
+ //正在下拉刷新时,不需要重置
+ UIScrollView *listScrollView = [list listScrollView];
+ if (listScrollView.contentOffset.y > 0) {
+ if ([list respondsToSelector:@selector(listScrollViewWillResetContentOffset)]) {
+ [list listScrollViewWillResetContentOffset];
+ }
+ [self setListScrollViewToMinContentOffsetY:listScrollView];
+ }
+ }
+ }
+
+ if (scrollView.contentOffset.y > self.mainTableViewMaxContentOffsetY && self.currentScrollingListView.contentOffset.y == [self minContentOffsetYInListScrollView:self.currentScrollingListView]) {
+ //当往上滚动mainTableView的headerView时,滚动到底时,修复listView往上小幅度滚动
+ [self setMainTableViewToMaxContentOffsetY];
+ }
+}
+
+
+@end
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerMainTableView.h b/Pods/JXPagingView/Sources/JXPagerView/JXPagerMainTableView.h
new file mode 100644
index 0000000..baf5cf4
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerMainTableView.h
@@ -0,0 +1,19 @@
+//
+// JXPagingMainTableView.h
+// JXPagingView
+//
+// Created by jiaxin on 2018/8/27.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+
+@protocol JXPagerMainTableViewGestureDelegate
+
+- (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
+
+@end
+
+@interface JXPagerMainTableView : UITableView
+@property (nonatomic, weak) id gestureDelegate;
+@end
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerMainTableView.m b/Pods/JXPagingView/Sources/JXPagerView/JXPagerMainTableView.m
new file mode 100644
index 0000000..8cd9fe6
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerMainTableView.m
@@ -0,0 +1,25 @@
+//
+// JXPagerMainTableView.m
+// JXPagerView
+//
+// Created by jiaxin on 2018/8/27.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXPagerMainTableView.h"
+
+@interface JXPagerMainTableView ()
+
+@end
+
+@implementation JXPagerMainTableView
+
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
+ if (self.gestureDelegate && [self.gestureDelegate respondsToSelector:@selector(mainTableViewGestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:)]) {
+ return [self.gestureDelegate mainTableViewGestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];
+ }else {
+ return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
+ }
+}
+
+@end
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerSmoothView.h b/Pods/JXPagingView/Sources/JXPagerView/JXPagerSmoothView.h
new file mode 100644
index 0000000..246b8e5
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerSmoothView.h
@@ -0,0 +1,91 @@
+//
+// JXPagerSmoothView.h
+// JXPagerViewExample-OC
+//
+// Created by jiaxin on 2019/11/15.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import
+
+@class JXPagerSmoothView;
+
+@protocol JXPagerSmoothViewListViewDelegate
+/**
+返回listView。如果是vc包裹的就是vc.view;如果是自定义view包裹的,就是自定义view自己。
+*/
+- (UIView *)listView;
+/**
+ 返回JXPagerSmoothViewListViewDelegate内部持有的UIScrollView或UITableView或UICollectionView
+ */
+- (UIScrollView *)listScrollView;
+
+@optional
+- (void)listDidAppear;
+- (void)listDidDisappear;
+
+@end
+
+@protocol JXPagerSmoothViewDataSource
+
+/**
+ 返回页面header的高度
+ */
+- (CGFloat)heightForPagerHeaderInPagerView:(JXPagerSmoothView *)pagerView;
+
+/**
+ 返回页面header视图
+ */
+- (UIView *)viewForPagerHeaderInPagerView:(JXPagerSmoothView *)pagerView;
+
+/**
+ 返回悬浮视图的高度
+ */
+- (CGFloat)heightForPinHeaderInPagerView:(JXPagerSmoothView *)pagerView;
+
+/**
+ 返回悬浮视图
+ */
+- (UIView *)viewForPinHeaderInPagerView:(JXPagerSmoothView *)pagerView;
+
+/**
+ 返回列表的数量
+ */
+- (NSInteger)numberOfListsInPagerView:(JXPagerSmoothView *)pagerView;
+
+/**
+ 根据index初始化一个对应列表实例,需要是遵从`JXPagerSmoothViewListViewDelegate`协议的对象。
+ 如果列表是用自定义UIView封装的,就让自定义UIView遵从`JXPagerSmoothViewListViewDelegate`协议,该方法返回自定义UIView即可。
+ 如果列表是用自定义UIViewController封装的,就让自定义UIViewController遵从`JXPagerSmoothViewListViewDelegate`协议,该方法返回自定义UIViewController即可。
+
+ @param pagerView pagerView description
+ @param index index description
+ @return 新生成的列表实例
+ */
+- (id)pagerView:(JXPagerSmoothView *)pagerView initListAtIndex:(NSInteger)index;
+
+@end
+
+@protocol JXPagerSmoothViewDelegate
+- (void)pagerSmoothViewDidScroll:(UIScrollView *)scrollView;
+@end
+
+@interface JXPagerSmoothView : UIView
+
+/**
+ 当前已经加载过的列表:key就是@(index)值,value是对应的列表。
+ */
+@property (nonatomic, strong, readonly) NSDictionary > *listDict;
+@property (nonatomic, strong, readonly) UICollectionView *listCollectionView;
+@property (nonatomic, assign) NSInteger defaultSelectedIndex;
+@property (nonatomic, weak) id delegate;
+
+- (instancetype)initWithDataSource:(id)dataSource NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
+
+- (void)reloadData;
+
+@end
+
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerSmoothView.m b/Pods/JXPagingView/Sources/JXPagerView/JXPagerSmoothView.m
new file mode 100644
index 0000000..69856c0
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerSmoothView.m
@@ -0,0 +1,361 @@
+//
+// JXPagerSmoothView.m
+// JXPagerViewExample-OC
+//
+// Created by jiaxin on 2019/11/15.
+// Copyright © 2019 jiaxin. All rights reserved.
+//
+
+#import "JXPagerSmoothView.h"
+
+static NSString *JXPagerSmoothViewCollectionViewCellIdentifier = @"cell";
+
+@interface JXPagerSmoothCollectionView : UICollectionView
+@property (nonatomic, strong) UIView *pagerHeaderContainerView;
+@end
+@implementation JXPagerSmoothCollectionView
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
+ CGPoint point = [touch locationInView:self.pagerHeaderContainerView];
+ if (CGRectContainsPoint(self.pagerHeaderContainerView.bounds, point)) {
+ return NO;
+ }
+ return YES;
+}
+@end
+
+@interface JXPagerSmoothView ()
+
+@property (nonatomic, weak) id dataSource;
+@property (nonatomic, strong) JXPagerSmoothCollectionView *listCollectionView;
+@property (nonatomic, strong) NSMutableDictionary > *listDict;
+@property (nonatomic, strong) NSMutableDictionary *listHeaderDict;
+@property (nonatomic, assign, getter=isSyncListContentOffsetEnabled) BOOL syncListContentOffsetEnabled;
+@property (nonatomic, strong) UIView *pagerHeaderContainerView;
+@property (nonatomic, assign) CGFloat currentPagerHeaderContainerViewY;
+@property (nonatomic, assign) NSInteger currentIndex;
+@property (nonatomic, strong) UIScrollView *currentListScrollView;
+@property (nonatomic, assign) CGFloat heightForPagerHeader;
+@property (nonatomic, assign) CGFloat heightForPinHeader;
+@property (nonatomic, assign) CGFloat heightForPagerHeaderContainerView;
+@property (nonatomic, assign) CGFloat currentListInitializeContentOffsetY;
+@property (nonatomic, strong) UIScrollView *singleScrollView;
+@end
+
+@implementation JXPagerSmoothView
+
+- (void)dealloc
+{
+ for (id list in self.listDict.allValues) {
+ [[list listScrollView] removeObserver:self forKeyPath:@"contentOffset"];
+ [[list listScrollView] removeObserver:self forKeyPath:@"contentSize"];
+ }
+}
+
+- (instancetype)initWithDataSource:(id)dataSource
+{
+ self = [super initWithFrame:CGRectZero];
+ if (self) {
+ _dataSource = dataSource;
+ _listDict = [NSMutableDictionary dictionary];
+ _listHeaderDict = [NSMutableDictionary dictionary];
+ [self initializeViews];
+ }
+ return self;
+}
+
+- (void)initializeViews {
+ self.pagerHeaderContainerView = [[UIView alloc] init];
+
+ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
+ layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+ layout.minimumLineSpacing = 0;
+ layout.minimumInteritemSpacing = 0;
+ _listCollectionView = [[JXPagerSmoothCollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
+ self.listCollectionView.dataSource = self;
+ self.listCollectionView.delegate = self;
+ self.listCollectionView.pagingEnabled = YES;
+ self.listCollectionView.bounces = NO;
+ self.listCollectionView.showsHorizontalScrollIndicator = NO;
+ self.listCollectionView.scrollsToTop = NO;
+ [self.listCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:JXPagerSmoothViewCollectionViewCellIdentifier];
+ if (@available(iOS 10.0, *)) {
+ self.listCollectionView.prefetchingEnabled = NO;
+ }
+ if (@available(iOS 11.0, *)) {
+ self.listCollectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ _listCollectionView.pagerHeaderContainerView = self.pagerHeaderContainerView;
+ [self addSubview:self.listCollectionView];
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ self.listCollectionView.frame = self.bounds;
+ if (CGRectEqualToRect(self.pagerHeaderContainerView.frame, CGRectZero)) {
+ [self reloadData];
+ }
+ if (self.singleScrollView != nil) {
+ self.singleScrollView.frame = self.bounds;
+ }
+}
+
+- (void)reloadData {
+ self.currentListScrollView = nil;
+ self.currentIndex = self.defaultSelectedIndex;
+ self.currentPagerHeaderContainerViewY = 0;
+ self.syncListContentOffsetEnabled = NO;
+
+ [self.listHeaderDict removeAllObjects];
+ for (id list in self.listDict.allValues) {
+ [[list listScrollView] removeObserver:self forKeyPath:@"contentOffset"];
+ [[list listScrollView] removeObserver:self forKeyPath:@"contentSize"];
+ [[list listView] removeFromSuperview];
+ }
+ [_listDict removeAllObjects];
+
+ self.heightForPagerHeader = [self.dataSource heightForPagerHeaderInPagerView:self];
+ self.heightForPinHeader = [self.dataSource heightForPinHeaderInPagerView:self];
+ self.heightForPagerHeaderContainerView = self.heightForPagerHeader + self.heightForPinHeader;
+
+ UIView *pagerHeader = [self.dataSource viewForPagerHeaderInPagerView:self];
+ UIView *pinHeader = [self.dataSource viewForPinHeaderInPagerView:self];
+ [self.pagerHeaderContainerView addSubview:pagerHeader];
+ [self.pagerHeaderContainerView addSubview:pinHeader];
+
+ self.pagerHeaderContainerView.frame = CGRectMake(0, 0, self.bounds.size.width, self.heightForPagerHeaderContainerView);
+ pagerHeader.frame = CGRectMake(0, 0, self.bounds.size.width, self.heightForPagerHeader);
+ pinHeader.frame = CGRectMake(0, self.heightForPagerHeader, self.bounds.size.width, self.heightForPinHeader);
+ [self.listCollectionView setContentOffset:CGPointMake(self.listCollectionView.bounds.size.width*self.defaultSelectedIndex, 0) animated:NO];
+ [self.listCollectionView reloadData];
+
+ if ([self.dataSource numberOfListsInPagerView:self] == 0) {
+ self.singleScrollView = [[UIScrollView alloc] init];
+ [self addSubview:self.singleScrollView];
+ [self.singleScrollView addSubview:pagerHeader];
+ self.singleScrollView.contentSize = CGSizeMake(self.bounds.size.width, self.heightForPagerHeader);
+ }else if (self.singleScrollView != nil) {
+ [self.singleScrollView removeFromSuperview];
+ self.singleScrollView = nil;
+ }
+}
+
+#pragma mark - UICollectionViewDataSource & UICollectionViewDelegateFlowLayout
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
+ return self.bounds.size;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
+ return [self.dataSource numberOfListsInPagerView:self];
+}
+
+- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+ UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:JXPagerSmoothViewCollectionViewCellIdentifier forIndexPath:indexPath];
+ id list = self.listDict[@(indexPath.item)];
+ if (list == nil) {
+ list = [self.dataSource pagerView:self initListAtIndex:indexPath.item];
+ _listDict[@(indexPath.item)] = list;
+ [[list listView] setNeedsLayout];
+ [[list listView] layoutIfNeeded];
+ UIScrollView *listScrollView = [list listScrollView];
+ if ([listScrollView isKindOfClass:[UITableView class]]) {
+ ((UITableView *)listScrollView).estimatedRowHeight = 0;
+ ((UITableView *)listScrollView).estimatedSectionFooterHeight = 0;
+ ((UITableView *)listScrollView).estimatedSectionHeaderHeight = 0;
+ }
+ if (@available(iOS 11.0, *)) {
+ listScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+ listScrollView.contentInset = UIEdgeInsetsMake(self.heightForPagerHeaderContainerView, 0, 0, 0);
+ self.currentListInitializeContentOffsetY = -listScrollView.contentInset.top + MIN(-self.currentPagerHeaderContainerViewY, self.heightForPagerHeader);
+ listScrollView.contentOffset = CGPointMake(0, self.currentListInitializeContentOffsetY);
+ UIView *listHeader = [[UIView alloc] initWithFrame:CGRectMake(0, -self.heightForPagerHeaderContainerView, self.bounds.size.width, self.heightForPagerHeaderContainerView)];
+ [listScrollView addSubview:listHeader];
+ if (self.pagerHeaderContainerView.superview == nil) {
+ [listHeader addSubview:self.pagerHeaderContainerView];
+ }
+ self.listHeaderDict[@(indexPath.item)] = listHeader;
+ [listScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
+ [listScrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
+ }
+ for (id listItem in self.listDict.allValues) {
+ [listItem listScrollView].scrollsToTop = (listItem == list);
+ }
+ UIView *listView = [list listView];
+ if (listView != nil && listView.superview != cell.contentView) {
+ for (UIView *view in cell.contentView.subviews) {
+ [view removeFromSuperview];
+ }
+ listView.frame = cell.contentView.bounds;
+ [cell.contentView addSubview:listView];
+ }
+ return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
+ [self listDidAppear:indexPath.item];
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
+ [self listDidDisappear:indexPath.item];
+}
+
+- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerSmoothViewDidScroll:)]) {
+ [self.delegate pagerSmoothViewDidScroll:scrollView];
+ }
+ CGFloat indexPercent = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ NSInteger index = floor(indexPercent);
+ UIScrollView *listScrollView = [self.listDict[@(index)] listScrollView];
+ if (indexPercent - index == 0 && index != self.currentIndex && !(scrollView.isDragging || scrollView.isDecelerating) && listScrollView.contentOffset.y <= -self.heightForPinHeader) {
+ [self horizontalScrollDidEndAtIndex:index];
+ }else {
+ //左右滚动的时候,就把listHeaderContainerView添加到self,达到悬浮在顶部的效果
+ if (self.pagerHeaderContainerView.superview != self) {
+ self.pagerHeaderContainerView.frame = CGRectMake(0, self.currentPagerHeaderContainerViewY, self.pagerHeaderContainerView.bounds.size.width, self.pagerHeaderContainerView.bounds.size.height);
+ [self addSubview:self.pagerHeaderContainerView];
+ }
+ }
+ if (index != self.currentIndex) {
+ self.currentIndex = index;
+ }
+}
+
+- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
+ if (!decelerate) {
+ NSInteger index = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ [self horizontalScrollDidEndAtIndex:index];
+ }
+}
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
+ NSInteger index = scrollView.contentOffset.x/scrollView.bounds.size.width;
+ [self horizontalScrollDidEndAtIndex:index];
+}
+
+#pragma mark - KVO
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
+ if ([keyPath isEqualToString:@"contentOffset"]) {
+ UIScrollView *scrollView = (UIScrollView *)object;
+ if (scrollView != nil) {
+ [self listDidScroll:scrollView];
+ }
+ }else if([keyPath isEqualToString:@"contentSize"]) {
+ UIScrollView *scrollView = (UIScrollView *)object;
+ if (scrollView != nil) {
+ CGFloat minContentSizeHeight = self.bounds.size.height - self.heightForPinHeader;
+ if (minContentSizeHeight > scrollView.contentSize.height) {
+ scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, minContentSizeHeight);
+ //新的scrollView第一次加载的时候重置contentOffset
+ if (_currentListScrollView != nil && scrollView != _currentListScrollView) {
+ scrollView.contentOffset = CGPointMake(0, self.currentListInitializeContentOffsetY);
+ }
+ }
+ }
+ }else {
+ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+ }
+}
+
+#pragma mark - Event
+
+- (void)listDidScroll:(UIScrollView *)scrollView {
+ if (self.listCollectionView.isDragging || self.listCollectionView.isDecelerating) {
+ return;
+ }
+ NSInteger listIndex = [self listIndexForListScrollView:scrollView];
+ if (listIndex != self.currentIndex) {
+ return;
+ }
+ self.currentListScrollView = scrollView;
+ CGFloat contentOffsetY = scrollView.contentOffset.y + self.heightForPagerHeaderContainerView;
+ if (contentOffsetY < self.heightForPagerHeader) {
+ self.syncListContentOffsetEnabled = YES;
+ self.currentPagerHeaderContainerViewY = -contentOffsetY;
+ for (id list in self.listDict.allValues) {
+ if ([list listScrollView] != self.currentListScrollView) {
+ [[list listScrollView] setContentOffset:scrollView.contentOffset animated:NO];
+ }
+ }
+ UIView *listHeader = [self listHeaderForListScrollView:scrollView];
+ if (self.pagerHeaderContainerView.superview != listHeader) {
+ self.pagerHeaderContainerView.frame = CGRectMake(0, 0, self.pagerHeaderContainerView.bounds.size.width, self.pagerHeaderContainerView.bounds.size.height);
+ [listHeader addSubview:self.pagerHeaderContainerView];
+ }
+ }else {
+ if (self.pagerHeaderContainerView.superview != self) {
+ self.pagerHeaderContainerView.frame = CGRectMake(0, -self.heightForPagerHeader, self.pagerHeaderContainerView.bounds.size.width, self.pagerHeaderContainerView.bounds.size.height);
+ [self addSubview:self.pagerHeaderContainerView];
+ }
+ if (self.isSyncListContentOffsetEnabled) {
+ self.syncListContentOffsetEnabled = NO;
+ self.currentPagerHeaderContainerViewY = -self.heightForPagerHeader;
+ for (id list in self.listDict.allValues) {
+ if ([list listScrollView] != scrollView) {
+ [[list listScrollView] setContentOffset:CGPointMake(0, -self.heightForPinHeader) animated:NO];
+ }
+ }
+ }
+ }
+}
+
+#pragma mark - Private
+
+- (UIView *)listHeaderForListScrollView:(UIScrollView *)scrollView {
+ for (NSNumber *index in self.listDict) {
+ if ([self.listDict[index] listScrollView] == scrollView) {
+ return self.listHeaderDict[index];
+ }
+ }
+ return nil;
+}
+
+- (NSInteger)listIndexForListScrollView:(UIScrollView *)scrollView {
+ for (NSNumber *index in self.listDict) {
+ if ([self.listDict[index] listScrollView] == scrollView) {
+ return [index integerValue];
+ }
+ }
+ return 0;
+}
+
+- (void)listDidAppear:(NSInteger)index {
+ NSUInteger count = [self.dataSource numberOfListsInPagerView:self];
+ if (count <= 0 || index >= count) {
+ return;
+ }
+
+ id list = self.listDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listDidAppear)]) {
+ [list listDidAppear];
+ }
+}
+
+- (void)listDidDisappear:(NSInteger)index {
+ NSUInteger count = [self.dataSource numberOfListsInPagerView:self];
+ if (count <= 0 || index >= count) {
+ return;
+ }
+ id list = self.listDict[@(index)];
+ if (list && [list respondsToSelector:@selector(listDidDisappear)]) {
+ [list listDidDisappear];
+ }
+}
+
+/// 列表左右切换滚动结束之后,需要把pagerHeaderContainerView添加到当前index的列表上面
+- (void)horizontalScrollDidEndAtIndex:(NSInteger)index {
+ self.currentIndex = index;
+ UIView *listHeader = self.listHeaderDict[@(index)];
+ UIScrollView *listScrollView = [self.listDict[@(index)] listScrollView];
+ if (listHeader != nil && listScrollView.contentOffset.y <= -self.heightForPinHeader) {
+ for (id listItem in self.listDict.allValues) {
+ [listItem listScrollView].scrollsToTop = ([listItem listScrollView] == listScrollView);
+ }
+ self.pagerHeaderContainerView.frame = CGRectMake(0, 0, self.pagerHeaderContainerView.bounds.size.width, self.pagerHeaderContainerView.bounds.size.height);
+ [listHeader addSubview:self.pagerHeaderContainerView];
+ }
+}
+
+@end
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerView.h b/Pods/JXPagingView/Sources/JXPagerView/JXPagerView.h
new file mode 100644
index 0000000..3dd6c6a
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerView.h
@@ -0,0 +1,131 @@
+//
+// JXPagerView.h
+// JXPagerView
+//
+// Created by jiaxin on 2018/8/27.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import
+#import "JXPagerMainTableView.h"
+#import "JXPagerListContainerView.h"
+@class JXPagerView;
+
+@protocol JXPagerViewDelegate
+
+/**
+ 返回tableHeaderView的高度,因为内部需要比对判断,只能是整型数
+ */
+- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView;
+
+/**
+ 返回tableHeaderView
+ */
+- (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView;
+
+/**
+ 返回悬浮HeaderView的高度,因为内部需要比对判断,只能是整型数
+ */
+- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView;
+
+/**
+ 返回悬浮HeaderView。我用的是自己封装的JXCategoryView(Github:https://github.com/pujiaxin33/JXCategoryView),你也可以选择其他的三方库或者自己写
+ */
+- (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView;
+
+/**
+ 返回列表的数量
+ */
+- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView;
+
+/**
+ 根据index初始化一个对应列表实例,需要是遵从`JXPagerViewListViewDelegate`协议的对象。
+ 如果列表是用自定义UIView封装的,就让自定义UIView遵从`JXPagerViewListViewDelegate`协议,该方法返回自定义UIView即可。
+ 如果列表是用自定义UIViewController封装的,就让自定义UIViewController遵从`JXPagerViewListViewDelegate`协议,该方法返回自定义UIViewController即可。
+ 注意:一定要是新生成的实例!!!
+
+ @param pagerView pagerView description
+ @param index index description
+ @return 新生成的列表实例
+ */
+- (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index;
+
+@optional
+
+/// 返回对应index的列表唯一标识
+/// @param pagerView pagerView description
+/// @param index index description
+- (NSString *)pagerView:(JXPagerView *)pagerView listIdentifierAtIndex:(NSInteger)index;
+- (void)mainTableViewDidScroll:(UIScrollView *)scrollView __attribute__ ((deprecated));
+- (void)pagerView:(JXPagerView *)pagerView mainTableViewDidScroll:(UIScrollView *)scrollView;
+- (void)pagerView:(JXPagerView *)pagerView mainTableViewWillBeginDragging:(UIScrollView *)scrollView;
+- (void)pagerView:(JXPagerView *)pagerView mainTableViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
+- (void)pagerView:(JXPagerView *)pagerView mainTableViewDidEndDecelerating:(UIScrollView *)scrollView;
+- (void)pagerView:(JXPagerView *)pagerView mainTableViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
+
+/**
+ 返回自定义UIScrollView或UICollectionView的Class
+ 某些特殊情况需要自己处理列表容器内UIScrollView内部逻辑。比如项目用了FDFullscreenPopGesture,需要处理手势相关代理。
+
+ @param pagerView JXPagerView
+ @return 自定义UIScrollView实例
+ */
+- (Class)scrollViewClassInlistContainerViewInPagerView:(JXPagerView *)pagerView;
+
+@end
+
+@interface JXPagerView : UIView
+/**
+ 需要和self.categoryView.defaultSelectedIndex保持一致
+ */
+@property (nonatomic, assign) NSInteger defaultSelectedIndex;
+@property (nonatomic, strong, readonly) JXPagerMainTableView *mainTableView;
+@property (nonatomic, strong, readonly) JXPagerListContainerView *listContainerView;
+/**
+ 当前已经加载过可用的列表字典,key就是index值,value是对应的列表。
+ */
+@property (nonatomic, strong, readonly) NSDictionary > *validListDict;
+/**
+ 顶部固定sectionHeader的垂直偏移量。数值越大越往下沉。
+ */
+@property (nonatomic, assign) NSInteger pinSectionHeaderVerticalOffset;
+/**
+ 是否允许列表左右滑动。默认:YES
+ */
+@property (nonatomic, assign) BOOL isListHorizontalScrollEnabled;
+/**
+ 是否允许当前列表自动显示或隐藏列表是垂直滚动指示器。YES:悬浮的headerView滚动到顶部开始滚动列表时,就会显示,反之隐藏。NO:内部不会处理列表的垂直滚动指示器。默认为:YES。
+ */
+@property (nonatomic, assign) BOOL automaticallyDisplayListVerticalScrollIndicator;
+/**
+ 当allowsCacheList为true时,请务必实现代理方法`- (NSString *)pagerView:(JXPagerView *)pagerView listIdentifierAtIndex:(NSInteger)index`
+ */
+@property (nonatomic, assign) BOOL allowsCacheList;
+
+- (instancetype)initWithDelegate:(id)delegate;
+- (instancetype)initWithDelegate:(id)delegate listContainerType:(JXPagerListContainerType)type NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
+- (void)reloadData;
+- (void)resizeTableHeaderViewHeightWithAnimatable:(BOOL)animatable duration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve;
+
+@end
+
+/**
+暴露给子类使用,请勿直接使用相关属性和方法!
+*/
+@interface JXPagerView (UISubclassingGet)
+@property (nonatomic, strong, readonly) UIScrollView *currentScrollingListView;
+@property (nonatomic, strong, readonly) id currentList;
+@property (nonatomic, assign, readonly) CGFloat mainTableViewMaxContentOffsetY;
+@end
+
+@interface JXPagerView (UISubclassingHooks)
+- (void)preferredProcessListViewDidScroll:(UIScrollView *)scrollView;
+- (void)preferredProcessMainTableViewDidScroll:(UIScrollView *)scrollView;
+- (void)setMainTableViewToMaxContentOffsetY;
+- (void)setListScrollViewToMinContentOffsetY:(UIScrollView *)scrollView;
+- (CGFloat)minContentOffsetYInListScrollView:(UIScrollView *)scrollView;
+@end
+
diff --git a/Pods/JXPagingView/Sources/JXPagerView/JXPagerView.m b/Pods/JXPagingView/Sources/JXPagerView/JXPagerView.m
new file mode 100644
index 0000000..cb57ae7
--- /dev/null
+++ b/Pods/JXPagingView/Sources/JXPagerView/JXPagerView.m
@@ -0,0 +1,409 @@
+//
+// JXPagerView.m
+// JXPagerView
+//
+// Created by jiaxin on 2018/8/27.
+// Copyright © 2018年 jiaxin. All rights reserved.
+//
+
+#import "JXPagerView.h"
+@class JXPagerListContainerScrollView;
+@class JXPagerListContainerCollectionView;
+
+@interface JXPagerView ()
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, strong) JXPagerMainTableView *mainTableView;
+@property (nonatomic, strong) JXPagerListContainerView *listContainerView;
+@property (nonatomic, strong) UIScrollView *currentScrollingListView;
+@property (nonatomic, strong) id currentList;
+@property (nonatomic, strong) NSMutableDictionary > *validListDict;
+@property (nonatomic, strong) UIView *tableHeaderContainerView;
+@property (nonatomic, strong) NSMutableDictionary> *listCache;
+@end
+
+@implementation JXPagerView
+
+- (instancetype)initWithDelegate:(id)delegate {
+ return [self initWithDelegate:delegate listContainerType:JXPagerListContainerType_CollectionView];
+}
+
+- (instancetype)initWithDelegate:(id)delegate listContainerType:(JXPagerListContainerType)type {
+ self = [super initWithFrame:CGRectZero];
+ if (self) {
+ _delegate = delegate;
+ _validListDict = [NSMutableDictionary dictionary];
+ _automaticallyDisplayListVerticalScrollIndicator = YES;
+ _isListHorizontalScrollEnabled = YES;
+
+ _mainTableView = [[JXPagerMainTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+ self.mainTableView.showsVerticalScrollIndicator = NO;
+ self.mainTableView.showsHorizontalScrollIndicator = NO;
+ self.mainTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+ self.mainTableView.scrollsToTop = NO;
+ self.mainTableView.dataSource = self;
+ self.mainTableView.delegate = self;
+ [self refreshTableHeaderView];
+ [self.mainTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
+ if (@available(iOS 11.0, *)) {
+ self.mainTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ }
+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
+ if (@available(iOS 15.0, *)) {
+ self.mainTableView.sectionHeaderTopPadding = 0;
+ }
+#endif
+ [self addSubview:self.mainTableView];
+
+ _listContainerView = [[JXPagerListContainerView alloc] initWithType:type delegate:self];
+ }
+ return self;
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ if (!CGRectEqualToRect(self.bounds, self.mainTableView.frame)) {
+ self.mainTableView.frame = self.bounds;
+ [self.mainTableView reloadData];
+ }
+}
+
+- (void)setDefaultSelectedIndex:(NSInteger)defaultSelectedIndex {
+ _defaultSelectedIndex = defaultSelectedIndex;
+
+ self.listContainerView.defaultSelectedIndex = defaultSelectedIndex;
+}
+
+- (void)setIsListHorizontalScrollEnabled:(BOOL)isListHorizontalScrollEnabled {
+ _isListHorizontalScrollEnabled = isListHorizontalScrollEnabled;
+
+ self.listContainerView.scrollView.scrollEnabled = isListHorizontalScrollEnabled;
+}
+
+- (void)reloadData {
+ self.currentList = nil;
+ self.currentScrollingListView = nil;
+ [_validListDict removeAllObjects];
+ //根据新数据删除不需要的list
+ if (self.allowsCacheList) {
+ NSMutableArray *newListIdentifierArray = [NSMutableArray array];
+ if (self.delegate && [self.delegate respondsToSelector:@selector(numberOfListsInPagerView:)]) {
+ NSInteger listCount = [self.delegate numberOfListsInPagerView:self];
+ for (NSInteger index = 0; index < listCount; index ++) {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerView:listIdentifierAtIndex:)]) {
+ NSString *listIdentifier = [self.delegate pagerView:self listIdentifierAtIndex:index];
+ [newListIdentifierArray addObject:listIdentifier];
+ }
+ }
+ }
+ NSArray *existedKeys = self.listCache.allKeys;
+ for (NSString *listIdentifier in existedKeys) {
+ if (![newListIdentifierArray containsObject:listIdentifier]) {
+ [self.listCache removeObjectForKey:listIdentifier];
+ }
+ }
+ }
+ [self refreshTableHeaderView];
+ if (self.pinSectionHeaderVerticalOffset != 0 && self.mainTableView.contentOffset.y > self.pinSectionHeaderVerticalOffset) {
+ self.mainTableView.contentOffset = CGPointZero;
+ }
+ [self.mainTableView reloadData];
+ [self.listContainerView reloadData];
+}
+
+- (void)resizeTableHeaderViewHeightWithAnimatable:(BOOL)animatable duration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve {
+ if (animatable) {
+ UIViewAnimationOptions options = UIViewAnimationOptionCurveLinear;
+ switch (curve) {
+ case UIViewAnimationCurveEaseIn: options = UIViewAnimationOptionCurveEaseIn; break;
+ case UIViewAnimationCurveEaseOut: options = UIViewAnimationOptionCurveEaseOut; break;
+ case UIViewAnimationCurveEaseInOut: options = UIViewAnimationOptionCurveEaseInOut; break;
+ default: break;
+ }
+ [UIView animateWithDuration:duration delay:0 options:options animations:^{
+ CGRect frame = self.tableHeaderContainerView.bounds;
+ frame.size.height = [self.delegate tableHeaderViewHeightInPagerView:self];
+ self.tableHeaderContainerView.frame = frame;
+ self.mainTableView.tableHeaderView = self.tableHeaderContainerView;
+ [self.mainTableView setNeedsLayout];
+ [self.mainTableView layoutIfNeeded];
+ } completion:^(BOOL finished) { }];
+ }else {
+ CGRect frame = self.tableHeaderContainerView.bounds;
+ frame.size.height = [self.delegate tableHeaderViewHeightInPagerView:self];
+ self.tableHeaderContainerView.frame = frame;
+ self.mainTableView.tableHeaderView = self.tableHeaderContainerView;
+ }
+}
+
+#pragma mark - Private
+
+- (void)refreshTableHeaderView {
+ UIView *tableHeaderView = [self.delegate tableHeaderViewInPagerView:self];
+ UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, [self.delegate tableHeaderViewHeightInPagerView:self])];
+ [containerView addSubview:tableHeaderView];
+ tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO;
+ NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:tableHeaderView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:containerView attribute:NSLayoutAttributeTop multiplier:1 constant:0];
+ NSLayoutConstraint *leading = [NSLayoutConstraint constraintWithItem:tableHeaderView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:containerView attribute:NSLayoutAttributeLeading multiplier:1 constant:0];
+ NSLayoutConstraint *bottom = [NSLayoutConstraint constraintWithItem:tableHeaderView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:containerView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
+ NSLayoutConstraint *trailing = [NSLayoutConstraint constraintWithItem:tableHeaderView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:containerView attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];
+ [containerView addConstraints:@[top, leading, bottom, trailing]];
+ self.tableHeaderContainerView = containerView;
+ self.mainTableView.tableHeaderView = containerView;
+}
+
+- (void)adjustMainScrollViewToTargetContentInsetIfNeeded:(UIEdgeInsets)insets {
+ if (UIEdgeInsetsEqualToEdgeInsets(insets, self.mainTableView.contentInset) == NO) {
+ self.mainTableView.delegate = nil;
+ self.mainTableView.contentInset = insets;
+ self.mainTableView.delegate = self;
+ }
+}
+
+- (void)listViewDidScroll:(UIScrollView *)scrollView {
+ self.currentScrollingListView = scrollView;
+ [self preferredProcessListViewDidScroll:scrollView];
+}
+
+//仅用于处理设置了pinSectionHeaderVerticalOffset,又添加了MJRefresh的下拉刷新。这种情况会导致JXPagingView和MJRefresh来回设置contentInset值。针对这种及其特殊的情况,就内部特殊处理了。通过下面的判断条件,来判定当前是否处于下拉刷新中。请勿让pinSectionHeaderVerticalOffset和下拉刷新设置的contentInset.top值相同。
+//具体原因参考:https://github.com/pujiaxin33/JXPagingView/issues/203
+- (BOOL)isSetMainScrollViewContentInsetToZeroEnabled:(UIScrollView *)scrollView {
+ //scrollView.contentInset.top不为0,且scrollView.contentInset.top不等于pinSectionHeaderVerticalOffset,即可认为列表正在刷新。所以这里必须要保证pinSectionHeaderVerticalOffset和MJRefresh的mj_insetT的值不相等。
+ BOOL isRefreshing = scrollView.contentInset.top != 0 && scrollView.contentInset.top != self.pinSectionHeaderVerticalOffset;
+ return !isRefreshing;
+}
+
+#pragma mark - UITableViewDataSource, UITableViewDelegate
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return 1;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return MAX(self.bounds.size.height - [self.delegate heightForPinSectionHeaderInPagerView:self] - self.pinSectionHeaderVerticalOffset, 0);
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
+ cell.selectionStyle = UITableViewCellSelectionStyleNone;
+ cell.backgroundColor = [UIColor clearColor];
+ if (self.listContainerView.superview != cell.contentView) {
+ [cell.contentView addSubview:self.listContainerView];
+ }
+ if (!CGRectEqualToRect(self.listContainerView.frame, cell.bounds)) {
+ self.listContainerView.frame = cell.bounds;
+ }
+ return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
+ return [self.delegate heightForPinSectionHeaderInPagerView:self];
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+ return [self.delegate viewForPinSectionHeaderInPagerView:self];
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
+ return 1;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
+ UIView *footer = [[UIView alloc] initWithFrame:CGRectZero];
+ footer.backgroundColor = [UIColor clearColor];
+ return footer;
+}
+
+- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
+ if (self.pinSectionHeaderVerticalOffset != 0) {
+ if (!(self.currentScrollingListView != nil && self.currentScrollingListView.contentOffset.y > [self minContentOffsetYInListScrollView:self.currentScrollingListView])) {
+ //没有处于滚动某一个listView的状态
+ if (scrollView.contentOffset.y >= self.pinSectionHeaderVerticalOffset) {
+ //固定的位置就是contentInset.top
+ [self adjustMainScrollViewToTargetContentInsetIfNeeded:UIEdgeInsetsMake(self.pinSectionHeaderVerticalOffset, 0, 0, 0)];
+ }else {
+ if ([self isSetMainScrollViewContentInsetToZeroEnabled:scrollView]) {
+ [self adjustMainScrollViewToTargetContentInsetIfNeeded:UIEdgeInsetsZero];
+ }
+ }
+ }
+ }
+ [self preferredProcessMainTableViewDidScroll:scrollView];
+ if (self.delegate && [self.delegate respondsToSelector:@selector(mainTableViewDidScroll:)]) {
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ [self.delegate mainTableViewDidScroll:scrollView];
+ #pragma GCC diagnostic pop
+ }
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerView:mainTableViewDidScroll:)]) {
+ [self.delegate pagerView:self mainTableViewDidScroll:scrollView];
+ }
+}
+
+- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
+ self.listContainerView.scrollView.scrollEnabled = NO;
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerView:mainTableViewWillBeginDragging:)]) {
+ [self.delegate pagerView:self mainTableViewWillBeginDragging:scrollView];
+ }
+}
+
+- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
+ if (self.isListHorizontalScrollEnabled && !decelerate) {
+ self.listContainerView.scrollView.scrollEnabled = YES;
+ }
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerView:mainTableViewDidEndDragging:willDecelerate:)]) {
+ [self.delegate pagerView:self mainTableViewDidEndDragging:scrollView willDecelerate:decelerate];
+ }
+}
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
+ if (self.isListHorizontalScrollEnabled) {
+ self.listContainerView.scrollView.scrollEnabled = YES;
+ }
+ if ([self isSetMainScrollViewContentInsetToZeroEnabled:scrollView]) {
+ if (self.mainTableView.contentInset.top != 0 && self.pinSectionHeaderVerticalOffset != 0) {
+ [self adjustMainScrollViewToTargetContentInsetIfNeeded:UIEdgeInsetsZero];
+ }
+ }
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerView:mainTableViewDidEndDecelerating:)]) {
+ [self.delegate pagerView:self mainTableViewDidEndDecelerating:scrollView];
+ }
+}
+
+- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
+ if (self.isListHorizontalScrollEnabled) {
+ self.listContainerView.scrollView.scrollEnabled = YES;
+ }
+ if (self.delegate && [self.delegate respondsToSelector:@selector(pagerView:mainTableViewDidEndScrollingAnimation:)]) {
+ [self.delegate pagerView:self mainTableViewDidEndScrollingAnimation:scrollView];
+ }
+}
+
+#pragma mark - JXPagerListContainerViewDelegate
+
+- (NSInteger)numberOfListsInlistContainerView:(JXPagerListContainerView *)listContainerView {
+ return [self.delegate numberOfListsInPagerView:self];
+}
+
+- (id)listContainerView:(JXPagerListContainerView *)listContainerView initListForIndex:(NSInteger)index {
+ id list = self.validListDict[@(index)];
+ if (list == nil) {
+ if (self.allowsCacheList && self.delegate && [self.delegate respondsToSelector:@selector(pagerView:listIdentifierAtIndex:)]) {
+ NSString *listIdentifier = [self.delegate pagerView:self listIdentifierAtIndex:index];
+ list = self.listCache[listIdentifier];
+ }
+ }
+ if (list == nil) {
+ list = [self.delegate pagerView:self initListAtIndex:index];
+ __weak typeof(self)weakSelf = self;
+ __weak typeof(id) weakList = list;
+ [list listViewDidScrollCallback:^(UIScrollView *scrollView) {
+ weakSelf.currentList = weakList;
+ [weakSelf listViewDidScroll:scrollView];
+ }];
+ _validListDict[@(index)] = list;
+ if (self.allowsCacheList && self.delegate && [self.delegate respondsToSelector:@selector(pagerView:listIdentifierAtIndex:)]) {
+ NSString *listIdentifier = [self.delegate pagerView:self listIdentifierAtIndex:index];
+ self.listCache[listIdentifier] = list;
+ }
+ }
+ return list;
+}
+
+
+- (void)listContainerViewWillBeginDragging:(JXPagerListContainerView *)listContainerView {
+ self.mainTableView.scrollEnabled = NO;
+}
+
+- (void)listContainerViewWDidEndScroll:(JXPagerListContainerView *)listContainerView {
+ self.mainTableView.scrollEnabled = YES;
+}
+
+- (void)listContainerView:(JXPagerListContainerView *)listContainerView listDidAppearAtIndex:(NSInteger)index {
+ self.currentScrollingListView = [self.validListDict[@(index)] listScrollView];
+ for (id listItem in self.validListDict.allValues) {
+ if (listItem == self.validListDict[@(index)]) {
+ [listItem listScrollView].scrollsToTop = YES;
+ }else {
+ [listItem listScrollView].scrollsToTop = NO;
+ }
+ }
+}
+
+- (Class)scrollViewClassInlistContainerView:(JXPagerListContainerView *)listContainerView {
+ if (self.delegate && [self.delegate respondsToSelector:@selector(scrollViewClassInlistContainerViewInPagerView:)]) {
+ return [self.delegate scrollViewClassInlistContainerViewInPagerView:self];
+ }
+ return nil;
+}
+
+@end
+
+@implementation JXPagerView (UISubclassingGet)
+
+- (CGFloat)mainTableViewMaxContentOffsetY {
+ return [self.delegate tableHeaderViewHeightInPagerView:self] - self.pinSectionHeaderVerticalOffset;
+}
+
+@end
+
+@implementation JXPagerView (UISubclassingHooks)
+
+- (void)preferredProcessListViewDidScroll:(UIScrollView *)scrollView {
+ if (self.mainTableView.contentOffset.y < self.mainTableViewMaxContentOffsetY) {
+ //mainTableView的header还没有消失,让listScrollView一直为0
+ if (self.currentList && [self.currentList respondsToSelector:@selector(listScrollViewWillResetContentOffset)]) {
+ [self.currentList listScrollViewWillResetContentOffset];
+ }
+ [self setListScrollViewToMinContentOffsetY:scrollView];
+ if (self.automaticallyDisplayListVerticalScrollIndicator) {
+ scrollView.showsVerticalScrollIndicator = NO;
+ }
+ }else {
+ //mainTableView的header刚好消失,固定mainTableView的位置,显示listScrollView的滚动条
+ self.mainTableView.contentOffset = CGPointMake(0, self.mainTableViewMaxContentOffsetY);
+ if (self.automaticallyDisplayListVerticalScrollIndicator) {
+ scrollView.showsVerticalScrollIndicator = YES;
+ }
+ }
+}
+
+- (void)preferredProcessMainTableViewDidScroll:(UIScrollView *)scrollView {
+ if (self.currentScrollingListView != nil && self.currentScrollingListView.contentOffset.y > [self minContentOffsetYInListScrollView:self.currentScrollingListView]) {
+ //mainTableView的header已经滚动不见,开始滚动某一个listView,那么固定mainTableView的contentOffset,让其不动
+ [self setMainTableViewToMaxContentOffsetY];
+ }
+
+ if (scrollView.contentOffset.y < self.mainTableViewMaxContentOffsetY) {
+ //mainTableView已经显示了header,listView的contentOffset需要重置
+ for (id list in self.validListDict.allValues) {
+ if ([list respondsToSelector:@selector(listScrollViewWillResetContentOffset)]) {
+ [list listScrollViewWillResetContentOffset];
+ }
+ [self setListScrollViewToMinContentOffsetY:[list listScrollView]];
+ }
+ }
+
+ if (scrollView.contentOffset.y > self.mainTableViewMaxContentOffsetY && self.currentScrollingListView.contentOffset.y == [self minContentOffsetYInListScrollView:self.currentScrollingListView]) {
+ //当往上滚动mainTableView的headerView时,滚动到底时,修复listView往上小幅度滚动
+ [self setMainTableViewToMaxContentOffsetY];
+ }
+}
+
+- (void)setMainTableViewToMaxContentOffsetY {
+ self.mainTableView.contentOffset = CGPointMake(0, self.mainTableViewMaxContentOffsetY);
+}
+
+- (void)setListScrollViewToMinContentOffsetY:(UIScrollView *)scrollView {
+ scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, [self minContentOffsetYInListScrollView:scrollView]);
+}
+
+- (CGFloat)minContentOffsetYInListScrollView:(UIScrollView *)scrollView {
+ if (@available(iOS 11.0, *)) {
+ return -scrollView.adjustedContentInset.top;
+ }
+ return -scrollView.contentInset.top;
+}
+
+
+@end
diff --git a/Pods/JXPagingView/Sources/PrivacyInfo.xcprivacy b/Pods/JXPagingView/Sources/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/JXPagingView/Sources/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock
index a8812f6..9ed0f51 100644
--- a/Pods/Manifest.lock
+++ b/Pods/Manifest.lock
@@ -18,6 +18,8 @@ PODS:
- DZNEmptyDataSet (1.8.1)
- FLAnimatedImage (1.0.17)
- HWPanModal (0.9.9)
+ - JXCategoryView (1.6.8)
+ - JXPagingView/Pager (2.1.3)
- LookinServer (1.2.8):
- LookinServer/Core (= 1.2.8)
- LookinServer/Core (1.2.8)
@@ -41,6 +43,8 @@ DEPENDENCIES:
- DZNEmptyDataSet (= 1.8.1)
- FLAnimatedImage (~> 1.0.17)
- HWPanModal (~> 0.9.9)
+ - JXCategoryView
+ - JXPagingView/Pager (~> 2.1.3)
- LookinServer
- LSTPopView (~> 0.3.10)
- Masonry (= 1.1.0)
@@ -56,6 +60,8 @@ SPEC REPOS:
- DZNEmptyDataSet
- FLAnimatedImage
- HWPanModal
+ - JXCategoryView
+ - JXPagingView
- LookinServer
- LSTPopView
- LSTTimer
@@ -71,6 +77,8 @@ SPEC CHECKSUMS:
DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2
+ JXCategoryView: 262d503acea0b1278c79a1c25b7332ffaef4d518
+ JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e
LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80
LSTPopView: 9379f00f6ce7d1fc620b50ab00ed3ef97b2d4d52
LSTTimer: caf8f02ff366ca175cf4c1778d26c166183c1b6f
@@ -80,6 +88,6 @@ SPEC CHECKSUMS:
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: f29024626962457f3470184232766516dee8dfea
-PODFILE CHECKSUM: c50284c86c4e30cee59c186e48767667019dcb61
+PODFILE CHECKSUM: ce689000a7b9b24f5d74cc50a93350665c3af035
COCOAPODS: 1.16.2
diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj
index 244981e..323828f 100644
--- a/Pods/Pods.xcodeproj/project.pbxproj
+++ b/Pods/Pods.xcodeproj/project.pbxproj
@@ -19,1319 +19,1565 @@
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
- 0005259AEE76604A26E43EA994475B68 /* HWShoppingCartPresentingAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8927ADAF60DF7D3D91B390580BD36295 /* HWShoppingCartPresentingAnimation.m */; };
- 00DAE48C9A4FBCD1FCAA922CA57B45F9 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 23518377A93659DE7C8E586309E28896 /* SDWebImageDownloaderRequestModifier.m */; };
- 01D2F1D0ABE13AAB2CDC0C25E378E964 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D37BD8FF05E69B29FC64F9CEB3CA7255 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 021ACCD4343D154E4782A5ECE222A8DF /* LookinIvarTrace.h in Headers */ = {isa = PBXBuildFile; fileRef = 587808BB0F9012792B17999F0BB495C4 /* LookinIvarTrace.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 03623FBDBE9F6B422E9A5C6EAD321A58 /* HWPanModalPresenterProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 093706FD3573E105CD2368D496C2DF76 /* HWPanModalPresenterProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 042D40751BD2F51FBE9FECD4707CBBE9 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D13B75999F5A8EF9D0BABA6DAF09179 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 0453019EC6578A67B82CF569EC765546 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 622B25C415B746B0A4DE004201B6C241 /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 059E13B65EC846A6B5D5F5A68D26D194 /* Pods-keyBoard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 969A9A842778EFB5D62826500DFF4E11 /* Pods-keyBoard-dummy.m */; };
- 05E2B7C1DB7528A0BBEA1521BE0DBAF1 /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 5593F84C8F2583B27ACE6E149D4B8B0E /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 06C4E233E7977DB81A24482E69B2D7D7 /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = 95F5264D9ED9939AE536B5201D80DB5E /* UIImage+Transform.m */; };
- 0845A6CB7AE77A99CC475BD14101FE87 /* LookinAttrType.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E3DC362C663E7C7DAB5B7DC796C5507 /* LookinAttrType.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 08719ABCE689ED74FE7486B1E49DAA6C /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11DDB27A20A87C02AE0F91342FA9E9 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 089F3C4BAA46A37EC5763DD312771021 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 71086CB516DC09CA5D29736469412558 /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 08D50C5AC969A3701B6F9137CF3A10F1 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C63EE1B9AB32B647D64489A498987B3 /* UIImage+ForceDecode.m */; };
- 09A2ACBC8CE1761652EAA20886AEFE10 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B83EEE0D453B8B01D8275D3EEBF4BF /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 0A7342FACEBA0077F1B06178940883DB /* HWPanModal.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EC2576F6D68ECA3E1920A896AE4E4F /* HWPanModal.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 0B0E6CECDF516BC83756C1D5515A725B /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C7E35B5D53702D7A355AD38231170EAB /* SDAsyncBlockOperation.m */; };
- 0B449236AF25C6C11B0DE3D6D0E4A19B /* LookinEventHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = D85D1D9B369469B71D9FE49138927707 /* LookinEventHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 0BE3B8DB6034364E7CF3AE9D01C7C0B4 /* CALayer+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = B53B6AA90E9FBFBBE4E4275DE10531D3 /* CALayer+Lookin.m */; };
- 0C79142D1349DD9A969F47A0A8AAA0CB /* Lookin_PTProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = C2641A163910BF7346FA6273237FDB7D /* Lookin_PTProtocol.m */; };
- 0EF10747EF2A02413E84BD5EF7C87A4B /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = A4685A3F7A42EE78A5B66190A100B3C2 /* MJRefreshNormalHeader.m */; };
- 0F1D0F5DCC8C94A4C684DF846D14F436 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 237D10385C2D9391B809DFD74B21A570 /* SDWebImagePrefetcher.m */; };
- 0FF9F459ED16719292443A4C99B52B20 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F98986A52AAB68B64127A983F8CB7D9 /* SDImageCache.m */; };
- 10017B43AC38C3A89D7AC1376C6E7066 /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FCA5CF6F4A026896316D8731B3E493F /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 104D9196010D2A8C52C0C19E9C9D52E8 /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D0B5D7F39DA4B830F1B68A7D9273B85E /* MBProgressHUD-dummy.m */; };
- 117F4B6F653A8DA2637C5C93B4993884 /* Peertalk.h in Headers */ = {isa = PBXBuildFile; fileRef = 141D1CCF79DF1688C14B5C5A4CACC6E0 /* Peertalk.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 11C929E6BFB46F981685446F26DCE605 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = FFF8ADD6067D862411385E3BFF71A8DA /* MJRefreshAutoFooter.m */; };
- 11D4DC1FCE5647EEA8484AA4A880AF8F /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B77702D1A0EF9DC4542AD40D9D3062E /* MBProgressHUD.m */; };
- 126496714AD564062A8C10787CC01B8B /* MJFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 77EBE36C10B9452DC1931AC9779D7F79 /* MJFoundation.m */; };
- 12EC136F97CCCDD8C3765925FABA52CD /* HWPanModalHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = C49E916A72175489DFFC49A15E87403D /* HWPanModalHeight.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 14943D0EE97A4966510A86F5C3FC66A5 /* MJExtension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ACD4F15622D5B40EA4047FEA329658B /* MJExtension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 14CA284AC4FF1EED75E785641EE98034 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F62EE3A88E154ADAC90DDF6BC60DFB6 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 150116E888969E8304BA3E2BB6529461 /* LookinHierarchyFile.h in Headers */ = {isa = PBXBuildFile; fileRef = D4EB28525886DCE45DC1BBE08F77BCDF /* LookinHierarchyFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 0005259AEE76604A26E43EA994475B68 /* HWShoppingCartPresentingAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 62C28B0ACA1E8D749FA6E65D70CFCB2D /* HWShoppingCartPresentingAnimation.m */; };
+ 00DAE48C9A4FBCD1FCAA922CA57B45F9 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 02986FE530B6F5FD0ABF721900839DA5 /* SDWebImageDownloaderRequestModifier.m */; };
+ 01D2F1D0ABE13AAB2CDC0C25E378E964 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BD89A8E0323AB57CE283C150C3D4C556 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 020FEDA58170EE1ABDF9E268D373CF4F /* JXCategoryNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 44CB5B4F2C2351C8F32C675C94C2EAC0 /* JXCategoryNumberView.m */; };
+ 021ACCD4343D154E4782A5ECE222A8DF /* LookinIvarTrace.h in Headers */ = {isa = PBXBuildFile; fileRef = 765DBAD68AB5F355FB80870758AFB22C /* LookinIvarTrace.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 03623FBDBE9F6B422E9A5C6EAD321A58 /* HWPanModalPresenterProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = E8DC9FFB899510CE978017ADFAFE6D87 /* HWPanModalPresenterProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 042D40751BD2F51FBE9FECD4707CBBE9 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = F246E4D58E65C83AB3493871F692FC9C /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 0453019EC6578A67B82CF569EC765546 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 3201B19667C12026E1C92EA1DD973BB7 /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 05E2B7C1DB7528A0BBEA1521BE0DBAF1 /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E18E15D3A7901E5A84136DADC023216 /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 05EEA40D460AB9A5A6E8D33AAAEF801E /* JXPagingView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AFBCBD9F77FD5CF26B2BEBE02B1E19D9 /* JXPagingView-dummy.m */; };
+ 060B00D5B019369654AEAB7C116DC119 /* LSTTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = C4A783F974F95D31DCCDA721D4F965EC /* LSTTimer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 06C4E233E7977DB81A24482E69B2D7D7 /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = A67C49E3D329D82553E5FEBB4951ABD7 /* UIImage+Transform.m */; };
+ 0845A6CB7AE77A99CC475BD14101FE87 /* LookinAttrType.h in Headers */ = {isa = PBXBuildFile; fileRef = D7DFD14540146731FB9E466FA1EB81F0 /* LookinAttrType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 08719ABCE689ED74FE7486B1E49DAA6C /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D9AA9876374637F32E00BE13AA1880 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 089F3C4BAA46A37EC5763DD312771021 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 390647665D633FF246584D1E27162F0D /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 08D50C5AC969A3701B6F9137CF3A10F1 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 6645D9E2FCEC9ED435B284460DEDDF89 /* UIImage+ForceDecode.m */; };
+ 09A2ACBC8CE1761652EAA20886AEFE10 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 471A02E298FA363A6051045C83C8BE05 /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 0A7342FACEBA0077F1B06178940883DB /* HWPanModal.h in Headers */ = {isa = PBXBuildFile; fileRef = 6260795D5ABBA18F8EFECC2CEB871872 /* HWPanModal.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 0AA1842830C770B1E299BAC977E813D9 /* JXCategoryIndicatorRainbowLineView.h in Headers */ = {isa = PBXBuildFile; fileRef = FD5B9F06C28C32AA434A5A2FFACDF89A /* JXCategoryIndicatorRainbowLineView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 0B0E6CECDF516BC83756C1D5515A725B /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E8666C77464C3B683AB0F8D4DEA6951 /* SDAsyncBlockOperation.m */; };
+ 0B449236AF25C6C11B0DE3D6D0E4A19B /* LookinEventHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = E97B2ACE11733D7DD5ECA116979B91D5 /* LookinEventHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 0BE3B8DB6034364E7CF3AE9D01C7C0B4 /* CALayer+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 673B42B9F094B1F5ED808EE1BA26FC30 /* CALayer+Lookin.m */; };
+ 0C312924F0A07471A1D04AD15D32BF3A /* JXCategoryIndicatorRainbowLineView.m in Sources */ = {isa = PBXBuildFile; fileRef = CC8BAAD188938B05A876ECFEAA39F2E6 /* JXCategoryIndicatorRainbowLineView.m */; };
+ 0C79142D1349DD9A969F47A0A8AAA0CB /* Lookin_PTProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 9545413A1EE5D2E50A21E8D9794A771A /* Lookin_PTProtocol.m */; };
+ 0D6EFFD314E70C1E547970D8CEF11131 /* JXPagerMainTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 119B8F0EF70910D693FCCA816529E357 /* JXPagerMainTableView.m */; };
+ 0EF10747EF2A02413E84BD5EF7C87A4B /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = CAD02815855109CE0DDD83222F913EF8 /* MJRefreshNormalHeader.m */; };
+ 0F1D0F5DCC8C94A4C684DF846D14F436 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = E48A50CB4DE0A87DE4F3E1BFE24DC7B7 /* SDWebImagePrefetcher.m */; };
+ 0FF9F459ED16719292443A4C99B52B20 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 11EEC0D59FA31FAAD209A208EB338575 /* SDImageCache.m */; };
+ 10017B43AC38C3A89D7AC1376C6E7066 /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E889A3C02C6D9C2F5501AF30759E916C /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 104D9196010D2A8C52C0C19E9C9D52E8 /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93081A25D8BCD8327365F5FAC77C46F3 /* MBProgressHUD-dummy.m */; };
+ 117F4B6F653A8DA2637C5C93B4993884 /* Peertalk.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FDFBF5B5FE03EAE7CBA31ED300F848E /* Peertalk.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 11AD210D385F977383AFB974D3CDEF53 /* JXCategoryListContainerRTLCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C36F83AF55E2873F497777F59071760 /* JXCategoryListContainerRTLCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 11C929E6BFB46F981685446F26DCE605 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = BE6EFE785E6216D9C7C1D6B7A4EEA5EA /* MJRefreshAutoFooter.m */; };
+ 11D4DC1FCE5647EEA8484AA4A880AF8F /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = DB3619AB8798CD8CAE31E140F80F2DC0 /* MBProgressHUD.m */; };
+ 126496714AD564062A8C10787CC01B8B /* MJFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A7EBF5198D90CFC9C01A0BA03924D8 /* MJFoundation.m */; };
+ 12EC136F97CCCDD8C3765925FABA52CD /* HWPanModalHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = 5731585BDD8DA229201CF537357BCA56 /* HWPanModalHeight.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1399CD097E164E2C7A6882F0C8FFA525 /* JXCategoryIndicatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D6F5B88F49EB151A388B58319A67E2A1 /* JXCategoryIndicatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 14943D0EE97A4966510A86F5C3FC66A5 /* MJExtension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AE09548D63659FAE72F5C6F1EBF230FC /* MJExtension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 14CA284AC4FF1EED75E785641EE98034 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DB79C6893EAE9D1A7D3559B485BCC5 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 150116E888969E8304BA3E2BB6529461 /* LookinHierarchyFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 63000DF25140BBB4F03EDFC289F2B197 /* LookinHierarchyFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
15B27182B591769C57B55544260DC886 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 165F1C9CBD621828C788A3018D0426C5 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = BF5EC4E67D9695435096AE8FFF0726FA /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 165F1C9CBD621828C788A3018D0426C5 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FB334521D7F08199DE839AB68A37105C /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 168889E3E897E6D6102A2AA7F7C47496 /* JXCategoryIndicatorComponentView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B0139E3193D3960F1A46D73064CA34A /* JXCategoryIndicatorComponentView.h */; settings = {ATTRIBUTES = (Public, ); }; };
16D7DCB7CC985C33EEC41B371C029C84 /* SDWebImage-SDWebImage in Resources */ = {isa = PBXBuildFile; fileRef = CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */; };
- 1708C1D28B421C4AD310426D1695CE77 /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = F24C826B62D5E083C9293F7721C463C2 /* SDAnimatedImage.m */; };
- 1754DD5511A7BF462B116F70B0D4006A /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E41E643057B645A4E6C5FEA5E52213CB /* SDWebImageOperation.m */; };
- 1830558A4D2D63C8E76BC3136D8213F9 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 67D554550B250775795416CCAF8BD370 /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 18660FA595DBE133BB784E813A7122A8 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7859E48715647D45C428FB82F31DB2BA /* SDImageHEICCoder.m */; };
- 186B573F1BEB8A23419A02814A7741DB /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 65EE0AA02CCB84E9D0C6987A57196DE0 /* MJRefreshFooter.m */; };
- 18AD90784D549657DF51BC8377DA3085 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = FB689A278C80C26E3B3E80EDA3887106 /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 18CDCA86F129B7251D21E8F3FF8656B9 /* LSTTimer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F9F21BFD087BDB0FF37B51B916F0A3DC /* LSTTimer-dummy.m */; };
- 1B52E938D7999FC0CDA2AA22674948EB /* LookinAttributesGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AA6F90EC76FE7C2ACDF3266FD792D7A /* LookinAttributesGroup.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1B6CE67196EE181E6B56788EFC7E00D3 /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 31C99A570F5F1154C55309832EC47D0D /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1BC44E2FDD197D5210A23C9CCF1A906B /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = BF559CBB24F4A49720F72A32ADDCCFE2 /* SDWebImageCompat.m */; };
- 1C5CCB87E5B9C500F07A8244D7906295 /* LookinAppInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = CA040E4FC9E6D5254278E66354DE0995 /* LookinAppInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1C8B70C74291A3076746C3B18781568E /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 79B0D13A04128B711BB3AFF0676EC3D0 /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 1CA85ECC202E5CF62530BAD7C0DCDAF2 /* LookinHierarchyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E03AEFAD237B8966FCFA45B3312FEE7 /* LookinHierarchyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1D18A1A5D485D57192B021A8765C0AF5 /* LookinTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE44CAA3E728CD13C43CF7D34627D80 /* LookinTuple.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1D3DCD05B685A7CAF291C25D922B1831 /* HWPanModalPresentationController.m in Sources */ = {isa = PBXBuildFile; fileRef = C7586CB0CDC6CAF19F6A64083B6C8C0F /* HWPanModalPresentationController.m */; };
- 1DB724891F1F6468BDB333369F667F39 /* HWPanModalPresentableHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 56A664809217C1D10A7EC649E972D6AB /* HWPanModalPresentableHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1EA011B45EC780B434507AFB3D9647ED /* NSObject+MJCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B6CB7D56E64BDB8EB50D17E5CEC7C8F /* NSObject+MJCoding.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1EC3AEA15AE416A53357261B37C622BD /* LKS_TraceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A75ADFE775EE09236D1DF5672ACB9A4C /* LKS_TraceManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1ECC5F320AEFB120081358B4FFB7442F /* NSString+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = F72D861CBD81CE860AF0AE80BBE0D883 /* NSString+MJExtension.m */; };
- 1EDC6F899051F0E858270F7556AF2F12 /* UIVisualEffectView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 80E15D4BAC4857AD45CC8CDC40384F0F /* UIVisualEffectView+LookinServer.m */; };
- 1EDF5F5B68D4A76CE59D5B6CC7B6C469 /* LookinAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 074925B1189A88BAA6297431490B8041 /* LookinAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1FD36A180D43C773D95D8E5BF719494C /* LookinDisplayItemDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = FADEEDA2729187D0D3E4FF58DCAE4F5E /* LookinDisplayItemDetail.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 1FDEA3FFA45F29C1331723E9579D66A5 /* LookinAutoLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 0175DE132412321B3302CBE48CE0F712 /* LookinAutoLayoutConstraint.m */; };
- 2055774CD703B52DABFB1CC588394A94 /* MJExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A5B6B4FC335FF159BAE91EDDEC3320 /* MJExtension-dummy.m */; };
- 20D618EF3EA5E3BE96DA24D36E3CA9EF /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 776331A7467F397FCD02F62B233A6E93 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 20E738E52B4712385489A62374C74C7F /* Lookin_PTUSBHub.m in Sources */ = {isa = PBXBuildFile; fileRef = 899D158EA21A86AFAE75EACD2CFC106B /* Lookin_PTUSBHub.m */; };
- 22516EA77E7120000632C30BD9A03927 /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EE2F8245BCEBA174A7A8891FBE03ECB /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 22F19B23471EE7840581A348EB735BD1 /* UIViewController+LayoutHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 0041D895443AAAA3D1BCD4056EBB4F37 /* UIViewController+LayoutHelper.m */; };
- 231A40F14D020AE2F61AA5C3289E6CF9 /* UITextView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B099323376948696DA373792CC4983D /* UITextView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2460C08042AF8B7D0492A062F755986E /* NSString+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 4610142EAB51ECDD8FC137942A59F231 /* NSString+Lookin.m */; };
- 24E8E4ED0B5D988E3346E6638619F4E4 /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = A8A5F422D3A80975E78C20D9980BBAE7 /* SDImageFrame.m */; };
- 24E963C1D6245F98BAC8A0ACCB7DE987 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = AB93341F4852834DE8BA29DAB3E69371 /* NSBundle+MJRefresh.m */; };
+ 1708C1D28B421C4AD310426D1695CE77 /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B609960A71B1FE2AB814B679D9E7609 /* SDAnimatedImage.m */; };
+ 17341EDF872432C3966B77976F3E0470 /* JXCategoryTitleVerticalZoomCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 60A68C8A5D160FE046F60DF6C446111D /* JXCategoryTitleVerticalZoomCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1754DD5511A7BF462B116F70B0D4006A /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = ED2932A528EF3931C345CFE64B9F95D6 /* SDWebImageOperation.m */; };
+ 1830558A4D2D63C8E76BC3136D8213F9 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 75B6A4916D912131001F61C28CCA6565 /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 18660FA595DBE133BB784E813A7122A8 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3125F7D904D9F1F20C7699EF5186B19F /* SDImageHEICCoder.m */; };
+ 186B573F1BEB8A23419A02814A7741DB /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CE7B5832F4AC9648A3CEB7DD03473E4 /* MJRefreshFooter.m */; };
+ 18AD90784D549657DF51BC8377DA3085 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = EC33F9EE9311F0E41E69AB2D40770217 /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1B52E938D7999FC0CDA2AA22674948EB /* LookinAttributesGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = 57D32F597DFAC06B9198FA1F48D2995D /* LookinAttributesGroup.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1B6CE67196EE181E6B56788EFC7E00D3 /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 911E6F5D1D17453D35BE3FA4A9086972 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1BC44E2FDD197D5210A23C9CCF1A906B /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 64891F4568CD87380D133019B00B2324 /* SDWebImageCompat.m */; };
+ 1C0FA6017CAD67C1A80FFA70024FC6FD /* JXCategoryIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CF64931699D303A3C9AE1FFC4682E257 /* JXCategoryIndicatorCell.m */; };
+ 1C1BC9F0555B36914FF5278D30152DE6 /* JXCategoryNumberView.h in Headers */ = {isa = PBXBuildFile; fileRef = C6B6ABC9B259D86AA3C2451E682BE701 /* JXCategoryNumberView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1C5CCB87E5B9C500F07A8244D7906295 /* LookinAppInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 908BDA99457974AD8998A674A0C0FB12 /* LookinAppInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1C8B70C74291A3076746C3B18781568E /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DC4AC8D166AB2BD8B557BFA9FA9872C /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 1CA85ECC202E5CF62530BAD7C0DCDAF2 /* LookinHierarchyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = A8105D73597438386DADF22233AAD4B3 /* LookinHierarchyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1D18A1A5D485D57192B021A8765C0AF5 /* LookinTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 95EB1D88070F8207A333D4573DA43A15 /* LookinTuple.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1D3DCD05B685A7CAF291C25D922B1831 /* HWPanModalPresentationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94D99E2E2730992302FB9BAA7CCE2A1C /* HWPanModalPresentationController.m */; };
+ 1DB724891F1F6468BDB333369F667F39 /* HWPanModalPresentableHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = DAFBC54BDE2AC21397492351C31C587A /* HWPanModalPresentableHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1DC161351EBD409CC622E826340E4FD8 /* JXCategoryTitleVerticalZoomCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 54CBDA1EBC8A896E6DB3A15D5332DB1C /* JXCategoryTitleVerticalZoomCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EA011B45EC780B434507AFB3D9647ED /* NSObject+MJCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 9777292C62AA2375C63BAEF75D1F940C /* NSObject+MJCoding.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1EC3AEA15AE416A53357261B37C622BD /* LKS_TraceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1278AB0B776862F23D89B7E8596E3598 /* LKS_TraceManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1ECC5F320AEFB120081358B4FFB7442F /* NSString+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B4EF64EB8018D8E9CE7C8CB5FACCD5B /* NSString+MJExtension.m */; };
+ 1EDC6F899051F0E858270F7556AF2F12 /* UIVisualEffectView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CE6BF39C6199FC5B55217046DDE2CDB /* UIVisualEffectView+LookinServer.m */; };
+ 1EDF5F5B68D4A76CE59D5B6CC7B6C469 /* LookinAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 659E6E588427268237F9F2C40D2F6CBD /* LookinAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1F778CA18D1F4A50D9F15280B25D10EB /* JXCategoryTitleImageCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = DDAA59B8AF34E0C4765874AEE69571F7 /* JXCategoryTitleImageCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1FD36A180D43C773D95D8E5BF719494C /* LookinDisplayItemDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E7F18004D9337D64F0F606975492DF4 /* LookinDisplayItemDetail.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1FDEA3FFA45F29C1331723E9579D66A5 /* LookinAutoLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA1EEEB5386D6FCA6523BE43601C382 /* LookinAutoLayoutConstraint.m */; };
+ 2055774CD703B52DABFB1CC588394A94 /* MJExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D4A62A4549AC17B0296FF7D29E15454 /* MJExtension-dummy.m */; };
+ 20D5706AD3ED295B4FBACD8825DC3A1E /* JXPagerListRefreshView.h in Headers */ = {isa = PBXBuildFile; fileRef = 359AD735B8CFD982730F6CEB0F56A487 /* JXPagerListRefreshView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 20D618EF3EA5E3BE96DA24D36E3CA9EF /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9820AAA1C732351179414BB46300A1B7 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 20E738E52B4712385489A62374C74C7F /* Lookin_PTUSBHub.m in Sources */ = {isa = PBXBuildFile; fileRef = BC38AB7DAEDA3DEEFFAC64BDA7FA3C88 /* Lookin_PTUSBHub.m */; };
+ 20FBBC12322412237D48D3695D98E043 /* JXCategoryDotView.m in Sources */ = {isa = PBXBuildFile; fileRef = EED2C7FD129EA6F065286A12502B79B7 /* JXCategoryDotView.m */; };
+ 2175B894008D948C762468307BA677B8 /* RTLManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E5EA191D7CFA74A3FEAFB27130A3FEC7 /* RTLManager.m */; };
+ 22516EA77E7120000632C30BD9A03927 /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 23648E3B16301958DD4429C021EB223C /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 22C38AE7AB145224FF646303AFED11D2 /* JXCategoryDotCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = ABD4819FE00A1A954ABDDF0893C72587 /* JXCategoryDotCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 22F19B23471EE7840581A348EB735BD1 /* UIViewController+LayoutHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 76724C714C93839E6993DF68B545F17B /* UIViewController+LayoutHelper.m */; };
+ 231A40F14D020AE2F61AA5C3289E6CF9 /* UITextView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = A56B5A6CAF35241FF9D41CAC7DC1D6D2 /* UITextView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2395CE03CE80FC5F9A7F61C48270618B /* JXCategoryViewAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = B46184374613AB561CB67E0F1EF14DD8 /* JXCategoryViewAnimator.m */; };
+ 2460C08042AF8B7D0492A062F755986E /* NSString+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = D9EC522C5B6A10C53A05FE81CED85983 /* NSString+Lookin.m */; };
+ 24E8E4ED0B5D988E3346E6638619F4E4 /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = EAEC3302C39E58E44D49A12FA8699A84 /* SDImageFrame.m */; };
+ 24E963C1D6245F98BAC8A0ACCB7DE987 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 824A8DE6460C98A565B1EDD8B4432F50 /* NSBundle+MJRefresh.m */; };
2567FE276DB76481DEFC7DDFE7D775CC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 261C31F4038EC00D5961218C97905E21 /* LookinConnectionResponseAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = BAD931CF8729677FC0BD6248B49E6631 /* LookinConnectionResponseAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 27212D06F5EDE3BB10264D93075B2275 /* LookinDashboardBlueprint.h in Headers */ = {isa = PBXBuildFile; fileRef = 140B9E97F5B5BEB056AA3A4DFFA9891B /* LookinDashboardBlueprint.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2759D8D4FCE58812ADECB348E369C6F0 /* LKS_MultiplatformAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = E78C9A636C9E4C5CFBDECBA5127AF367 /* LKS_MultiplatformAdapter.m */; };
- 27CC45A4ABE5B40723D35310D05CD146 /* LKS_EventHandlerMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = BFD36E41E270B32316CAE346D73B1BB4 /* LKS_EventHandlerMaker.m */; };
- 288CD3416B265CAC1300D7938167AE66 /* MJPropertyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = A73F313A18713E36B251C92C66806CE8 /* MJPropertyKey.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 288D796F3F7B9F42690E24A3B1018B2C /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 741B32704926AB941D9209B2D37E2B8F /* SDImageIOAnimatedCoder.m */; };
- 28BA9702905AA2B4C1E9E4878032D4E4 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = AE979EFDEE516846488B7EE0D6F7EED8 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 29F7F0E98FD26A96364DBACD7D5F237A /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = D1995E5A7C78EB3AC4764F06A4A7E676 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2A24F241D7D74FF6DEA953F9DD49391C /* LKS_EventHandlerMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = E19751E7E128A05C5F94C54CB5222006 /* LKS_EventHandlerMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2CDC7B9EAD356E35FEAF526EEA6A8E91 /* LookinWeakContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = ACDFCFE3242922DD1C6F9C0911E0A56B /* LookinWeakContainer.m */; };
- 2D0E2E3CDCB12399497B4F31D4C20E3E /* HWShoppingCartPresentingAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = D9879EAF15EB971D024F6726C4E07562 /* HWShoppingCartPresentingAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2DC44A09A6C9D6DC7D1BDA2DFCF99EE3 /* MJRefreshConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = EF96CCDE1944CF562A65CA60FCBAD8CC /* MJRefreshConfig.m */; };
- 2DDA5F044BC698BC5D48A7CFDDBF71E3 /* LookinAttributeModification.m in Sources */ = {isa = PBXBuildFile; fileRef = 624CC6F33BF93A1458307F73823C3E10 /* LookinAttributeModification.m */; };
- 2DDD48230ED9E8068C7E439D79B99A8E /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 8204B00622081F3C51B1FC2D83A2D0D0 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 2E86A7C77E43AEA4697979F1F848E68D /* LKS_RequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = AE403DA6C5955C67D130890FCA703778 /* LKS_RequestHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2EC1750C894F036194B90CFD26072B0C /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D1A874AEEF141E292D730F9161627B04 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2EFF1EFA2FF0D2F1AE44A9DDBB932425 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AD771C5136CD5549FAE44B9E4C2DFD2 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 2F6D9BEA582A2DBB70A6C3B2FC2DB91E /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = FB095F0736BB4D6DAB423B110675CCD9 /* SDWebImageDownloaderResponseModifier.m */; };
- 3111CEA93C868CA68CBD351C934FEB80 /* LSTPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 80A4C5F30966DCCAF12719455CE5BA94 /* LSTPopView.m */; };
- 3127F22BF0A5465D472669272D586BDC /* HWPanModalIndicatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = BF679003FB79C12E8A8221EC19044EC3 /* HWPanModalIndicatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3187FF0C251D1B78BE87F64F6F6E944A /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = C930EDADB5661C1F591CA4E0A60BCA26 /* SDWebImageTransition.m */; };
- 31DC2EC78AD1F8241AE6051EF9E73B0A /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BAFAB49E37FE01E69DA8AF02F372885 /* SDWebImageDefine.m */; };
- 320DE42AF3CFE11FF785FEB1A7E6547B /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F01F027ADEF8C49A4605D787E41BD1C /* SDImageFramePool.m */; };
- 321F87DA34863DC5C977323BAEDB2B55 /* NSObject+MJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = BE0B0E1A9A292EDE11246C6685B3FF8A /* NSObject+MJCoding.m */; };
- 325CA20B9271F3E008234E1518B79061 /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 63277FA9AFB139990459DF6C57B238F5 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 261C31F4038EC00D5961218C97905E21 /* LookinConnectionResponseAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 989150BD3DA7E7AE5D05E2F37E778A8D /* LookinConnectionResponseAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 266352AA446DAE8C9502E83810C174D9 /* JXCategoryImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7778E8300903006F261959B2010A06D2 /* JXCategoryImageView.m */; };
+ 27212D06F5EDE3BB10264D93075B2275 /* LookinDashboardBlueprint.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D31ED01216EF87422BD04709990AFA0 /* LookinDashboardBlueprint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2759D8D4FCE58812ADECB348E369C6F0 /* LKS_MultiplatformAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FBD8AFE7FA55EAB140791EC34C18CD4 /* LKS_MultiplatformAdapter.m */; };
+ 27CC45A4ABE5B40723D35310D05CD146 /* LKS_EventHandlerMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C21A04AB85F6948BCB44480387E46C5 /* LKS_EventHandlerMaker.m */; };
+ 288CD3416B265CAC1300D7938167AE66 /* MJPropertyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 367088C36E8BF33957802AE4A6256CC1 /* MJPropertyKey.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 288D796F3F7B9F42690E24A3B1018B2C /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3504487D6CA5438A7FB00D149564DDFC /* SDImageIOAnimatedCoder.m */; };
+ 28BA9702905AA2B4C1E9E4878032D4E4 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 55A76B2979ED12495977612719BE47A2 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 29F7F0E98FD26A96364DBACD7D5F237A /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 402826B784C1198142F399AD251F2A3A /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2A24F241D7D74FF6DEA953F9DD49391C /* LKS_EventHandlerMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = E5AA796F8B4298B625A467D39523F40F /* LKS_EventHandlerMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2CDC7B9EAD356E35FEAF526EEA6A8E91 /* LookinWeakContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 16464E573FCB8AFF2E7DB58E7A507D73 /* LookinWeakContainer.m */; };
+ 2D0E2E3CDCB12399497B4F31D4C20E3E /* HWShoppingCartPresentingAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = B9C3A1374DADDEAE813F69F05F5A2564 /* HWShoppingCartPresentingAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2DC44A09A6C9D6DC7D1BDA2DFCF99EE3 /* MJRefreshConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 42EF67A85226C8C14C983E81C71F392D /* MJRefreshConfig.m */; };
+ 2DDA5F044BC698BC5D48A7CFDDBF71E3 /* LookinAttributeModification.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B35D70EDD8A3E56FE6F0E6934A400CC /* LookinAttributeModification.m */; };
+ 2DDD48230ED9E8068C7E439D79B99A8E /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 3422D3CB84719A98D68CD9DE2857E694 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 2E86A7C77E43AEA4697979F1F848E68D /* LKS_RequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = B9D007BE64FBA88DB3F5D92E0EAEDEAD /* LKS_RequestHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2EC1750C894F036194B90CFD26072B0C /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 761A654F557EA15B24079623AF9184F9 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2EC7BA321016EC71EA595E4BAF0B7E8B /* JXCategoryDotCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 98D2F9331639FC6D12A4091DD5F47C96 /* JXCategoryDotCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2EDA227454079ED3F6371BF34AFD4735 /* JXCategoryIndicatorCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3875C6FE72ED2368D3701E9901F883B7 /* JXCategoryIndicatorCellModel.m */; };
+ 2EEB29D2C570F11620D4CF90D7DFD569 /* Pods-keyBoard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D8E1EB42D41EA6B94901E5B68C9011 /* Pods-keyBoard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2EFF1EFA2FF0D2F1AE44A9DDBB932425 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 797DE6794620B6AD238FF0B8B61A1B32 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2F6D9BEA582A2DBB70A6C3B2FC2DB91E /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC2FF6B1D45486A6893E456C4B85E05 /* SDWebImageDownloaderResponseModifier.m */; };
+ 3111CEA93C868CA68CBD351C934FEB80 /* LSTPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B2F1B06BC651834D7B3EA1FBC96E466 /* LSTPopView.m */; };
+ 3127F22BF0A5465D472669272D586BDC /* HWPanModalIndicatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C8BABB078FC5FF697A3609C777FC51FC /* HWPanModalIndicatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3187FF0C251D1B78BE87F64F6F6E944A /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEF7CB304E59179EBDA954FA636E74D /* SDWebImageTransition.m */; };
+ 31DC2EC78AD1F8241AE6051EF9E73B0A /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C599636DAB63CB63CC65E368E1BAAFC /* SDWebImageDefine.m */; };
+ 31FA8264AA5553AB85039530B1FB8C4B /* JXCategoryNumberCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 874DD2FA3B20B6BCBCBEE03BEEBE1281 /* JXCategoryNumberCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 320DE42AF3CFE11FF785FEB1A7E6547B /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E8C0DD47533304FD7479FB5A47A4E3B /* SDImageFramePool.m */; };
+ 321F87DA34863DC5C977323BAEDB2B55 /* NSObject+MJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD309B3FADE968B4258080AC443EFCB /* NSObject+MJCoding.m */; };
+ 325CA20B9271F3E008234E1518B79061 /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7626DD9951DC84318DF6E875CD7A8C20 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
327BA3DDA513422E632D3DA4A8FC60EC /* MJRefresh-MJRefresh.Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */; };
- 32ACEDCEBE0507A82D6323114A1C74F1 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 817B07C3E952A5A5F2082BE15C3C500E /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 32F2B91621A2F8F9AD7C8E2B224D73F6 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3663272D41C8B58200506DDA7E7A2903 /* SDWebImageDownloaderDecryptor.m */; };
- 32FF240AE9443A1D2CFE27F50B55F591 /* LKS_MultiplatformAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 73EFE9F07FF04A733446FD7A74A02718 /* LKS_MultiplatformAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 332F2099D726E75CEFAF1F734104A066 /* LookinWeakContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = AA356D7B80B205861FCCD6FECB42DDE3 /* LookinWeakContainer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3331A013D48A5063B483A51B7E9068ED /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E95EEB52B039FDCAE4992EC84BF70332 /* AFURLSessionManager.m */; };
- 3338AA0580424EFB0FE59C3A37702A47 /* LSTTimer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6767143B7C5D00675B75D54B0AFEF /* LSTTimer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 33D3587AF629B2FA21554DA002D6ACB8 /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C27FE20E006C874307EF5F2B30AA69E /* SDImageCachesManager.m */; };
- 34B28D4F0168194B6EFAC0520EB7A7F4 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EFEA57CFC8959BF5EF4B795BD808107 /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 353C1D03325B8F3E65F985DA29245F18 /* UIViewController+LayoutHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F369D00927FCA59283AE71B174D2D1D /* UIViewController+LayoutHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 35D42759A562C482EA5DF574F75CF3B8 /* NSArray+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 81A6154946F38EFB8836E3145513AAE9 /* NSArray+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3679603CE8336E00A0BFAA39E10A92D0 /* HWPanModalShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = 57AA794BD50692239409E574C7FD0846 /* HWPanModalShadow.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 36B3F095DFFC8D2AF2C0A8C523173927 /* HWPanModalContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D51DADE6BB30185CA5DE0A026B674A /* HWPanModalContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 36F4B09E7C71DCC5CEC6057814033C37 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A0C23E787A5997AF276176CBB988D241 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 32ACEDCEBE0507A82D6323114A1C74F1 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F21EDB4000AA52958FC207353BC36367 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 32F2B91621A2F8F9AD7C8E2B224D73F6 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = DBE1F0821F32567F3E84359D65C8422C /* SDWebImageDownloaderDecryptor.m */; };
+ 32FF240AE9443A1D2CFE27F50B55F591 /* LKS_MultiplatformAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 06BE908D1EBE4269ACB69B26DE9B834E /* LKS_MultiplatformAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 332F2099D726E75CEFAF1F734104A066 /* LookinWeakContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 886E6269011F3D0F924F30F32F08508F /* LookinWeakContainer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3331A013D48A5063B483A51B7E9068ED /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E89941A6B7A73D479A0770A9C96C14 /* AFURLSessionManager.m */; };
+ 33D3587AF629B2FA21554DA002D6ACB8 /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 25A5CCE05BC1D97AB685203E1D41C4B0 /* SDImageCachesManager.m */; };
+ 34B28D4F0168194B6EFAC0520EB7A7F4 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = F55015AACD21AF6274741BBDAC6148E2 /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 353C1D03325B8F3E65F985DA29245F18 /* UIViewController+LayoutHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 23A344AF55814873B0105902E9FBBB2A /* UIViewController+LayoutHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 35D42759A562C482EA5DF574F75CF3B8 /* NSArray+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = B937D529B74DB9581A000F395FF3B6F7 /* NSArray+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3679603CE8336E00A0BFAA39E10A92D0 /* HWPanModalShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = 039AC3B9A6AA2BDAB5EB71E7A54C1EF5 /* HWPanModalShadow.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 36B3F095DFFC8D2AF2C0A8C523173927 /* HWPanModalContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = A87C5BAF6B8038E9EE8A33551A798606 /* HWPanModalContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 36F4B09E7C71DCC5CEC6057814033C37 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8179AB093F869B4BCCBBF8427F69555B /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
3777CD89D444CBBB48AE323B303F3FC7 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77F4C0466DFC43C56F1D982F88EF74A0 /* ImageIO.framework */; };
- 37B890ABDC7DD441E6AA662325D412E6 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 44DDF1AA5625A95CA1C76B7546758226 /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3800EA1B83FDE869FB2E4B049F519962 /* UIViewController+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = D72EC9997A8CA1698A3020135CE8BC2E /* UIViewController+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 381E0DBE152CA0D9C66310CB77A20A83 /* HWPanModalInteractiveAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 31F540B1617ECFBBE3A0FB1043BFB861 /* HWPanModalInteractiveAnimator.m */; };
- 38938E604A7D708E6378A44063EF3512 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1FC58856D64F439A2DB39A5CBEAF01 /* UIImageView+WebCache.m */; };
- 392F62298E0D8C669229E132D791BBF5 /* UIImageView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 98AC0F8649D533FEA089C0D7C8018ABC /* UIImageView+LookinServer.m */; };
- 3A1AD84C0DC3C256418CC46739024E96 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = BC5A2383372F42B2452808A886E02C6B /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 3A2FCB914F6EADED828FF05F7E9132AE /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = FC070F9BCE8A8D0A21448F82A7DD5F5A /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3B1C72DC480AB19BD55B6275750D62FE /* NSSet+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD0546B82DCACC9EF9FE9B72325B901 /* NSSet+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3B8EDFF69A68ABD3735E0C6931CA5C95 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 595622377DEA1856384D2D262C52C73F /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3BB69CB142D744367868F834912993CB /* UITextField+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 27339E9CA8A7C6DC7F3E8B828C3D0038 /* UITextField+LookinServer.m */; };
- 3BD85ED8999015326D93D8EEADCCF910 /* HWPanModalPresentationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D1699A762F8D719D2565E3B0B508554 /* HWPanModalPresentationDelegate.m */; };
- 3C7815EEC599DD7D42FDEF19B2FF1563 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6E20B7CDAEE04E340BBA081726D5AC /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3C7EAECB8C573E714C818BA04EB33773 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 88C23FF116C3257A27A26A897D5AE6DB /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3C8F2F868D0C361CAF43E53CDB8EB631 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = C84FAFE47B2E31104A515395A5239442 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3CA9E838F014DC32CFCF6AD36F5D7E58 /* HWPanModalInteractiveAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 10A8507648AC9DE21CFA0929B1ED0404 /* HWPanModalInteractiveAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3D0BBFEC1921CE71BC240DC18D8BE540 /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C8222012D0B30C2E5C40B4867A1AAF /* SDImageTransformer.m */; };
- 3E3D09700A62280A9EB8D65B97335ED8 /* LKS_CustomDisplayItemsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = C0E2F76DB6A01DBF448BF55D94414007 /* LKS_CustomDisplayItemsMaker.m */; };
- 3E982309E295BB31C065D62750D0F1FD /* UIView+LSTPV.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C39336AE39057C3014C954C694C278F /* UIView+LSTPV.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 3FF7252DD60182221BB1E5A167C41A07 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FA56E3002035BE556C5ED858D43F49DD /* UIProgressView+AFNetworking.m */; };
- 40AD5D0AB3ABF7F3A5A4A98BC5B84419 /* LookinAttributesSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B55BC4062AFBC21B6F27CA6801F7F45 /* LookinAttributesSection.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 416DA8B2997381F954DBA6E6A53DA4A2 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = AE9EAD92339D5CAFE9DD672B7A3B6E7D /* NSData+ImageContentType.m */; };
- 41A4AAE7E6024E7AAB83DD22FB42D34D /* UIColor+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1998A1E21783C0F00F27637B63C88F21 /* UIColor+LookinServer.m */; };
- 425C9EA28FBEB7F7FC09A3F4A88C5955 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = 70D5B55A578973F4D162548B46979D49 /* SDWebImageError.m */; };
- 4334CCEA5B7EA16A4EF26702D287CB07 /* UIScrollView+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B6E38C872CB24F91AFE94F3DF5EFCC2 /* UIScrollView+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 442F468E261A1106C291BF52BDBF9DB7 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 29AAA748545CCD9E566E6F15C52A44CB /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 447BBB1BCA8E0F2D23634888BED6DA81 /* LookinDashboardBlueprint.m in Sources */ = {isa = PBXBuildFile; fileRef = A28F16D63BCA40F7DC78734CFE3A235D /* LookinDashboardBlueprint.m */; };
- 44CD842019B1CEA681F820F37A30B7C4 /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF08650352052DEA4797A89BFD856FF /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 4503182D5F8EF2F02609862026D2D455 /* HWVisualEffectView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D7D197A108D97B04C3BA390CD4499D8 /* HWVisualEffectView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 452C940762F65B125C216F73B369F583 /* MJRefreshStateTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = E5BBE1866B6FDB7D5307A6075BE5F347 /* MJRefreshStateTrailer.m */; };
+ 37B890ABDC7DD441E6AA662325D412E6 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = ED6F94603AF0AF72D292CADE8ABCEEB3 /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3800EA1B83FDE869FB2E4B049F519962 /* UIViewController+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3753072CB1EE987F4CDC7E86385B9A99 /* UIViewController+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 381E0DBE152CA0D9C66310CB77A20A83 /* HWPanModalInteractiveAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BE68C7303DE07C8DA01573CDDE9003F /* HWPanModalInteractiveAnimator.m */; };
+ 38938E604A7D708E6378A44063EF3512 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1600286757D192233397A2BF1A2371 /* UIImageView+WebCache.m */; };
+ 392F62298E0D8C669229E132D791BBF5 /* UIImageView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C560A21071D707C98AE6CD75AED8BFD /* UIImageView+LookinServer.m */; };
+ 3A1AD84C0DC3C256418CC46739024E96 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A6A16B78780399804F5DD15816ADE2B /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 3A2FCB914F6EADED828FF05F7E9132AE /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F474CA83A8EC338136568BDBFF8343 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3B1C72DC480AB19BD55B6275750D62FE /* NSSet+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = D40E6AE30D19137ABA0A5D046329BCCD /* NSSet+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3B62431BEF820E7FC779F344AB2A1D17 /* JXCategoryIndicatorLineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1711B81346B8ED1944B5A8A478A4CF3F /* JXCategoryIndicatorLineView.m */; };
+ 3B8EDFF69A68ABD3735E0C6931CA5C95 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B2D84B5B7090CE22D8AFB107E403CA13 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3BB69CB142D744367868F834912993CB /* UITextField+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 877837A5816B3B110C5B763CCBD0ECFD /* UITextField+LookinServer.m */; };
+ 3BD85ED8999015326D93D8EEADCCF910 /* HWPanModalPresentationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6749EA453DC312E08B14CE8AFDB79F3C /* HWPanModalPresentationDelegate.m */; };
+ 3BF23DD02B40D2A2E98FF9D042A5AF4E /* Pods-keyBoard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 969A9A842778EFB5D62826500DFF4E11 /* Pods-keyBoard-dummy.m */; };
+ 3C7815EEC599DD7D42FDEF19B2FF1563 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FCD0CB41F1E259546B6F8A9BFF05378 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3C7EAECB8C573E714C818BA04EB33773 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 35DC020855ECA02C5E2568299594E9C0 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3C8F2F868D0C361CAF43E53CDB8EB631 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = E95C47EFA2CADA467B5A46831F0EA87A /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3CA9E838F014DC32CFCF6AD36F5D7E58 /* HWPanModalInteractiveAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DAB18271BAF2DB3E49BCAF049FC4F01 /* HWPanModalInteractiveAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3CE13969772F4180701A575FAB98E978 /* JXPagingView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 85E262E36BEDDEA0E7B4F4A870DA4314 /* JXPagingView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3D0BBFEC1921CE71BC240DC18D8BE540 /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = AC558AE5F168E24878BD4ACF3EE1274A /* SDImageTransformer.m */; };
+ 3E3D09700A62280A9EB8D65B97335ED8 /* LKS_CustomDisplayItemsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = E74AC99A06CC9DE9D81D54044B013F98 /* LKS_CustomDisplayItemsMaker.m */; };
+ 3E982309E295BB31C065D62750D0F1FD /* UIView+LSTPV.h in Headers */ = {isa = PBXBuildFile; fileRef = A5262AA56B4C8511CBA390D4808E37F2 /* UIView+LSTPV.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3FF7252DD60182221BB1E5A167C41A07 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E152B4E044E172623798E791ACCC157E /* UIProgressView+AFNetworking.m */; };
+ 40AD5D0AB3ABF7F3A5A4A98BC5B84419 /* LookinAttributesSection.h in Headers */ = {isa = PBXBuildFile; fileRef = B74F835090D47DFE066B4DAD231882AC /* LookinAttributesSection.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 416DA8B2997381F954DBA6E6A53DA4A2 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 2132EF8C73164960BCAFD57CF9C7A53F /* NSData+ImageContentType.m */; };
+ 41A4AAE7E6024E7AAB83DD22FB42D34D /* UIColor+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = C626E0F07BD081EBE5955DEA5669BF14 /* UIColor+LookinServer.m */; };
+ 425C9EA28FBEB7F7FC09A3F4A88C5955 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = F8A31B7D92D4FBD879F8C39ED3139439 /* SDWebImageError.m */; };
+ 4281CC31F4D4EAE690F999C778F17E5B /* JXCategoryViewAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = E0A4E94FB3CF9B468E72117C85C2E773 /* JXCategoryViewAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 431023914A5D2653ABAE7AB54880C9AC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
+ 4334CCEA5B7EA16A4EF26702D287CB07 /* UIScrollView+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 22613DFB1026F3E41B141E34C637D600 /* UIScrollView+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4424E7517B86FE622BCD3D5040FC579C /* JXCategoryTitleCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 00B67A73E7EE0522188FAE4145324D19 /* JXCategoryTitleCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 442F468E261A1106C291BF52BDBF9DB7 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 195B648C25562B52954B1E7C1D8964C3 /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 447BBB1BCA8E0F2D23634888BED6DA81 /* LookinDashboardBlueprint.m in Sources */ = {isa = PBXBuildFile; fileRef = 2783C33881FB9ED3037D4D66B93FAD7E /* LookinDashboardBlueprint.m */; };
+ 44CD842019B1CEA681F820F37A30B7C4 /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = F86F79271CDA27370B63C4004FB83EF7 /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4503182D5F8EF2F02609862026D2D455 /* HWVisualEffectView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC5B799F7FC71DC9649AD62AE8B34DC7 /* HWVisualEffectView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 452C940762F65B125C216F73B369F583 /* MJRefreshStateTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = B26771C31428D52F8DFB859AE1AC3503 /* MJRefreshStateTrailer.m */; };
4571A0EA37DC84F39E3830D38A1531AB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F5B3C0CF01454E7AC9226E88FDFBAE6 /* UIKit.framework */; };
- 45E1583D7EF53489B82C4CA2AD1AD0CF /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2288D70D4609F065E784F156F613AB62 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 464A0100327C8531D86BDC31737CCF75 /* LookinAppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D832408A734647A9D2C62473FE11EFB /* LookinAppInfo.m */; };
- 4688743B7B845309486559EB7BD5D147 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E376CA03D27B523F7F180B9EC99BD7C /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 475B4F3E71C293065AAFDB1888696CF6 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = F47E18ADFFC71918AE70F42C18C32A89 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 48916DE9521F627589300512ECC2D4A5 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = DEA09040DACD7A53B041773DD59096FC /* NSButton+WebCache.m */; };
- 4A15ABB502D625EBE3E63100664AB822 /* LookinCodingValueType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DCD76BA1FFEFDEEE2F9331ECD0796D4 /* LookinCodingValueType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 45E1583D7EF53489B82C4CA2AD1AD0CF /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 17D9582F158C09F75D84ECE893151E91 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 464A0100327C8531D86BDC31737CCF75 /* LookinAppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = CB40236F7A3DB0EECDBA370753BEDDD4 /* LookinAppInfo.m */; };
+ 4688743B7B845309486559EB7BD5D147 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = AB253C473EBD2DF633A230C7FAA304B7 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 475B4F3E71C293065AAFDB1888696CF6 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = C746AE302AD12A4D0F6E287CACA690C6 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 48916DE9521F627589300512ECC2D4A5 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A970B89D7ECEFF994ACF22A5493E001 /* NSButton+WebCache.m */; };
+ 48EB84614F04E6089393ADDFA4BA8603 /* LSTTimer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F5F8D57BABE5A9AD2D0BC75B55D1A52 /* LSTTimer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4A15ABB502D625EBE3E63100664AB822 /* LookinCodingValueType.h in Headers */ = {isa = PBXBuildFile; fileRef = F2698AC3972900E338490644A2E03A2A /* LookinCodingValueType.h */; settings = {ATTRIBUTES = (Public, ); }; };
4A2D7878579537881DD3859B3359F702 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 638488B4F5FF9C67F848A841B1A34765 /* CoreGraphics.framework */; };
- 4ACC15DF96D179E48E4276AE3C540C7C /* KeyValueObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E1785189AB18B6B47ECD584144AA0F /* KeyValueObserver.m */; };
- 4B2C2AE16AE3DDA7417AFCF7952588F1 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84DD851B5FDE16625FA07D9C4D1622E4 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 4D2C79AB2D24CFEC864F08D913CE7692 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A9184E6EEBE4764FF941193DF28C44D /* SDImageCodersManager.m */; };
- 4DA2C6099343CD55160ECB3EBDDFE1DF /* NSObject+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 64BE9723ECB5FEB2D176E2AB31482F57 /* NSObject+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4DCA75BFE1558CE59DFC56607E49B3D2 /* MJRefreshConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 62C98AF2DC89D542692AC64CD9F01818 /* MJRefreshConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4DD9F4BAA95C3527A660D3AAD055CF1E /* HWPanModalContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E5F47A6ED542F1D0EAA4DD94091B61C /* HWPanModalContentView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4DE8A481697088E8BBAEB51042F14ABE /* LSTTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CC6285CEC9BC9D5CBF28149790EF660 /* LSTTimer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4E964FFE29CFF8613C0029C913F39A05 /* LKS_InbuiltAttrModificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = E3EF6841A6A45FD5C11031ED861CFF06 /* LKS_InbuiltAttrModificationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4EC8DBADA7BB954276351A639EB4398D /* UIBlurEffect+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C55508E3B8FCF1A927848A4CFAA53D0 /* UIBlurEffect+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4ED05DB3E43FF6AE1FA22130B2B50F05 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = E6EDBB7EFC23401D50E3438EB3430A58 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 50096BAC0F3270FB111E76D32714E579 /* Image+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = CDEC5449CBECD6C324B9864AD284EC55 /* Image+Lookin.m */; };
- 506FC58999564A737C745F2590E9B4D5 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 981BA7AE91A568EC43916303978CE501 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5106193FDEA44A08AAAAB9B8A227CBE9 /* HWPanModalPanGestureDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DE26DBA97E2F7B5B4805533E6C020C30 /* HWPanModalPanGestureDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5109F520B2E1FF2F30F9DDF5E584E028 /* Pods-keyBoard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D8E1EB42D41EA6B94901E5B68C9011 /* Pods-keyBoard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5111A0A0934551CD2B9DDB1A1CA79FA7 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = AB547BD41867170F26173D27CE44DCE6 /* SDAnimatedImageRep.m */; };
- 512B9661FC34235E0EEB3A6D3E319B88 /* MJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D9EC3F78C9EBFBAA2A4A0F3EE3D27AB /* MJPropertyType.m */; };
- 5163FC6D715F6881B1FA1AB13DCEF870 /* UICollectionViewLayout+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A350736EF0F4C89A3E43AA0BED8AC36 /* UICollectionViewLayout+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5174DD2019966DFDC21B8864453ED3DE /* NSObject+MJClass.m in Sources */ = {isa = PBXBuildFile; fileRef = E1732483C75B01353EF9D04684480EE4 /* NSObject+MJClass.m */; };
- 523235228A1C021C67F2E3776A922DC5 /* MJRefreshTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = F8A410A1A4222EF3876A4FA11492EF05 /* MJRefreshTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 526485EF6D2B62B24DB59122FB94BD42 /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 343301F4ECFA1778F70E1EC266C1848F /* SDDeviceHelper.m */; };
- 5308E660E723C11E7691D311FD59C459 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = 110C7A39306E93E5D29F1709FE16720F /* SDDisplayLink.m */; };
- 53433003112C4FE271EC985803862B61 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 662D6F244CE3008639589EE4EA829B53 /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 53C1722650FCAB2637867D0DC31FC3CB /* Lookin_PTUSBHub.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F886C315967D7AADA95C37B717FE5A2 /* Lookin_PTUSBHub.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 541AD3B0F5EA216EE730ECC6E8B84C31 /* HWPanModalPresentationAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0004D14E99E5CD92EA09732F82694FF5 /* HWPanModalPresentationAnimator.m */; };
- 5490C03887ACF6C4EAC25ADFBB509CE5 /* NSSet+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EA132DBE319D046C6BEFA0C4AB4940 /* NSSet+Lookin.m */; };
- 54E268C32915CF908E7AA776909B45EB /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = E114D2723BCB64ADA9A307B95F5DE640 /* MJRefreshConst.m */; };
- 55F7C7F055A18044497F8C88CAE34118 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 315C5770DCC0584893C24972BAEDEB39 /* SDImageCachesManagerOperation.m */; };
- 561420A20DC0A84258A902E9EB69A15A /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A20F0D257E58B1A870FF109778CD4B25 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 564714D075CF51356D3D8437846AA6EB /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F68CF910ED994D45AAA3B5E5FABB6835 /* AFURLRequestSerialization.m */; };
- 56D8A7EAE4D72FF6C23421CAB6F21504 /* MJPropertyType.h in Headers */ = {isa = PBXBuildFile; fileRef = C02050360407C95F57A46E3425089760 /* MJPropertyType.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 56E800EB3B2BE8AE0BA45A30974D7920 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 56A89B114742BBA3282DA6CDF9871F36 /* Masonry-dummy.m */; };
- 56F1B543BC54204336CB5E50B60F719F /* Color+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = C246D6EBE3F2F29765C86C55F130AD3F /* Color+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5735091665AC18FAD028EB68786A85AE /* LKS_CustomAttrGroupsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = D2ADA0495E5FE9068CEDD520D7AB4D72 /* LKS_CustomAttrGroupsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 58F7CE37BB4CB3BE806B68A502E6E1A7 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = CC87F6E60998716F313AD85E3F2F0C78 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 596180E0EC9F46D12BA840DC4AA62659 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3DBAC2BF3E2D408BCB049042B8B067 /* UIImage+MemoryCacheCost.m */; };
- 597E390C0BBB75B8045B651C487C2034 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F3611B9193976C6AC5268E458B3F9F6 /* SDImageAWebPCoder.m */; };
- 5A6D3BE92C77ED70C397567996DFAEB9 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E7B3F97FDF9522DB3E4FADD3DB88700 /* AFHTTPSessionManager.m */; };
- 5A8BC91257FF6B36237BF09A7A6EADF6 /* LookinObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 683586601FF42469125B58BBB8DF2429 /* LookinObject.m */; };
- 5AF22814CD055B553AD9D78BE54B94E1 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = DA7F2EDBF237046CD345C29806E0A756 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5B08596E856E4CC2F34A8A2372F9F764 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = FD16DAAD0E6C1AF6207145BC463DF81D /* NSArray+MASAdditions.m */; };
- 5BB6B99986FD7111B3AEBE931C7F507B /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C53F73CEF747A7A78B5CACAF16E5FCE /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5BD5D9B8F61C124A62C75D9AC36A07BD /* MJRefreshTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CC6A09F682C54055F6035F0D6E29FA /* MJRefreshTrailer.m */; };
- 5C8279C226EB028B044C5A0F4AC5A91A /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F61547B42B4881FB5D37EF93F1C324C /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 5D0DEC179A7B4143769C663082E2662A /* LKS_ExportManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A12BDC5E6446CAD91BA1C47C211ED2E /* LKS_ExportManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5DCBA14510E091D6A1CE499B08B794B5 /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BE50AD720E95B8938AAE668F71561B7 /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5DFCBADAC7D0FAC82C84A6C8E7BF1DA6 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 5909B734EE0396CAA42A403A6DCD4D27 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5E10328A83E05D0015D7459FAAEF121D /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 387AF8AF8500E50CC311582863B31CFF /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5F45735DF355530CC955066D3C007E19 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A03E64C6033C8C1C7D8822CDE785EEB /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5F5426608460A8B17C1AE5C2351BAA19 /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AB2A681F27544128FA8BFDF04B2B4BB /* UIScrollView+EmptyDataSet.m */; };
- 5FDC4239F7B651092BF582D0F460BAD4 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E0B73DB737A3D2CAAA90EA20B4BB23B3 /* UIView+MJExtension.m */; };
- 6002CB94684D7C786700D2A294146AEC /* Color+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D6F69255AF25D760BE89366830A6F7 /* Color+Lookin.m */; };
- 61461B0D9D7B81C3F8D24066D9A19DCE /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 81E56B3079089075E57FE56264F80F1E /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 61507E402F1F7C58BF119995A0479A22 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B71D1DE227720C6548D26CB1380A595F /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 616A8338C42FB01748DF1BDDA944858D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC953B00F77A76AF38E0FA2C8AB5F03 /* UIView+WebCache.m */; };
- 61857C821395B868C65A8FFE4DA1B4E3 /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = B9D9760D282FEC09C3A5774993001829 /* MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 61EAFBCDC83B2C603918B3C9D9A73A18 /* LookinConnectionAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = DC490DD3FFABA4122C58404F7DFAD348 /* LookinConnectionAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 62FE895DF9D65A2955A275D909ECBE18 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 17FD1B21DCC89D66865655294A85A817 /* SDAnimatedImageView.m */; };
- 6525ECE1CAFC1259F9E6E5FDDE6CF218 /* UIVisualEffectView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 96B0036686E5E0170AC065045503F785 /* UIVisualEffectView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4ACC15DF96D179E48E4276AE3C540C7C /* KeyValueObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = E1F236D1BF028AEAD75A9FB3C9DCAE0F /* KeyValueObserver.m */; };
+ 4B2C2AE16AE3DDA7417AFCF7952588F1 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D3543E70B7F1B6F0CB25AB731CA0DFBE /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4C8C34A09D61A3881DFB1A544A2CA2A5 /* JXCategoryFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E96574DDD94EB958E64B0AD7C7B20F2 /* JXCategoryFactory.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4D2C79AB2D24CFEC864F08D913CE7692 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D1EF86D80B6333688465CCC41BA33F7 /* SDImageCodersManager.m */; };
+ 4DA2C6099343CD55160ECB3EBDDFE1DF /* NSObject+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FD83B41506E28893BC297C4BDAB1B46 /* NSObject+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4DCA75BFE1558CE59DFC56607E49B3D2 /* MJRefreshConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E9598F4E504AE0DA98A0B2DC305F1C83 /* MJRefreshConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4DD9F4BAA95C3527A660D3AAD055CF1E /* HWPanModalContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CAA34C64434033ACBB7F68A74F4D15B /* HWPanModalContentView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4E0FBD829EB07B8D5D2A5F6115457BE7 /* LSTTimer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C181D8B9B1142624BE8BFFA787AA2854 /* LSTTimer-dummy.m */; };
+ 4E964FFE29CFF8613C0029C913F39A05 /* LKS_InbuiltAttrModificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C2FE2279B0EA1E9F949E0AF58D09E3B /* LKS_InbuiltAttrModificationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4EC8DBADA7BB954276351A639EB4398D /* UIBlurEffect+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC6F317480167EA6C97C3ED771D57CA /* UIBlurEffect+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4ECE7F80A917130DE4045E25D741EAF9 /* JXCategoryTitleCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3545C9AC3AD500CD4E48A3E2630C521B /* JXCategoryTitleCellModel.m */; };
+ 4ED05DB3E43FF6AE1FA22130B2B50F05 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 06EFD395C240E38E2ED0DCAF40CE73FC /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 50096BAC0F3270FB111E76D32714E579 /* Image+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = FB1E7E734FDF6F7CAC668B6BD6A2A014 /* Image+Lookin.m */; };
+ 506FC58999564A737C745F2590E9B4D5 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F31829B35104CCEC70FD712B1D4D4E2 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5106193FDEA44A08AAAAB9B8A227CBE9 /* HWPanModalPanGestureDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 95BD516A8F354C5C9CD65BFD30C9BED7 /* HWPanModalPanGestureDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5111A0A0934551CD2B9DDB1A1CA79FA7 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = FBF4C669CA968A448B7E1DD3A141A41C /* SDAnimatedImageRep.m */; };
+ 512B9661FC34235E0EEB3A6D3E319B88 /* MJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4688EE09ADCEE19CD4BDF95833F7E81D /* MJPropertyType.m */; };
+ 5163FC6D715F6881B1FA1AB13DCEF870 /* UICollectionViewLayout+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = F0FF9B39CB74F30B336CF7D4085E2AE0 /* UICollectionViewLayout+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5174DD2019966DFDC21B8864453ED3DE /* NSObject+MJClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 96BA563F965A1054AC53D0F3D5BD3AFE /* NSObject+MJClass.m */; };
+ 523235228A1C021C67F2E3776A922DC5 /* MJRefreshTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A91961A508CA556983A4A3F57FB3133 /* MJRefreshTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 526485EF6D2B62B24DB59122FB94BD42 /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF942497E18FEE75DD2CDC6779A790A /* SDDeviceHelper.m */; };
+ 52E60EE26D065DB63D272298AC8867DF /* JXCategoryTitleVerticalZoomView.h in Headers */ = {isa = PBXBuildFile; fileRef = 059C3C014AA92686FDCE895211A108CE /* JXCategoryTitleVerticalZoomView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5308E660E723C11E7691D311FD59C459 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A0FA60F5E41A8B04C442FE582DA298 /* SDDisplayLink.m */; };
+ 53433003112C4FE271EC985803862B61 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C205DB74EDBD3C80FB36923BD2255DBB /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 53C1722650FCAB2637867D0DC31FC3CB /* Lookin_PTUSBHub.h in Headers */ = {isa = PBXBuildFile; fileRef = 3416384E4A531494C7B12CDD1AEA74A1 /* Lookin_PTUSBHub.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 541AD3B0F5EA216EE730ECC6E8B84C31 /* HWPanModalPresentationAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D78A0355CAA0B846DBC1DAC7B101F4 /* HWPanModalPresentationAnimator.m */; };
+ 546DE9D8142C6D8554E083C6FD65D0BE /* JXCategoryIndicatorTriangleView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3381742E54E03DCDB9DD644DF65C4689 /* JXCategoryIndicatorTriangleView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5490C03887ACF6C4EAC25ADFBB509CE5 /* NSSet+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = C02B6DB0CED9923894E4B972F8B03882 /* NSSet+Lookin.m */; };
+ 54E268C32915CF908E7AA776909B45EB /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 7032D81BB8B12F48732F1EBEA7A020D7 /* MJRefreshConst.m */; };
+ 55910DBCDF99E39955BE01EAD8251081 /* JXCategoryImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC311E0F10AA1170D905B6C90AE765F /* JXCategoryImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 55F7C7F055A18044497F8C88CAE34118 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E6B846D03C97210EDD55850D04A8F27A /* SDImageCachesManagerOperation.m */; };
+ 561420A20DC0A84258A902E9EB69A15A /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A96A60100BE610809D6E0C7741CF992C /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 564714D075CF51356D3D8437846AA6EB /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 32F3C5B0B7D11631504E27D25E8CB5A2 /* AFURLRequestSerialization.m */; };
+ 56D8A7EAE4D72FF6C23421CAB6F21504 /* MJPropertyType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E2D9F4632DB7036D701CB57007800AB /* MJPropertyType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 56E800EB3B2BE8AE0BA45A30974D7920 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 99302CD0854353E1FA9C8EE70F3FCF59 /* Masonry-dummy.m */; };
+ 56F1B543BC54204336CB5E50B60F719F /* Color+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = EEB6F4442CB80A88D94B35721714C121 /* Color+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5735091665AC18FAD028EB68786A85AE /* LKS_CustomAttrGroupsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B2ACD52F18B25CE1FB40A0F1DF81B4A /* LKS_CustomAttrGroupsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 579DDC4FE78455D88E0350C3268D96C4 /* JXCategoryIndicatorComponentView.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E6C9FAE7DD5348F64FBD66AA03DA5B /* JXCategoryIndicatorComponentView.m */; };
+ 58F7CE37BB4CB3BE806B68A502E6E1A7 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 45880427FEDFE00B81EA46DB6F5AFD52 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 596180E0EC9F46D12BA840DC4AA62659 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 5107F5A871AC7AEDAD8C78C1F1AB8E40 /* UIImage+MemoryCacheCost.m */; };
+ 597E390C0BBB75B8045B651C487C2034 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E5DB75D5C223CDC5703FA115447A148 /* SDImageAWebPCoder.m */; };
+ 5A6D3BE92C77ED70C397567996DFAEB9 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DA5F48CB9575D0E2C775D8D7C262C14 /* AFHTTPSessionManager.m */; };
+ 5A8BC91257FF6B36237BF09A7A6EADF6 /* LookinObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 05B3B08A0927761DC2CBA02E9412CD21 /* LookinObject.m */; };
+ 5AF22814CD055B553AD9D78BE54B94E1 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 7446E6EDA4118B08C0D538CAA41C47AA /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5B08596E856E4CC2F34A8A2372F9F764 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = D3CF8B366EB9A41FEDB94035F404215D /* NSArray+MASAdditions.m */; };
+ 5BB6B99986FD7111B3AEBE931C7F507B /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 02E945EEF3757BDF2B47E65C51C4D6D6 /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5BD5D9B8F61C124A62C75D9AC36A07BD /* MJRefreshTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 5128E7CF3F35BE25186575F63661EEF6 /* MJRefreshTrailer.m */; };
+ 5C8279C226EB028B044C5A0F4AC5A91A /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C0ECED1A3FCBB93D40B1BFFF5AE2F27D /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 5CAB535753B28B463140F421E9B00136 /* JXCategoryIndicatorCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BF9910B7B2FF86AF620A45955A338072 /* JXCategoryIndicatorCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D0DEC179A7B4143769C663082E2662A /* LKS_ExportManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3C413B4ED21D886E50FCBC0761408E /* LKS_ExportManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5DCBA14510E091D6A1CE499B08B794B5 /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EA0FACBE46F43AB7A99266BBBF20510 /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5DF02901155278BE109057E17C7C1D99 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 360A9029323DBF687A82BCD2C22F386C /* PrivacyInfo.xcprivacy */; };
+ 5DFCBADAC7D0FAC82C84A6C8E7BF1DA6 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 13B6B935F583A1ED5234B7E3DF044521 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5E10328A83E05D0015D7459FAAEF121D /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3653F678D1C9DBE34F6262A65263C642 /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5EE53074B8A35D48AB76CAF38C88A37A /* JXCategoryView.h in Headers */ = {isa = PBXBuildFile; fileRef = DACFBFCC588CFB73AE8A6DB153DEA42F /* JXCategoryView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5F45735DF355530CC955066D3C007E19 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = DEDFC34DB720F4FD92E634E486425845 /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5F5426608460A8B17C1AE5C2351BAA19 /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F77AB571A5252972C84B67134918B5F /* UIScrollView+EmptyDataSet.m */; };
+ 5FDC4239F7B651092BF582D0F460BAD4 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 239F725CB21A7ABF0EDB35FC92732A5C /* UIView+MJExtension.m */; };
+ 6002CB94684D7C786700D2A294146AEC /* Color+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A8643D9113999359ADC6C79DA48111 /* Color+Lookin.m */; };
+ 61461B0D9D7B81C3F8D24066D9A19DCE /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = C4B0E298E792EE24705C7E8457669228 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 61507E402F1F7C58BF119995A0479A22 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A8DC30D2C209AB66D8E812915E6F319 /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 616A8338C42FB01748DF1BDDA944858D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ECA422AB0F45E3F4B650188FEE476C8C /* UIView+WebCache.m */; };
+ 61857C821395B868C65A8FFE4DA1B4E3 /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = E5B1C13BB84FC1E79BC9BB233B793A5A /* MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 61EAFBCDC83B2C603918B3C9D9A73A18 /* LookinConnectionAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = F3AD144DF03231D478D237DCFC615D36 /* LookinConnectionAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6204F3E4E75772BB6CAB13CD53D9D93E /* JXPagerSmoothView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F178706A5ED2B8C0CCCEA56CC4A04B6 /* JXPagerSmoothView.m */; };
+ 620A0FFFDE5AEF215E28135566106BA4 /* JXCategoryBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = 72F67C5C9E4A93AFE6FF113487609183 /* JXCategoryBaseView.m */; };
+ 62FE895DF9D65A2955A275D909ECBE18 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 635235003B3FEDB8B457A8FFF46C69E3 /* SDAnimatedImageView.m */; };
+ 6525ECE1CAFC1259F9E6E5FDDE6CF218 /* UIVisualEffectView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = D013F3B6606D04CFD12051F02350DB55 /* UIVisualEffectView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
659D38386A3E09422812283BF27D71D1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 67178A8153B1A2F1D0D544B8093E23C5 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CE909BA066F9B44E9C2F036FF3FD44FE /* SDAnimatedImageView+WebCache.m */; };
- 676775CB29378BB6CA3CA5992E9C6A99 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9358338FB49CFCB7417D22C85E339488 /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 67FCC0F9B42B1C20A66E99A3D56BED18 /* LookinStaticAsyncUpdateTask.h in Headers */ = {isa = PBXBuildFile; fileRef = F522B03B0E818BE677108EC202F41472 /* LookinStaticAsyncUpdateTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 683D708C157C95ADB467BDD2230BD4E3 /* UITextField+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 529CC0A76A69631EEA57BEAB673D76B9 /* UITextField+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 68C3E98F8B9D6035962F29AE025DA891 /* UIImage+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A73FC0CD1FAD2820E17CD48DE8962BA /* UIImage+LookinServer.m */; };
- 69345CBCB31076EBF8A2C5885AF973AB /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 758F54E0A75ADEC48F8924BFE16AEB3B /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 694B8697854A776E32032999B2EF1FEA /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 610BD8934663142C5DDE2AF00042FD13 /* UIImage+Metadata.m */; };
- 6960FF2C4D61A09722930B33B1C7135D /* LKS_ObjectRegistry.m in Sources */ = {isa = PBXBuildFile; fileRef = 20466880B35C5065EE68BED96801035F /* LKS_ObjectRegistry.m */; };
- 69A06A02F52EB26259FAD1DF6B121BE1 /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 20E25456C8490BA5725AE87E9508AF07 /* SDCallbackQueue.m */; };
- 69AB6A513D5F36D7360FEF4FDA1D60D0 /* UIView+WebCacheState.h in Headers */ = {isa = PBXBuildFile; fileRef = B354D25F9AAB5A1E64BA7AAED1BA9991 /* UIView+WebCacheState.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 69E353C99C6EEA3C93CCF2E526460B9D /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C92B663B045144AB6926F9C7A3DA791 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 69F6E66A089C40FB1063DE15499BCFDE /* LKS_Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = FFB946957EE60C8096CD34FFD7880091 /* LKS_Helper.m */; };
- 6A19379E3B0370EDA447743C9B1A1379 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 29D938D1AE315B5A7E490702D4DBEED7 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 6B0978C9398336656EE309E62060AEAB /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CE8561E7F90B3736EA348E5236FECB1C /* SDImageAssetManager.m */; };
- 6B5C3592B5E911E833D067D0BC785B1A /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F618581DFE1104C16FA02EB2B00F1B9 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 6BC2A615678C8BAE9F34ABA68BFDEF78 /* LKS_AttrModificationPatchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = FE4F3AC67FEAA51E07D9DCC83CAEB3D5 /* LKS_AttrModificationPatchHandler.m */; };
- 6C57809DCEA4B6C0CA79918A69FD75DE /* LKS_ConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 499DFA9F01A96B26620A744AC7C94DB7 /* LKS_ConnectionManager.m */; };
- 6C85CA8D99E50C137D056B6057DAC58A /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = A0FE1EF8C4E4226EA31F342E982E620B /* UIRefreshControl+AFNetworking.m */; };
- 6CA0B4A9E7B2957063163BC673F355CD /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 352F171C72D103D96370080978C50788 /* AFAutoPurgingImageCache.m */; };
- 6CE8701D161A4BC0860FAF3951762A34 /* LookinHierarchyFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A370DF72E817BB512D9A327AC45F76B /* LookinHierarchyFile.m */; };
- 6D637D02F5EE50D21C8548061956C898 /* UIViewController+Presentation.h in Headers */ = {isa = PBXBuildFile; fileRef = A3F7C5007915361DF90A13BBA8CD3EFF /* UIViewController+Presentation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 6DE6C7F0FA965828E4FCE687BF75FBBE /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 02B660DF025FBF070A8248624E25ED79 /* MJRefreshAutoNormalFooter.m */; };
- 6E4DE8085E69AD1DDB49B059DCE286DB /* HWBackgroundConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 11A5C3D2E3080F2A5EECFB7F1FC6C319 /* HWBackgroundConfig.m */; };
- 6E66305665DBCFBCF5B2480BF705D500 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 057F1DBD0EB25FF8CA833DC6F478BF32 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 6EFC0630CB2761A2B1FC47176CCD62D1 /* LookinCustomDisplayItemInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 47C4451B7E17B800D4088E7182C1025D /* LookinCustomDisplayItemInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 6EFEEE3AE22E97DCEC4F5A3B88F56FC7 /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F3AD0011FB2CA087E42B18DDAD25253 /* SDImageLoader.m */; };
- 6F3637EE643EABB1DE9212EA68649A64 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F9D4F9A4CA404E7287B2F6CBFF382D1 /* UIColor+SDHexString.m */; };
- 7053A9EB6335BEAC9EFDF2D5320E6E2A /* UIView+HW_Frame.m in Sources */ = {isa = PBXBuildFile; fileRef = 109CFCE9774385E51695E82E530412B8 /* UIView+HW_Frame.m */; };
- 7074EA7FCC90B4967A437F5C43496828 /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = AD1C2B98D240951DA7BD821093E6C395 /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 711D32EF4A9901567A488291603BF906 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = F6E7A6844647C14F0728CBB9EC73AF19 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 713D162A627185DA38847832AB5BDA44 /* LSTPopView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EFF087B37DC1EFC63580C904061AC41 /* LSTPopView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 71538A1D21015F459964BA625D5EE90A /* NSObject+MJClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D6996A5821977C26F6D8F02DE8CF8CD /* NSObject+MJClass.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 717F76926C7BCB5B10C3037AD9239084 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = F0F086732258C7153899AB5D8C678B02 /* SDImageIOCoder.m */; };
- 719245E09E34B28240B8144650B43701 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B647311E2487029EA920B923258697D2 /* PrivacyInfo.xcprivacy */; };
- 71BEB1D9532900291A5A24B1C038516F /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = D5D847654327E7F1E333D40CD9665067 /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 71F2B8CBB99087F348C472230200586F /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FA72F287E0DE573DD735BAE9AD7E816 /* SDGraphicsImageRenderer.m */; };
+ 6630C0B541E50903F9AD81FD847CFE7A /* JXCategoryIndicatorBackgroundView.m in Sources */ = {isa = PBXBuildFile; fileRef = 74444E41B3920B9EB4DA66DCD2975612 /* JXCategoryIndicatorBackgroundView.m */; };
+ 67178A8153B1A2F1D0D544B8093E23C5 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = D547696F5943987BC61D389F16B201E8 /* SDAnimatedImageView+WebCache.m */; };
+ 676775CB29378BB6CA3CA5992E9C6A99 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 06077AACB035D8452C9F730B2E1F00DF /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 67FCC0F9B42B1C20A66E99A3D56BED18 /* LookinStaticAsyncUpdateTask.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A769F7014A1F30EE6690E054898162 /* LookinStaticAsyncUpdateTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 683D708C157C95ADB467BDD2230BD4E3 /* UITextField+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 94807C278EC259800EBCD3A346749877 /* UITextField+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 68C3E98F8B9D6035962F29AE025DA891 /* UIImage+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E075739451FCFAA914670EB353642C16 /* UIImage+LookinServer.m */; };
+ 69345CBCB31076EBF8A2C5885AF973AB /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C0E4900E01624D5262A1ED1DF2F6D35 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 694B8697854A776E32032999B2EF1FEA /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B5C2096D95608EEB566217452868E46 /* UIImage+Metadata.m */; };
+ 6960FF2C4D61A09722930B33B1C7135D /* LKS_ObjectRegistry.m in Sources */ = {isa = PBXBuildFile; fileRef = 8127266FF8D9AAE89CDF3511D05BB245 /* LKS_ObjectRegistry.m */; };
+ 69A06A02F52EB26259FAD1DF6B121BE1 /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E8762E22AB8C87B76E6D94D44665136 /* SDCallbackQueue.m */; };
+ 69AB6A513D5F36D7360FEF4FDA1D60D0 /* UIView+WebCacheState.h in Headers */ = {isa = PBXBuildFile; fileRef = B072B2B3BF7FE061CC694AE00BCF5858 /* UIView+WebCacheState.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 69E353C99C6EEA3C93CCF2E526460B9D /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 241FDB4FE9E3CE45C4854F0FEB6F8BAF /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 69F6E66A089C40FB1063DE15499BCFDE /* LKS_Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 38A98EA0745C9E839DCFD56B22BF1256 /* LKS_Helper.m */; };
+ 6A19379E3B0370EDA447743C9B1A1379 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C18993732E8D418AEA50EC6162EDC /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6B0978C9398336656EE309E62060AEAB /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F94B604866DB37515D32D88635EFEE2 /* SDImageAssetManager.m */; };
+ 6B5C3592B5E911E833D067D0BC785B1A /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C3B1F50C3A3E82B67AE98F2BAAD5C3C /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6B9D333C18DDBF4E7CC889F7FDE05EEA /* JXCategoryDotView.h in Headers */ = {isa = PBXBuildFile; fileRef = 50BCF4AA1A75105CC04AA446B0DB9B40 /* JXCategoryDotView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6BC2A615678C8BAE9F34ABA68BFDEF78 /* LKS_AttrModificationPatchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 908A8A591A12931E59C177277E1D126D /* LKS_AttrModificationPatchHandler.m */; };
+ 6BE86A0FFB0D69C6098CC75E1FB4E8B5 /* JXCategoryIndicatorCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B3FF5D113848A5A9AC244C579FF1441 /* JXCategoryIndicatorCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6BF5DB46D42D8B9D536C870EC77BF4A3 /* JXCategoryIndicatorBallView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A60D0CF9AE4E6671E2A6BBECEE57E4D /* JXCategoryIndicatorBallView.m */; };
+ 6C57809DCEA4B6C0CA79918A69FD75DE /* LKS_ConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F1C50876E480E256FAA99FC38F2BC478 /* LKS_ConnectionManager.m */; };
+ 6C76DB1B99B98C951F687DE80FE6F463 /* JXPagerListRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = 603287955CE071E6EBDC96A98AB97750 /* JXPagerListRefreshView.m */; };
+ 6C85CA8D99E50C137D056B6057DAC58A /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = BEC06B30EADD5F0931B350F94CD4D15C /* UIRefreshControl+AFNetworking.m */; };
+ 6CA0B4A9E7B2957063163BC673F355CD /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A984C0F36AC5CCB478D87C1F7E4019D /* AFAutoPurgingImageCache.m */; };
+ 6CE8701D161A4BC0860FAF3951762A34 /* LookinHierarchyFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 16E6E00D729B1498CE18200F50778930 /* LookinHierarchyFile.m */; };
+ 6D637D02F5EE50D21C8548061956C898 /* UIViewController+Presentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 201E2681B892F05C3D7CAFE9E9927D15 /* UIViewController+Presentation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6DE6C7F0FA965828E4FCE687BF75FBBE /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2CC2D1F9AB2D4CFC68B6327C2793C5 /* MJRefreshAutoNormalFooter.m */; };
+ 6E4DE8085E69AD1DDB49B059DCE286DB /* HWBackgroundConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = ED71DE4537C6ECADC81696A80C943E64 /* HWBackgroundConfig.m */; };
+ 6E66305665DBCFBCF5B2480BF705D500 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 28EBA38DF7DE3C55A1DCF1C9536E3712 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6EFC0630CB2761A2B1FC47176CCD62D1 /* LookinCustomDisplayItemInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = CF0E98CA3E42AAC3B854E232BB1AF7FB /* LookinCustomDisplayItemInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6EFEEE3AE22E97DCEC4F5A3B88F56FC7 /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = FA395F2DBB98D70F218443EA65E0D442 /* SDImageLoader.m */; };
+ 6F3637EE643EABB1DE9212EA68649A64 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = E29E39BBB558CC51A6DB91379351B72E /* UIColor+SDHexString.m */; };
+ 6F3A575F2B9E1CEB696248B9CB96F357 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = C1227D6957584FA14F5EFE311854C54A /* PrivacyInfo.xcprivacy */; };
+ 6F75FDB9BE37C9A8473F97B1696B5D09 /* JXCategoryListContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = E25EECD78C776DB2FDB519D3AA7CB0BD /* JXCategoryListContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7053A9EB6335BEAC9EFDF2D5320E6E2A /* UIView+HW_Frame.m in Sources */ = {isa = PBXBuildFile; fileRef = B444EEABD213A46C07AC5F1B8D73FBF1 /* UIView+HW_Frame.m */; };
+ 7074EA7FCC90B4967A437F5C43496828 /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = A5C74D4E7CA539C956587A3615702D24 /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 70D30BC7134E3C8006BF0B6A4B438057 /* JXCategoryTitleImageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 639A45B880AEBFE1C16D4A9F3AA3D49C /* JXCategoryTitleImageCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 711D32EF4A9901567A488291603BF906 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BB4D65769822C57911F4A84B9F8FADFA /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 713D162A627185DA38847832AB5BDA44 /* LSTPopView.h in Headers */ = {isa = PBXBuildFile; fileRef = BF40FB09CDD92326BB3177C14DF172AD /* LSTPopView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 71538A1D21015F459964BA625D5EE90A /* NSObject+MJClass.h in Headers */ = {isa = PBXBuildFile; fileRef = F7CD4CF41A222A66B3E435AB32DF697D /* NSObject+MJClass.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 717F76926C7BCB5B10C3037AD9239084 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = D2F471FC57FF6DD1F698134B35D27C95 /* SDImageIOCoder.m */; };
+ 71BEB1D9532900291A5A24B1C038516F /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 368AF39857A6659131D7CD15698E6867 /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 71F2B8CBB99087F348C472230200586F /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = FC52B8F222678A49BF1BA307CD9A7777 /* SDGraphicsImageRenderer.m */; };
+ 72157F8282836C3F6D65008E2F193655 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
723D1925C39764631641D0DBFDF6833B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 724991CA89C46BAFBC08264D94D86484 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = B686FCB243BCB66C7BB1F42E6A4B3417 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7276688DEA6FB95D4DEB7F3D019C3958 /* HWPageSheetPresentingAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = FF47B51E8368756DB1E42F174494224F /* HWPageSheetPresentingAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 728107C8D8479AADE986F4EC23233DC3 /* UIScrollView+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 66C0C4029B17B8E45FF492CEEBD834E3 /* UIScrollView+Helper.m */; };
- 73B19D03C7B7DF1C944544165F742D82 /* HWPanModalContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5030EF25D193EB41CCA5DF24FE48C1DF /* HWPanModalContainerView.m */; };
- 74ABF19BACB99F862DB62AA14508AFA0 /* LookinAttributesGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C5830BBF390FC8D9CCA3C6BDBE65DD04 /* LookinAttributesGroup.m */; };
- 74C474676C69A80BEC29B0F55FDF4D19 /* UIView+WebCacheState.m in Sources */ = {isa = PBXBuildFile; fileRef = EF5BED7A35D904E495E540434D07B398 /* UIView+WebCacheState.m */; };
- 74E069F8C9E22C0E37F261A5AB03A613 /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = F27AC2454398D7EA8C514D5B2F6469EF /* SDWebImageDownloaderConfig.m */; };
- 752822FE3F5092322D18FEC4533B79A9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 5703D16A54AB62E92D3E21CC6E5EA55B /* SDWebImageDownloader.m */; };
- 75771A97B77FA30A0175A81B480F80EF /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D8DA2BACDEA7D78265D10D62F7A3BF7 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 76019F9FDD44B8F79261AD55C8728164 /* UIView+HW_Frame.h in Headers */ = {isa = PBXBuildFile; fileRef = C387114CB39CEE512E07F38E4439D4D8 /* UIView+HW_Frame.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 76C8C631DF9AC2F667369EEA0CE46522 /* HWDimmedView.h in Headers */ = {isa = PBXBuildFile; fileRef = E164F75EDECDE7B82945FA657EA41708 /* HWDimmedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 772CF8E9CD02ECA4275B6173E2110E80 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 2019C0149E4FA95B56F04C424C11298A /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 724991CA89C46BAFBC08264D94D86484 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = DC285A6C8053D7E2AE423BE51B24E8AE /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7276688DEA6FB95D4DEB7F3D019C3958 /* HWPageSheetPresentingAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = DD3CC2F2CD0FD607BD99AA89E970269A /* HWPageSheetPresentingAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 728107C8D8479AADE986F4EC23233DC3 /* UIScrollView+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = CCA4AAE27B9CAF06CC2B0A3C0A3F0594 /* UIScrollView+Helper.m */; };
+ 73B19D03C7B7DF1C944544165F742D82 /* HWPanModalContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BB86632EEB3EB44D0413B3A6F7F6875 /* HWPanModalContainerView.m */; };
+ 74ABF19BACB99F862DB62AA14508AFA0 /* LookinAttributesGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E02457FB07FECD161E03C2A1A8B72B3 /* LookinAttributesGroup.m */; };
+ 74C474676C69A80BEC29B0F55FDF4D19 /* UIView+WebCacheState.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6C98975F33C466CDCC506B95080046 /* UIView+WebCacheState.m */; };
+ 74E069F8C9E22C0E37F261A5AB03A613 /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 47655EC4466A20F4BEC0C76B8F4C5440 /* SDWebImageDownloaderConfig.m */; };
+ 752822FE3F5092322D18FEC4533B79A9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FED06425BD958CD54FC4A96C6FF1992 /* SDWebImageDownloader.m */; };
+ 75771A97B77FA30A0175A81B480F80EF /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = D843F393C308E0D3BCB88A0B04FDB291 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 76019F9FDD44B8F79261AD55C8728164 /* UIView+HW_Frame.h in Headers */ = {isa = PBXBuildFile; fileRef = B63B552A0A52E65141ED8027A3FCCB0D /* UIView+HW_Frame.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 76C8C631DF9AC2F667369EEA0CE46522 /* HWDimmedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 017032FDD415E1762246EBCDD2228351 /* HWDimmedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 772CF8E9CD02ECA4275B6173E2110E80 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D93DBFF5810549335063D430FB33721 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 780EDF2615923E89C179EB5A60D2DA41 /* JXCategoryCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6999AA4E4990D39E732B0FABF0CBB3CA /* JXCategoryCollectionView.h */; settings = {ATTRIBUTES = (Public, ); }; };
7873F2F89CD0A435FAB776BC27BFB56A /* MJExtension-MJExtension in Resources */ = {isa = PBXBuildFile; fileRef = 43EAAD2AB7E6B407E80E95F643F93D22 /* MJExtension-MJExtension */; };
- 78A3C3994AFFC6A2D4970AEB6D797CE5 /* LKS_HierarchyDetailsHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = D3831111080859754E7A75FF007ED40F /* LKS_HierarchyDetailsHandler.m */; };
- 7902D28FC9EF5AFEB452F508C7F266B1 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CBF9C8DF911E4E9B2C6A4628B5BC93B /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 79534562F85AA71041043B395DE14AD0 /* HWPanModalContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = DD391D4FA7F38A97455407F9DA5DA8F0 /* HWPanModalContentView.m */; };
- 7989A6E79BFA78440C39F568D972305C /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 710E437843F202473C82F6B19F6E51D8 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7A4EB9ED5D4E03170FFE61FCB299687B /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C82B001CD34AC553F11A55D1E576C902 /* SDAnimatedImagePlayer.m */; };
- 7C45DBA62EE045C4922404182F6393B8 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A980D9B3DB04133A466725A1C6C22F8 /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7C53FB6BBB0CBAA879F1603B0FEDB80B /* LookinAttributesSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 0531DC0648DD160A9576D09368C28017 /* LookinAttributesSection.m */; };
- 7C5505A2D3F2A697A5F324787061F4B7 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D2A884E58C9EFE4F57508CA7855F449 /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7C8782A3078662BC2EF639A9608A2C82 /* LKS_InbuiltAttrModificationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E75619300BC832136529DA87152075 /* LKS_InbuiltAttrModificationHandler.m */; };
- 7D736CE5AD0A987D2A7D2FD72E31BF41 /* CALayer+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = B68B9359B3F4863CD16BC4AF1031EDD1 /* CALayer+LookinServer.m */; };
- 7E4F0978B25350B2B28678A0BE7B3785 /* LKS_HierarchyDisplayItemsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 310204C87FE20FAAF183EEE0D555B729 /* LKS_HierarchyDisplayItemsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7E8A564A958AF81E5F63F34B8E550E58 /* LookinAttributeModification.h in Headers */ = {isa = PBXBuildFile; fileRef = F7C8B71EAA1C160D9B20E934869F7E16 /* LookinAttributeModification.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7F10C0D094C74F2FA4CD38C7FD77B0A8 /* WKWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E8284A1808A9A014FA6F2F4E23F36835 /* WKWebView+AFNetworking.m */; };
- 7F886FC2763F0BF1625A24EE4F94C04D /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 01CCBFAC5118E8E6A44DA067EF8F2523 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7FA48BF8B9F73775654E75CEB5363FF4 /* UIViewController+PanModalPresenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 995AA67533265367D116C78944065262 /* UIViewController+PanModalPresenter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7FA8C78DB021A7731D30D80C102DE042 /* NSObject+MJKeyValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C694B3CF0214D5165615510B34C3812 /* NSObject+MJKeyValue.m */; };
- 7FF8A56511E71D6FEC966BF9FEE135B5 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A0368DACE23383F23784ADE51EC66773 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 80EBFDD01E84CE4E8AE5BAE9CB3C7C1D /* HWPanModalAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AF90BBEF3A681BE8314F80257F1182C /* HWPanModalAnimator.m */; };
- 810C8D7902163BBA0185A4A112B2DFD6 /* LKS_TraceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04A251837ED47D22FF5ACBFA97F91D4A /* LKS_TraceManager.m */; };
- 813BE4C96A6D39C13EC50C6CD164F0AF /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = D7117B22CB4967C93BC27DD5B1BA9865 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 81A5635CEA2AD9623E30CAE9AFC3BF65 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 77EC014BA0072D21D1B86EE5C78C59EA /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 821FF6B43F7ADAB6B60459D2966B33CB /* CALayer+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = A701AEED09FE2183269AA89DFA8E4B7A /* CALayer+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 83530BF68848CD2C4A79A1FD69B304A5 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 37B5AAFF8675170D1D643B53FECA47E3 /* SDImageGIFCoder.m */; };
+ 78A3C3994AFFC6A2D4970AEB6D797CE5 /* LKS_HierarchyDetailsHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6736D1FBB305C05AEAB982F817CD80C1 /* LKS_HierarchyDetailsHandler.m */; };
+ 7902D28FC9EF5AFEB452F508C7F266B1 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = DEDB698B7BC2AF63B53722CF1D2D8E57 /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 79534562F85AA71041043B395DE14AD0 /* HWPanModalContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 77BA4318333FADE07B128DB446EA0F64 /* HWPanModalContentView.m */; };
+ 79701CF51014A7C02D810F9DAEFE6D79 /* JXCategoryTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 057CD48F09C7A5468D77A9691A639803 /* JXCategoryTitleCell.m */; };
+ 7989A6E79BFA78440C39F568D972305C /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 1325B9E2F97C77F3E9191898C4045E7E /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7A4EB9ED5D4E03170FFE61FCB299687B /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8532F3DD3C373C14A106D14F67A3C301 /* SDAnimatedImagePlayer.m */; };
+ 7C45DBA62EE045C4922404182F6393B8 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 109DC293F90D678E22D453F41A197049 /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7C53FB6BBB0CBAA879F1603B0FEDB80B /* LookinAttributesSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 97428E2E54CAC989DD7A12908613EE16 /* LookinAttributesSection.m */; };
+ 7C5505A2D3F2A697A5F324787061F4B7 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C2B7AF68C3BEF4AD97A93A90F9EFF44 /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7C8782A3078662BC2EF639A9608A2C82 /* LKS_InbuiltAttrModificationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0451732A9C9A896EEC15BEC88B3151 /* LKS_InbuiltAttrModificationHandler.m */; };
+ 7D1E98BE9558F6E5E29B0E81EC526A90 /* JXCategoryImageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E2875C79F8461486A975B000C1ABDE3 /* JXCategoryImageCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7D736CE5AD0A987D2A7D2FD72E31BF41 /* CALayer+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E1921A1332A20D950700741950E97126 /* CALayer+LookinServer.m */; };
+ 7E4F0978B25350B2B28678A0BE7B3785 /* LKS_HierarchyDisplayItemsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = A9B0E721EBB3914236D06250E333F1E9 /* LKS_HierarchyDisplayItemsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7E8A564A958AF81E5F63F34B8E550E58 /* LookinAttributeModification.h in Headers */ = {isa = PBXBuildFile; fileRef = C9F0D4D92726FF95FE428AA975E93DE2 /* LookinAttributeModification.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7F10C0D094C74F2FA4CD38C7FD77B0A8 /* WKWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = D675E9EED90BA5941D43EB2C520A01B8 /* WKWebView+AFNetworking.m */; };
+ 7F886FC2763F0BF1625A24EE4F94C04D /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D000260D6BB658E0BB519087E88F883 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7FA48BF8B9F73775654E75CEB5363FF4 /* UIViewController+PanModalPresenter.h in Headers */ = {isa = PBXBuildFile; fileRef = B46DF40E1300BE3FC009F0D7D5CF5ED0 /* UIViewController+PanModalPresenter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7FA8C78DB021A7731D30D80C102DE042 /* NSObject+MJKeyValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CE2A9B22B9FC87A02A230599E72D4F1 /* NSObject+MJKeyValue.m */; };
+ 7FF8A56511E71D6FEC966BF9FEE135B5 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 7965DB1FD06E64A9C5B34CB6D9909B3A /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 80EBFDD01E84CE4E8AE5BAE9CB3C7C1D /* HWPanModalAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D7B291E3BCDB41106F548FA3B84901 /* HWPanModalAnimator.m */; };
+ 810C8D7902163BBA0185A4A112B2DFD6 /* LKS_TraceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 36457C61634F1414F6DDF4C701ABF567 /* LKS_TraceManager.m */; };
+ 8128D2BD3AC890F75E7AD243AA104C13 /* JXCategoryIndicatorParamsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = AAFEF3383472BCA83D71A7DAAC5522CC /* JXCategoryIndicatorParamsModel.m */; };
+ 813BE4C96A6D39C13EC50C6CD164F0AF /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 979A3BAC302F65855776332D6027B80C /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 81A5635CEA2AD9623E30CAE9AFC3BF65 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 10B904BAC9CC3925EE6B4E2130826A6F /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 821FF6B43F7ADAB6B60459D2966B33CB /* CALayer+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 732327FB0ADC252437B580203795D95F /* CALayer+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 83530BF68848CD2C4A79A1FD69B304A5 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE77C4D90418C342647C55D75A5C1AE8 /* SDImageGIFCoder.m */; };
83A4F2816C1B3F072E1A26A34C3BC4AC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 84065EC0D4446E7448D1BCFB4040230E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
8414CFEEB64ACA817EB88D2FEADDA3B3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 854807558DCB972EDDFC1D00032BA6E4 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B2F034522C4ACEB56FB7ECF5D3CDFDB /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 85AB23275E9D19394969235E5DC2300E /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B6DBCFC84C1E1F5D3AF983520203544 /* MJRefreshHeader.m */; };
- 85BB8B4B5C29C5EEC52282F33A4CAF23 /* LookinCustomAttrModification.m in Sources */ = {isa = PBXBuildFile; fileRef = D9F0FAF97F68F13F21EE3D8E18046926 /* LookinCustomAttrModification.m */; };
- 85C0B4EE334B9972299E62DE61A4BB56 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C895614137416E86433C8E5EAF1D3CD /* SDImageLoadersManager.m */; };
- 860CB3A5D2E13B946CD2EFB7F749C4CF /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = E382492BA0D4E5C9BEF289F10F029CAA /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 864972FB0DF4B464B1B505AA5F788E91 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 56951EB060616356F951F35CBD9A6E42 /* SDInternalMacros.m */; };
- 88473AE7C22F952DACB39FA0758D1624 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 584341F234CCB4128A1A3854A3371179 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 8872BEB0954C0254A792469F4DBC9891 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = EA8BD469A978049C96BA8554A1F6D2D6 /* MJRefreshAutoStateFooter.m */; };
- 88A23DF6F5638AC66C28C4102824E8B5 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BC9B980A57804E48A923737AE36ACB0 /* NSImage+Compatibility.m */; };
- 89B88FAD396608AAA9F935E471BB3CB9 /* LKS_HierarchyDetailsHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = C7B7F069BA04D7981F13F5FA41B3BAB5 /* LKS_HierarchyDetailsHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 89EAB8D0452D0E2114ED971B10D98CC3 /* LKS_HierarchyDisplayItemsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = B772F3922ED9C416DBFEA6651FBB3930 /* LKS_HierarchyDisplayItemsMaker.m */; };
- 8A256CA266FB314BBD4DB2287DAEF247 /* LookinAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 25283803DB6704A7DFB24BD626A74C6E /* LookinAttribute.m */; };
- 8AF38EDB1E9BF0D334AEB23C488870B8 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 107D93AEC1E186A8F21341BFB523B22C /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 8B9B9EACA282C583FCF9A3B8E49DD830 /* LSTTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F067A700BA9565969A60D7617155FBC /* LSTTimer.m */; };
- 8C6C7E25C5A24C936F81823978190E96 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5973F7F7FB04C5938E91F05D46F22B54 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 854807558DCB972EDDFC1D00032BA6E4 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E138C277A1DD60E5BB20AB4EC7CEBDB2 /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 85AB23275E9D19394969235E5DC2300E /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2B6D97C6E9B5572232985B40BDA6C4 /* MJRefreshHeader.m */; };
+ 85BB8B4B5C29C5EEC52282F33A4CAF23 /* LookinCustomAttrModification.m in Sources */ = {isa = PBXBuildFile; fileRef = F6CC661C43717D8BBB4405FD037BDC03 /* LookinCustomAttrModification.m */; };
+ 85C0B4EE334B9972299E62DE61A4BB56 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B3F518DFA534AD602991065542FADB29 /* SDImageLoadersManager.m */; };
+ 85ED10431A6C01970A3DAD8A8C9BF25F /* JXPagerView.h in Headers */ = {isa = PBXBuildFile; fileRef = D3F906D47799FB7ED8D4AA1C036BF3BC /* JXPagerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 860CB3A5D2E13B946CD2EFB7F749C4CF /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 81D4FD0C7D7C987D10815371E729DAC0 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 864972FB0DF4B464B1B505AA5F788E91 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 123714F0F2335CBE901933785D4D26FB /* SDInternalMacros.m */; };
+ 874CE8F3650D220092077846A46598E6 /* JXCategoryTitleImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FBDD10C8770914A56998AB2021E385B /* JXCategoryTitleImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 88197D535BEBB0F4B71F106AE300631D /* JXCategoryBaseView.h in Headers */ = {isa = PBXBuildFile; fileRef = 173BFB44F7DA63CD3AF5A497970B8203 /* JXCategoryBaseView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 88473AE7C22F952DACB39FA0758D1624 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 82BDCD67CE12306B5AF6A9E3DB88E0DA /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8872BEB0954C0254A792469F4DBC9891 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 401F0F0AAEEDDA40C2D25DB817C9B5C6 /* MJRefreshAutoStateFooter.m */; };
+ 88889F5DA04EB4FA08125742B5E522DA /* JXCategoryTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = E42238B57F88C70438DE479E184E4352 /* JXCategoryTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 88A23DF6F5638AC66C28C4102824E8B5 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 102C92CE02746A6588B44F852322AB39 /* NSImage+Compatibility.m */; };
+ 89B88FAD396608AAA9F935E471BB3CB9 /* LKS_HierarchyDetailsHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 21696AB985A15DE2C63BD9A8CD978F59 /* LKS_HierarchyDetailsHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 89EAB8D0452D0E2114ED971B10D98CC3 /* LKS_HierarchyDisplayItemsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D3112C49688EF3F713F0D64A22E6E66 /* LKS_HierarchyDisplayItemsMaker.m */; };
+ 8A256CA266FB314BBD4DB2287DAEF247 /* LookinAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = DDDA744A029AF23E45515CE37C056256 /* LookinAttribute.m */; };
+ 8AF38EDB1E9BF0D334AEB23C488870B8 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4561971E2CF7A1F1B00AC6091B3448DE /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8B47B7F220A2B9E121EFF5A28B477972 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
+ 8B990235A0006E1F9C1E6F68AD81F77C /* JXCategoryView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CBA389E7DB380F4012EFBD733C81D43A /* JXCategoryView-dummy.m */; };
+ 8C6C7E25C5A24C936F81823978190E96 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = D48043130F64D218A676B16D2CDA0ED8 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
8D2CBEBF5F1DA6766A833CCD0BF02B5B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 638488B4F5FF9C67F848A841B1A34765 /* CoreGraphics.framework */; };
- 8D8AD606ECD8E1F247965CD43956D412 /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B8786CBA6B78647E486B3CA129F2DAD /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8D8AD606ECD8E1F247965CD43956D412 /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C750768FB8EE26E8F613C1D910045B /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; };
8F30C8026F48C60D5B2CAE9CFC166004 /* Pods-CustomKeyboard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CB13D51E717D347023EEB57263E3072 /* Pods-CustomKeyboard-dummy.m */; };
- 8FF7B6477BFA6E6ABA168E1417291D5F /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = F738F2BE3FA2AD49A9764CC72FDBAFB2 /* MASCompositeConstraint.m */; };
- 906DCE66CD5BD236081D468616199BB7 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 56BB70CC7870B5212EFAD74AF8199F17 /* SDWebImageOptionsProcessor.m */; };
- 91AAF555B286FBF53E4F98D092B406BD /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1458CC53A93F0D10D4564ECD3E1C2D28 /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 91E8B94F8E02ABF5197DF5AE7D0B3934 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A34081EC91EFEC16FB92BEE1A470458E /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 928371B066E1211CE87089668D5BCB4C /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D9FB07B277FA3212774D9D7EF2156759 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 928A1ED0692DF0229F66A87135F93F2A /* LKS_CustomAttrModificationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A4A3709BA82F970D60FE150EDB33D1 /* LKS_CustomAttrModificationHandler.m */; };
- 9345137ED10358B60E37D05FB6165759 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 31BB750A026F77ECDF9EFB2711DEC741 /* SDFileAttributeHelper.m */; };
- 9358FC6C6DA728AEE250D8E7DD236946 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = A14004EB25D5BC99B439F5543C20E8CF /* MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 93E8C78EAE0B7613201813966B8E04E2 /* Image+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CED825638D1B3169A0C8EE7A57C720 /* Image+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 955B87902E039163281C4F47C95DB851 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = E49B94A4D72DB4B81F4E8CDC098BC388 /* MJRefreshBackNormalFooter.m */; };
- 96E97174F4614FFA0649085022CB4AFE /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 244BBBE37C5D845F2BB8EAFBE6D12DE5 /* SDWebImage-dummy.m */; };
- 97235408E59E16C18B6BDA1D29E1CB26 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 92B30D23B01D493E996B4DF061CC3062 /* SDWebImageManager.m */; };
- 97385A64CA020489951EF769392C6DCF /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = EA5F1011035F011FF8DB93B55405B76E /* UIView+WebCacheOperation.m */; };
- 9887678D7D6BC165694560D92AF2C31A /* LookinConnectionResponseAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 8983C7CF18477B6B6E981751F1C09853 /* LookinConnectionResponseAttachment.m */; };
+ 8FF4E9A492CA258F45C0BC51F6F69650 /* JXCategoryTitleImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D4AA530BA675D0E78BDD9644338B48A3 /* JXCategoryTitleImageCell.m */; };
+ 8FF7B6477BFA6E6ABA168E1417291D5F /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = FD6EC1E4FB3615CE938900B23CEAD0F8 /* MASCompositeConstraint.m */; };
+ 906DCE66CD5BD236081D468616199BB7 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A632B4F7EA06C55CADB3BF7C49D7860 /* SDWebImageOptionsProcessor.m */; };
+ 91AAF555B286FBF53E4F98D092B406BD /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A543722998E5C6171A0B4A729D11BBB /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 91AFF41167C616A131F2E24563B8DDD8 /* JXPagingView-JXPagerView in Resources */ = {isa = PBXBuildFile; fileRef = E03F152E95B6924D2486511337D24503 /* JXPagingView-JXPagerView */; };
+ 91BEBD471C408E6C72763AFB6926242B /* JXCategoryTitleImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8618BF2AA2A260801FDF48131074A906 /* JXCategoryTitleImageView.m */; };
+ 91E8B94F8E02ABF5197DF5AE7D0B3934 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 5716AF79F54782358457FBB452B73975 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 928371B066E1211CE87089668D5BCB4C /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CAD21419CFC8A372DB941E7983ADDD9D /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 928A1ED0692DF0229F66A87135F93F2A /* LKS_CustomAttrModificationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 29CA4DC7FB25B91EAA2B3847B7BB46A9 /* LKS_CustomAttrModificationHandler.m */; };
+ 9345137ED10358B60E37D05FB6165759 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B90877BBAECA72C2F67A5E39E1E87A /* SDFileAttributeHelper.m */; };
+ 9358FC6C6DA728AEE250D8E7DD236946 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 1326C5B7B2B67B2A6E9A785F1ECEA87F /* MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 93E2C24501FAE3C3B886B9879786EF22 /* JXCategoryTitleVerticalZoomCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D390F38F6574F6D973E2C4A52D004A1 /* JXCategoryTitleVerticalZoomCell.m */; };
+ 93E8C78EAE0B7613201813966B8E04E2 /* Image+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 17FBA36FB2D4DFAA4437CEE5C69F4BBE /* Image+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 940CD731A431894B0EE4E3283E6F352F /* JXCategoryBaseCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 51E7542749774862B8EB9AAB7010F1AA /* JXCategoryBaseCellModel.m */; };
+ 955B87902E039163281C4F47C95DB851 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = C55730A1966B5DF338B0554ACC4B0B16 /* MJRefreshBackNormalFooter.m */; };
+ 95CCA80D6790CF64F974A53E815420F8 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 75A91D4BB6118442A9B7E27598AE7C99 /* PrivacyInfo.xcprivacy */; };
+ 96C1D55B3436C158B4CBB4E3D0AE53EE /* UIColor+JXAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 137AD002D5B6FA89785842F03034A5B1 /* UIColor+JXAdd.m */; };
+ 96E97174F4614FFA0649085022CB4AFE /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B82D87F3DD4A8EB4C508E0BFA04090 /* SDWebImage-dummy.m */; };
+ 97235408E59E16C18B6BDA1D29E1CB26 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ED4FAFE5BD7891D4471852209337077 /* SDWebImageManager.m */; };
+ 97385A64CA020489951EF769392C6DCF /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A19BDA4E648916460C20489D6D183F0 /* UIView+WebCacheOperation.m */; };
+ 9887678D7D6BC165694560D92AF2C31A /* LookinConnectionResponseAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED1A3436209E7EBF3356CEC094C7391 /* LookinConnectionResponseAttachment.m */; };
98AB6B8EB7FF096BCE87488C5AB3DF1C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- 9A7FB1E975A5955C896E6B195C521804 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = C59475012E53558600AFA4F7685E8F9E /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9A89C16038149623A1DF06D47E7F953A /* LookinStaticAsyncUpdateTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D08B8F280C5811F6505EA1AE7983082B /* LookinStaticAsyncUpdateTask.m */; };
- 9B06400877E40C173F5A1C9761F288CB /* UITextView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = DE9ADECB39002B8ABC9BF590B430634B /* UITextView+LookinServer.m */; };
- 9B1EF09A8A473D92C1258B00791BF5F0 /* UIView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = B51F28BC73CA22D31949B1635AF8CAE1 /* UIView+LookinServer.m */; };
- 9B3420DEB8A0CCB9E1241A669AEFCA8E /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 086D3945C39C8554602424E64D1A9F0B /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9B9343E8599EE5196BA75E842DCB48B7 /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = A187D3CE401AEF4272748BA58A834812 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 9BBBDC6BB6583BCAA75242231B62B530 /* HWPanModalPresentationUpdateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 70ABAEE0904B02D3CE9045A0A088E18F /* HWPanModalPresentationUpdateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9CE425B89294BE2C13E70A86E75B15CF /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 889630ECFAA2151C2C1F334458A5C110 /* SDDiskCache.m */; };
- 9D422527A25BAE6A207DEFE11958ABBC /* AFCompatibilityMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B7C62DACFDBE481DDA82F7BE3396A68 /* AFCompatibilityMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9D859B99561C389C0F494428F66F1871 /* HWDimmedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 10D1C021B7050EF6841A364EE9A0A570 /* HWDimmedView.m */; };
- 9DDDCFC08B54A61C519DA78F94464E6B /* LookinHierarchyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 274EF5BCECE08045C7BB130E4D6ED8E4 /* LookinHierarchyInfo.m */; };
- 9DF446F8CA5BC4D4098766EC9063012C /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = DE5FC1FDACC1A466A889091A6DD9D1B4 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9DFFD4780CA32B8E53D9F4FBC8B3F5AC /* LookinAttrIdentifiers.h in Headers */ = {isa = PBXBuildFile; fileRef = AA574A6EA7EECCE7D1E086B964FA3C65 /* LookinAttrIdentifiers.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9E3C5CB1C97B2ED16218956999BFF7AC /* LookinTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 20C42B1A5A080256AC39DD86D000ACD5 /* LookinTuple.m */; };
- 9E6B00AF2ECE462D4D3C42AFC02F2AD7 /* LookinEventHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 79D13E836577BF8A934C5D3D24826BD0 /* LookinEventHandler.m */; };
- 9EBA682DA814406E9E5EF300587AF341 /* LookinAutoLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = D1F143BC4A879AC2B9896478CE4FF798 /* LookinAutoLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9F89DCAA4092F3897E43E89842069A26 /* LKS_AttrModificationPatchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FED881DC5D7531317A8A2A309D96815F /* LKS_AttrModificationPatchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 9FB234EB4D8B5BCC699DB491E204594F /* LKS_GestureTargetActionsSearcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D9DDC30D49B9BC3DFA8D9BC83722C14 /* LKS_GestureTargetActionsSearcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A078A275FFFA48D620074790DA3CA6CE /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = B4E40A4D926E9D870172CB05C27151FC /* MJRefreshStateHeader.m */; };
+ 9A7FB1E975A5955C896E6B195C521804 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E42525F0D8B91406B2C7015E3E52B29 /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9A89C16038149623A1DF06D47E7F953A /* LookinStaticAsyncUpdateTask.m in Sources */ = {isa = PBXBuildFile; fileRef = EC9D66F9AD565D0A6E6595CFC812165E /* LookinStaticAsyncUpdateTask.m */; };
+ 9B06400877E40C173F5A1C9761F288CB /* UITextView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3791DA4B477B236E8816C08DD01E3B45 /* UITextView+LookinServer.m */; };
+ 9B1EF09A8A473D92C1258B00791BF5F0 /* UIView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E9CB22320707CAEB4EE4C1DF62EB9E1A /* UIView+LookinServer.m */; };
+ 9B3420DEB8A0CCB9E1241A669AEFCA8E /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 167D63F7114C5D501803C08C617324CA /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9B9343E8599EE5196BA75E842DCB48B7 /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CCCC7F014C0FE2CA551D9AF48EEF89 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 9BBBDC6BB6583BCAA75242231B62B530 /* HWPanModalPresentationUpdateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B98EB1E5D5490C1C17C90E124262C80 /* HWPanModalPresentationUpdateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9CE425B89294BE2C13E70A86E75B15CF /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 45505B1DFA133379CEE6DD6D8148013D /* SDDiskCache.m */; };
+ 9D422527A25BAE6A207DEFE11958ABBC /* AFCompatibilityMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 29C25E996193BA4D1FCBB5C2A7812FB9 /* AFCompatibilityMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9D859B99561C389C0F494428F66F1871 /* HWDimmedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6194A35582043CD8893F293567547D72 /* HWDimmedView.m */; };
+ 9DDDCFC08B54A61C519DA78F94464E6B /* LookinHierarchyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D8B581D78D02F65425434F924BB64B3 /* LookinHierarchyInfo.m */; };
+ 9DF446F8CA5BC4D4098766EC9063012C /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ECB40CAF1E6F3F4A5F02F74E30B95E8 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9DFFD4780CA32B8E53D9F4FBC8B3F5AC /* LookinAttrIdentifiers.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B857386E2ABDB8C3FD8B5797430DF26 /* LookinAttrIdentifiers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9E3C5CB1C97B2ED16218956999BFF7AC /* LookinTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A60F6547480237BC04A6287158556B4 /* LookinTuple.m */; };
+ 9E6B00AF2ECE462D4D3C42AFC02F2AD7 /* LookinEventHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CAEC579F15CFFDB2E384C98A046EA76 /* LookinEventHandler.m */; };
+ 9E7FD4501C2EF7FBF3379D21E46DB07B /* JXCategoryBaseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B08ADE1A4FFE94FDBBE13FE7CC2C1E5 /* JXCategoryBaseCell.m */; };
+ 9EBA682DA814406E9E5EF300587AF341 /* LookinAutoLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FFD17C3FF6DE53EF72736C597DF5B82 /* LookinAutoLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9F89DCAA4092F3897E43E89842069A26 /* LKS_AttrModificationPatchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F0B0B2E800350D0E38B61EF43E6CE75 /* LKS_AttrModificationPatchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9FB234EB4D8B5BCC699DB491E204594F /* LKS_GestureTargetActionsSearcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 029DB3501B51C5C14FA8EC0A89559639 /* LKS_GestureTargetActionsSearcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A078A275FFFA48D620074790DA3CA6CE /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 119F71892BB85FDC29B99AE148231087 /* MJRefreshStateHeader.m */; };
A0ADDB3C7DF96DF0E6BC53086778A103 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F5B3C0CF01454E7AC9226E88FDFBAE6 /* UIKit.framework */; };
- A0B7A3B941134AA95A20F5A85165CC72 /* LSTPopView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93DAC06B5293787BAAAA04E673812C59 /* LSTPopView-dummy.m */; };
- A0E0DC76F51300E7EB1EBA5492DE854D /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EFC403B9948A5A5D2DC7D8B3D9188A9 /* UIImageView+AFNetworking.m */; };
- A1560247914C760D9EE5F7A2392CC06C /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = B2770F360CD876399FE83C30619DBC24 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A0B7A3B941134AA95A20F5A85165CC72 /* LSTPopView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 97E0EEAE3EFB0492B434EC2A704903DE /* LSTPopView-dummy.m */; };
+ A0E0DC76F51300E7EB1EBA5492DE854D /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 156CBD2266287775279363430A374818 /* UIImageView+AFNetworking.m */; };
+ A1560247914C760D9EE5F7A2392CC06C /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 21199D87A8FB4561900F6BC425147989 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
A1A1266FD70CEB545FD7602CC33F2F7B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BDEE6097B6411333154FEF90A280E3E4 /* QuartzCore.framework */; };
- A1ACD509069144C27542774A41FE0243 /* UITableView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2701A816C2728A79FA904E6F2AC8ADEB /* UITableView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A1DC9EFDF50DF0EAF24D9D7C219AD2C1 /* NSObject+MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F69E397FB4534DAE86CE36E624729DC /* NSObject+MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A1E44277704AD68E867FD7C955A6632D /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = AA75F2BBB1F8188D75855FF34D8A7AE3 /* MJRefreshBackGifFooter.m */; };
- A324722BA42F21E98F158EA6C133D715 /* LookinServerDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EAFD6E7E63CC2D3E074450E9124493C /* LookinServerDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A3EA39A13714B3103B82F4066A642F53 /* MJExtensionConst.h in Headers */ = {isa = PBXBuildFile; fileRef = C88E60EA597845949F0925B844477F63 /* MJExtensionConst.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A6728DA26A7C457B78A7A3CCFA9D9A10 /* UILabel+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 589A748D16780600B35F1BC7E7CEB243 /* UILabel+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A6B2B022993BBC55550CFBB0A0C78209 /* LookinConnectionAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 03BAE9F573ECB0A822C6757CBF10AB0E /* LookinConnectionAttachment.m */; };
- A6FCF74348D1907891FBDE3F2E331136 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 972173A04BB5350B482CEE39EFFBE0EF /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A760FF1452F08B787F0997D91F4A2C98 /* HWPageSheetPresentingAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 25AB23A95A2135A43EF14C148E707F7A /* HWPageSheetPresentingAnimation.m */; };
- A839428F403C52D8AA3466B65E20C27A /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B6539E05000228B7BBD9BA57EDF5E3 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A86CC1AFDFDD692DC4EE66F57C0F39E6 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = B90789CA4A099321E01CFF8CB566B5F3 /* UIScrollView+MJRefresh.m */; };
- A8AD2AE9695630E93DE504211EBAFBF1 /* LKS_CustomDisplayItemsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 40D46544DD0F8DC61B909F5E02739172 /* LKS_CustomDisplayItemsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A92AB5E65CA85947368E46E6627F1BFB /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE26007FA20AE54DB39973E3D1D76FF /* UIButton+WebCache.m */; };
- A93BA1C5A4FFEF3ACF371690485A2703 /* NSObject+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D3649A7CA35A3580F58B4481D9820AF /* NSObject+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A9609EEBDD5FD40292925E80ED84D5DF /* LookinServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 802213010DCF77864E95B3A910F64EA0 /* LookinServer-dummy.m */; };
- A9A49E4A3BE8882F60DF32BAF39DE191 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 875E237862F4488FBFC692D1AB2DBB91 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A9BEDE2ADF9D1E0D0D1A241806A1A486 /* LKSConfigManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6233A7302725D50AFE344EFD05C9C870 /* LKSConfigManager.m */; };
- AA1EA8F0F0470F1596B1FFA58ABF3375 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D31F6949E2640BBC06F6F5E862EA6B /* SDWebImageDownloaderOperation.m */; };
- ABCB80C4813C849FC93D57676820C907 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = AD7824F87B7A4AC0EB49B7B856736BF2 /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
- AC14E56ECA7A4980A8E1CA68E800B12C /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F37F4AA285AB6E2540A4063D8B802F /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
- AC710813CB6A1DAEEE45914402F864D2 /* MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 636EE1928B5BC8BC35DF1648C1BF1467 /* MJProperty.m */; };
- AD01931D200C49153984E27CBCEFE9D1 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C1EC495C820AD2FE568E285440075D82 /* FLAnimatedImage.m */; };
- AE69A3B75BEEB9E2C54168BF0C502BC6 /* LKS_RequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 13527772A4A54A71A31658A3E36E2474 /* LKS_RequestHandler.m */; };
- AE7B02645B8F769CA5F215EE8F7CC5B0 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A732383A60ACA7498BD810AAC8E31192 /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- AF185CDCA462AD6450543676951C82F9 /* LKS_ObjectRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = BFFCEECD2573D5472737D9AFB10A0BB2 /* LKS_ObjectRegistry.h */; settings = {ATTRIBUTES = (Public, ); }; };
- AFD1D411A9387DCEC6F0034653E23787 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 979F4BB7A6CE1AF72F02D7E7F5EC0D7F /* DZNEmptyDataSet-dummy.m */; };
- AFDC0B8255B2F3CED8E609F8A3BD1CDB /* LKS_AttrGroupsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 581F1A0410E8F8E85A8C2E596B4C7F40 /* LKS_AttrGroupsMaker.m */; };
- B01F27CEAE1971DEC56A8811FE669EB6 /* UIViewController+Presentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D36CFCB34B6B2FF494AB70EC5024CFA /* UIViewController+Presentation.m */; };
- B030B558BE97E0225652EFB8C8FA431F /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = AB771D1A9F6BE6B15418DB387EE5ADF3 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A1ACD509069144C27542774A41FE0243 /* UITableView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 40380EFCFB5E34558C193A723D077BE3 /* UITableView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A1BFCC1BC5107F5F72BDBDB98E12559C /* JXCategoryViewDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = C617C2D863C4AC28AF0370EDC02120A9 /* JXCategoryViewDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A1C02A0C13BE4A139BC38BBE20217FA2 /* JXCategoryView-JXCategoryView in Resources */ = {isa = PBXBuildFile; fileRef = BB4F011171FCB76B1AEBE390F843E930 /* JXCategoryView-JXCategoryView */; };
+ A1DC9EFDF50DF0EAF24D9D7C219AD2C1 /* NSObject+MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = BE09431A1BE57A882CA02B1E434916A8 /* NSObject+MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A1E44277704AD68E867FD7C955A6632D /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A8EB0FE66AD3E48C10CDD802521D146 /* MJRefreshBackGifFooter.m */; };
+ A324722BA42F21E98F158EA6C133D715 /* LookinServerDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = D03FDB7D5A636ED3DC51EF05677C546A /* LookinServerDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A325C7E5098EB5641EF49D279EA9EF03 /* JXCategoryTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 202D2DE7A9C3209A4BF4D407CF1AB06A /* JXCategoryTitleView.m */; };
+ A3EA39A13714B3103B82F4066A642F53 /* MJExtensionConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 04A50C0A5F4CA1B3AF632BFE12460FC6 /* MJExtensionConst.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A643679AC9795083558C6D8E33AF6151 /* JXCategoryBaseCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A08646B05BD58116699CDFD07CA2977 /* JXCategoryBaseCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A6728DA26A7C457B78A7A3CCFA9D9A10 /* UILabel+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 015571B1499F434BC7171DE7EA094577 /* UILabel+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A6B2B022993BBC55550CFBB0A0C78209 /* LookinConnectionAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 595E9691CC1A487C44431E51893A1D01 /* LookinConnectionAttachment.m */; };
+ A6FCF74348D1907891FBDE3F2E331136 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A05508640C7796358B45E0B5C0C73183 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A760FF1452F08B787F0997D91F4A2C98 /* HWPageSheetPresentingAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C947209A5CDFABA11FEBE5D709864961 /* HWPageSheetPresentingAnimation.m */; };
+ A839428F403C52D8AA3466B65E20C27A /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A7095DB3527991440F374C9F9DB5050 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A86CC1AFDFDD692DC4EE66F57C0F39E6 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AFDFE95B53BDA0F282212CF3E9B940F /* UIScrollView+MJRefresh.m */; };
+ A8AD2AE9695630E93DE504211EBAFBF1 /* LKS_CustomDisplayItemsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 230F8C4FD68EA2D95EA48F31DA295CE9 /* LKS_CustomDisplayItemsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A92AB5E65CA85947368E46E6627F1BFB /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 21C74D93A3238750FF610EABE13EB50F /* UIButton+WebCache.m */; };
+ A93BA1C5A4FFEF3ACF371690485A2703 /* NSObject+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B26E1BE3EBF37131688F5656289ACA2 /* NSObject+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A9609EEBDD5FD40292925E80ED84D5DF /* LookinServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F4DF3FAFAFDE0BEC7606CB8D4C2C98B /* LookinServer-dummy.m */; };
+ A9A49E4A3BE8882F60DF32BAF39DE191 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 32DEFB57DAEAFA1A97A9826678533D16 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A9BEDE2ADF9D1E0D0D1A241806A1A486 /* LKSConfigManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 17DDB1AC9EC1929E6B6DFC0CFA9D927D /* LKSConfigManager.m */; };
+ AA1EA8F0F0470F1596B1FFA58ABF3375 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D68B54EB4EEB9AF6B9ED16CAB83E16BA /* SDWebImageDownloaderOperation.m */; };
+ ABCB80C4813C849FC93D57676820C907 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A8A3FC6E6388A4864974A3D3B9C02F6 /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ AC14E56ECA7A4980A8E1CA68E800B12C /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = C63ECE6EA6AB3C1B9F676C1A2510CA67 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ AC710813CB6A1DAEEE45914402F864D2 /* MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = C9DDC2FE19D7DC5621872F440C5E8A37 /* MJProperty.m */; };
+ AD01931D200C49153984E27CBCEFE9D1 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = CE3837EC7E52B2C2855416D01CB974C7 /* FLAnimatedImage.m */; };
+ AD395F6BD7F53258A431E9479D07C6AF /* JXCategoryTitleImageCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 04AE87BD26EBAF13B558201544C0E822 /* JXCategoryTitleImageCellModel.m */; };
+ ADAB2E78F005C6413F9F3699D60CF727 /* LSTTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = EF426A2B87D32263A2C56A13732C8201 /* LSTTimer.m */; };
+ AE69A3B75BEEB9E2C54168BF0C502BC6 /* LKS_RequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 15E765BB9B77EA9AC2800F30D2802C1C /* LKS_RequestHandler.m */; };
+ AE7B02645B8F769CA5F215EE8F7CC5B0 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E44ED3A05255119AA352B7DE0C64E994 /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ AF17C7BD3344504E243E234004B4593E /* JXCategoryIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = FD4AB223CCA1E3159EE2C805605A0657 /* JXCategoryIndicatorView.m */; };
+ AF185CDCA462AD6450543676951C82F9 /* LKS_ObjectRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2FC8CB1CFEB2812A4E5E466940232C /* LKS_ObjectRegistry.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ AFD1D411A9387DCEC6F0034653E23787 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FFFC6DDC16F58E87A8A30CA92223320F /* DZNEmptyDataSet-dummy.m */; };
+ AFDC0B8255B2F3CED8E609F8A3BD1CDB /* LKS_AttrGroupsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C4B5B00D7224F098F6B2FE0962E5086 /* LKS_AttrGroupsMaker.m */; };
+ B01F27CEAE1971DEC56A8811FE669EB6 /* UIViewController+Presentation.m in Sources */ = {isa = PBXBuildFile; fileRef = C806BECAA1C722F04FE4A89D9B14A0E0 /* UIViewController+Presentation.m */; };
+ B030B558BE97E0225652EFB8C8FA431F /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F7FE08919F8BE5AACFB3A1E812E57C03 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
B03761E468C3B0F1BFEB2401CF2D5245 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- B09F08548ACA8379445F6525011EE219 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AE63A9BC3D50E34C84263A87F782ACA /* MJRefreshBackStateFooter.m */; };
- B2704AFFC5CC053154839DB44924D255 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 069FA883A4FACC46317AB2BE1BDE30E4 /* SDImageCoderHelper.m */; };
- B2B5444DFE63D2835A7561C1D64C9344 /* LKS_CustomAttrModificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = CB56ABA66093040F0D62AF378BB66DBE /* LKS_CustomAttrModificationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B2BC43DEC8DE2B9234693FE3782AB76C /* LKSConfigManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D53461EC25E2C6DAE3F3C2ABD951A2B /* LKSConfigManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B331CE2D3DEB461E738B886086A365F9 /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F2363FB988E5DC9705FE22B29B7B4F8 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B48A975992E58328254C494F133DE467 /* NSObject+MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 690D12C73095E1091E4B6AB8B11A064E /* NSObject+MJProperty.m */; };
- B4F231C5CBAB3D4A184699D0066E0E83 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = C685758668AFAC91E0AE4675AEA80600 /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B565C08CE947CF591B1D3582272D5E1D /* LKS_CustomAttrSetterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04D3C87C11221ADDA77670ED0731D145 /* LKS_CustomAttrSetterManager.m */; };
- B59E60FBC9665FC1061B88B8E6FD9FAF /* Masonry-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 672AB6E0839CC099E7CA7CF49761A5D7 /* Masonry-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B5AF87C11A465F666473F6191D173905 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8166AA98A11AE7F3F46DBF2C481F6DF5 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B5C521FFB8E09DFE348238E21556842F /* UILabel+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = FA721DB25EC176AA8EF0102082B67F5A /* UILabel+LookinServer.m */; };
- B66356D4E7E43B3D15324569AA7EBB05 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D7205061D92FA9AEDA20BCF1B6FF9B7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B680C2604BD8BC9644AE7C67BC46B9BB /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C6B8E558F2970AA962D063345B79D19 /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B741DBE2A466E6211F879EF997D9322D /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FDBCFE0DF35F1346C9E17295438B88A /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B79864F972C51037B350802D8CD48024 /* LKS_GestureTargetActionsSearcher.m in Sources */ = {isa = PBXBuildFile; fileRef = BC24AF9FD32062D15DE214E94B0E828F /* LKS_GestureTargetActionsSearcher.m */; };
- B81566F19789EBD9BE2714E2A6059D36 /* LookinDisplayItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B36F0D1046FE48DF23AE7AB21CD678D3 /* LookinDisplayItem.m */; };
- B8CA1F338C44C633916650FD85DA5A30 /* HWPanModalPresentationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C880A37C8BD02476827078E98C08810 /* HWPanModalPresentationController.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B95C63A039D9D08896421291DEBD3AEB /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EDBEC1105ABEB5730250B28CB605E44 /* SDWebImageCacheKeyFilter.m */; };
- B987864019E987FE32AB26A9CF2C8E12 /* UIViewController+PanModalDefault.h in Headers */ = {isa = PBXBuildFile; fileRef = 4816EA2348DC71F3330B4D2743758FEF /* UIViewController+PanModalDefault.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B98BC635A537547CD8CA9B77C750304F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- BA904ABA8ED36CC4E5EB2B2004CA1F18 /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 00F09038ADB7D3ACE57173DD781066A5 /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BACAA91A92F35CD7E7795232A83F21D1 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F0CB265D0463DC2290A542EFCE210632 /* AFNetworkActivityIndicatorManager.m */; };
- BADA31750A2136D073EDA4461DBE1EEA /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 16276D593D3F4D227902AF3A1424A4AC /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BBA61EF31BFDFA6FCA34DC4EBE6E1D9A /* NSString+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = CEFEE7CEBA57AF6426BA05F18F444C4E /* NSString+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BBF5FDA7D647517E2F904FE8E5596D96 /* LKS_AttrGroupsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 54E07E4DAA97DEDC8F59F58429664909 /* LKS_AttrGroupsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BC2F9B1D6986FEB23B4FB1288B512538 /* MJRefreshNormalTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4082EEAE9AC1F17D236D83E99200EA70 /* MJRefreshNormalTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BC5458210A973BC7A29D1F45D458A14B /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CA3017C0C359C5E90091B685A3A59EE /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BC7A1933CCF40C3C5E2E4A70AD2D0657 /* LookinDisplayItemDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = DA876A02B80932A6284AB2ACAB8135A6 /* LookinDisplayItemDetail.m */; };
- BCDC1E1D46DD124B5726A064D2EE66A3 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 452B8DD5CBF29E80E794E957D7ACEE0F /* UIImage+MultiFormat.m */; };
- BCEFDE57BB0E0B36731C8D39FFA1BE2C /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E350DE3AE3DE0F5FC5BD9A2EB159387 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BD2F6B06ADB5136DA881D1B918367125 /* UIViewController+PanModalPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D3576B2FF83DF230E75AA05AB2DB6B4D /* UIViewController+PanModalPresenter.m */; };
- BD30193C1E3D7B1F17B1B1F3F08BE655 /* UICollectionViewLayout+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = C45F5D95A727E9121E38DFEFADA82094 /* UICollectionViewLayout+MJRefresh.m */; };
- BDBE494BAC544843982C3CA96A6C41DD /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B130ACC8A24ECD0BF3BD07D5AF21E4D /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BE4F0DF600FBF07E812D262B293CF76C /* UIView+LSTPV.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CE9728E85B8432ED072CD0DC7926F20 /* UIView+LSTPV.m */; };
- BF0C3D2782FE1425C2F1F8827132A94B /* MJFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A5823526F694533978DE523241FEDE9 /* MJFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BF22D137EF6324675FA50080C5D93C00 /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 14454326E9CB6046C0CA3ABA3A33F187 /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- BFAC671767912906E90060B0F4BED5FB /* LookinCustomAttrModification.h in Headers */ = {isa = PBXBuildFile; fileRef = AA4F3775DDC9BAD8BC30D51376A765F0 /* LookinCustomAttrModification.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C04D578067F77AAB6717D32712CC39A2 /* HWPanModal-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B1C14811A97739A8455D69D9EF8F1AA /* HWPanModal-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C0D7926E41A294ACA98D7B033B283919 /* WKWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = FC504494ABD0D1144D620FD1501F0E00 /* WKWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C16483526F6C6287240A75EDCB7E2F2F /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DCB59AEF88556057BC2FD85427D2EFE7 /* FLAnimatedImage-dummy.m */; };
- C1D9802BE2A6410FFDFB1650FB9BA317 /* LookinDisplayItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 48B9B4465675824F9DA134FE2253901E /* LookinDisplayItem.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C1DD8C6A64F948E4C53560C76B995DA4 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E5C8F44BD62EB86605C88FA434E57ED /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C2033A68F13923BF9B3EE19F39FC1411 /* UIColor+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = D52AD9DE99C02DF34E22E59E4A970F45 /* UIColor+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C2068AEACC2D9C7F1FFE41AA25B12A68 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 996E03E4CC36DB69F10AD9C8F02472C6 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C2840BF1950FF7EE2DCD6D55F768A49C /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 51E9651B0CFE7B40336ABD29412D3C39 /* UIImage+GIF.m */; };
+ B09F08548ACA8379445F6525011EE219 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = DD1439668AF92748DEFAD18BF418CE55 /* MJRefreshBackStateFooter.m */; };
+ B0F512045830FAB66AE7526E35501800 /* JXCategoryImageCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = D4C17E87C77E85F28C83D98FAB4AB7F4 /* JXCategoryImageCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B2704AFFC5CC053154839DB44924D255 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC5ED786070BB7777881EF2B55FF369 /* SDImageCoderHelper.m */; };
+ B2B5444DFE63D2835A7561C1D64C9344 /* LKS_CustomAttrModificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 137E45FE90DEED579DF255BB11ADABF4 /* LKS_CustomAttrModificationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B2BC43DEC8DE2B9234693FE3782AB76C /* LKSConfigManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D16058E57E3F07CA628E8A17A3B944C1 /* LKSConfigManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B331CE2D3DEB461E738B886086A365F9 /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = B5EF3518EEE6DB69526EE34FF9D58DFD /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B48A975992E58328254C494F133DE467 /* NSObject+MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = CFD12B92C17E28346EDC2EC75D0BF494 /* NSObject+MJProperty.m */; };
+ B4F231C5CBAB3D4A184699D0066E0E83 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = DC870A534B766E7815C7744EE9E7E3E1 /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B565C08CE947CF591B1D3582272D5E1D /* LKS_CustomAttrSetterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 567674319F769F7E8B80920BBBD444B6 /* LKS_CustomAttrSetterManager.m */; };
+ B59E60FBC9665FC1061B88B8E6FD9FAF /* Masonry-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A8CBDE62F720E1751DB8B8E4DF3B0E9F /* Masonry-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B5AF87C11A465F666473F6191D173905 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 634BE374E20F830B5B77550EFCF89612 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B5C521FFB8E09DFE348238E21556842F /* UILabel+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E285AA5C9AFC477B5336B5AC2C863D1 /* UILabel+LookinServer.m */; };
+ B61728EFE4A95013413ED38D371A33B0 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 187A3F425AA5E5A93F8784E11F9E28CF /* PrivacyInfo.xcprivacy */; };
+ B66356D4E7E43B3D15324569AA7EBB05 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B89E97BE59B9448BC63E348FA77F055 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B680C2604BD8BC9644AE7C67BC46B9BB /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D56371580E6496005BC9D35C2C49570 /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B741DBE2A466E6211F879EF997D9322D /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B5308ADA544D7E6FCE86EFD21D5CBB /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B79864F972C51037B350802D8CD48024 /* LKS_GestureTargetActionsSearcher.m in Sources */ = {isa = PBXBuildFile; fileRef = BC88BA608872DDF711D78498FD36C1AA /* LKS_GestureTargetActionsSearcher.m */; };
+ B81566F19789EBD9BE2714E2A6059D36 /* LookinDisplayItem.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE8E065BE01E56E0D55097E36AB8FC2 /* LookinDisplayItem.m */; };
+ B8CA1F338C44C633916650FD85DA5A30 /* HWPanModalPresentationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 195F1795B17C3F026E46BBEF64C1EA67 /* HWPanModalPresentationController.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B948DCB652CEF1509FBE410D85844A53 /* JXCategoryView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 84C7B13561A207799480933E11856D99 /* JXCategoryView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B95C63A039D9D08896421291DEBD3AEB /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C31D8DFEC22296E69E97BC5CEAE316 /* SDWebImageCacheKeyFilter.m */; };
+ B987864019E987FE32AB26A9CF2C8E12 /* UIViewController+PanModalDefault.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BAC219B4754C1E13B6929143780BE52 /* UIViewController+PanModalDefault.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BA904ABA8ED36CC4E5EB2B2004CA1F18 /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = F451B2E12A8192978BB7FB1B45BF1E04 /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BACAA91A92F35CD7E7795232A83F21D1 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A5FC57ACB22E21DCA20F2B582D18A03F /* AFNetworkActivityIndicatorManager.m */; };
+ BADA31750A2136D073EDA4461DBE1EEA /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C4CB24406FFC32C73C615D12F0532C7 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BBA61EF31BFDFA6FCA34DC4EBE6E1D9A /* NSString+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 06AB57BB46CC82FE3257276649BAF8EA /* NSString+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BBF5FDA7D647517E2F904FE8E5596D96 /* LKS_AttrGroupsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = BE10A2A4B13E0F15A962DBEA161DE595 /* LKS_AttrGroupsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BC2F9B1D6986FEB23B4FB1288B512538 /* MJRefreshNormalTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 342267EEBD80FDDCEAA647EFBE0EB6BD /* MJRefreshNormalTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BC5458210A973BC7A29D1F45D458A14B /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A1067B051CF7A4C36817E6F668A3E7A6 /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BC7A1933CCF40C3C5E2E4A70AD2D0657 /* LookinDisplayItemDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = F90D97C684BADB3FE9796E626B98C43A /* LookinDisplayItemDetail.m */; };
+ BCDC1E1D46DD124B5726A064D2EE66A3 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5734E5CBE9E63CD37E71A375796587B5 /* UIImage+MultiFormat.m */; };
+ BCEEAFC24178DE5AABACC74245CE1739 /* JXCategoryIndicatorDotLineView.h in Headers */ = {isa = PBXBuildFile; fileRef = 898DE7614EA3416744425477D130D9C7 /* JXCategoryIndicatorDotLineView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BCEFDE57BB0E0B36731C8D39FFA1BE2C /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = AF302A5E7BA56F9F631A8591DA72D3C3 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BD2F6B06ADB5136DA881D1B918367125 /* UIViewController+PanModalPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = B05FD8A103E2A06EE08BE59B38FC36B4 /* UIViewController+PanModalPresenter.m */; };
+ BD30193C1E3D7B1F17B1B1F3F08BE655 /* UICollectionViewLayout+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 99CBD01AD35AF793B343AC0ACF2CF164 /* UICollectionViewLayout+MJRefresh.m */; };
+ BD7E02AB6057AD5A6AC513C34D508135 /* JXCategoryIndicatorBackgroundView.h in Headers */ = {isa = PBXBuildFile; fileRef = FEF91306ED7817FCE47628D37A94BF1B /* JXCategoryIndicatorBackgroundView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BDBE494BAC544843982C3CA96A6C41DD /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BEAAFCDD4CD23AABA4CD7359454B646 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BE4F0DF600FBF07E812D262B293CF76C /* UIView+LSTPV.m in Sources */ = {isa = PBXBuildFile; fileRef = A4D8DE877E59C1B5596F10D0213ADC5D /* UIView+LSTPV.m */; };
+ BE7F6E08A9BDA2EF6FA625EB5CD685EC /* JXCategoryCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = D9DA60EBF6A57B0D3224E3ACD3E51971 /* JXCategoryCollectionView.m */; };
+ BF0C3D2782FE1425C2F1F8827132A94B /* MJFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C9F5466A18204DE825F30433C784EDB /* MJFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BF22D137EF6324675FA50080C5D93C00 /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C07CC30774DAAE34D68C477CE151A36 /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BFAC671767912906E90060B0F4BED5FB /* LookinCustomAttrModification.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A633B376D525417B93138405029540 /* LookinCustomAttrModification.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BFD8EC99CD8DA66E3C6C0B3EE8CC4859 /* JXCategoryNumberCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = C74AFAA0D49E0563D9312CEA70CCF8B3 /* JXCategoryNumberCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C04D578067F77AAB6717D32712CC39A2 /* HWPanModal-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 83FBF1722FEB1FC5E339C64BC2275D81 /* HWPanModal-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C07F8A334C739FD38D9CB5C5239D683F /* JXCategoryTitleCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C34880EFF82114AECCB354A57C47E7C /* JXCategoryTitleCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C0D7926E41A294ACA98D7B033B283919 /* WKWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 21E66554273E5793F0BC4D1CD5A058CD /* WKWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C16483526F6C6287240A75EDCB7E2F2F /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3535B97DCD1B05E059D045B16700F34 /* FLAnimatedImage-dummy.m */; };
+ C1D9802BE2A6410FFDFB1650FB9BA317 /* LookinDisplayItem.h in Headers */ = {isa = PBXBuildFile; fileRef = FED61E621A88CB9CE3C421FDEB1106FC /* LookinDisplayItem.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C1DD8C6A64F948E4C53560C76B995DA4 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BEE43BCA7C1A101BFC7A5856F8793387 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C2033A68F13923BF9B3EE19F39FC1411 /* UIColor+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A34A08E72CC7EE2DEDDC6F48148CD79 /* UIColor+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C2068AEACC2D9C7F1FFE41AA25B12A68 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E54C32C4CB68C01C57E81C03350F4B2 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C22BFD04EAB76981E7F112D57A1F5E79 /* JXCategoryNumberCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B8FD707DDEC1F98F5C5FE19647F0592 /* JXCategoryNumberCell.m */; };
+ C2840BF1950FF7EE2DCD6D55F768A49C /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 35205291EDA412911A7CCBF5DB6087EB /* UIImage+GIF.m */; };
C2F8C43CFD4C890405F217DA7E00C839 /* Pods-CustomKeyboard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DDD0462C32F55EF5E9CB1056459809F /* Pods-CustomKeyboard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C2FE60A10C792613E45031AE6E851ECB /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = B12BB85356FB25DB1C8CA459600D3F8E /* MASViewConstraint.m */; };
- C4CC01ED368863C6E3220988FBC6CEFB /* LKS_CustomAttrSetterManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BC686BE8B7F5AC6B3A652ABBA6EAE87A /* LKS_CustomAttrSetterManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C60DB44F719853DE3B7157960DAF9270 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A4E8FC1A8280B0B2C51BA4C08DA78B3 /* MJRefreshComponent.m */; };
- C6A100159974349FEAAC99B82BE0F872 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = A65F19FCE0D1235D1B87CDFD5146518C /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C6FEC1088121FEA7DDC3384B7ECF3B44 /* LKS_Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 2262EDBC98A2795DB2EE27FB7D953E2C /* LKS_Helper.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C2FE60A10C792613E45031AE6E851ECB /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = CF9BCBE90C3B7C448764C897685CB0E3 /* MASViewConstraint.m */; };
+ C4CC01ED368863C6E3220988FBC6CEFB /* LKS_CustomAttrSetterManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 38E107BE978505B98A952E3564F532AA /* LKS_CustomAttrSetterManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C60DB44F719853DE3B7157960DAF9270 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F81509596D525489E9AA55CE4C0B4C1 /* MJRefreshComponent.m */; };
+ C6A100159974349FEAAC99B82BE0F872 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CE19B5D21ECCFC76311F186D2B3F651 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C6FEC1088121FEA7DDC3384B7ECF3B44 /* LKS_Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6406A6E74DC06D367BE38EA6C60243 /* LKS_Helper.h */; settings = {ATTRIBUTES = (Public, ); }; };
C71935C30C1AEDF32B96670BD8FA64CE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F5B3C0CF01454E7AC9226E88FDFBAE6 /* UIKit.framework */; };
- C857B8D2D0BAA5A8A764F9E1C4B85807 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = FD22D0365334ED54585130432CEF0912 /* ViewController+MASAdditions.m */; };
- C8771885BEA9EA0BD2E2C474587325E2 /* LKS_ExportManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DC75CCA31193BB63063F364267DBCF2D /* LKS_ExportManager.m */; };
- C8EC35DFB0945DBE2F2FF9ECFE6D9711 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 361FBE2595D99942EB88F5C0D34EB2DA /* NSLayoutConstraint+MASDebugAdditions.m */; };
- C93E972E75F84674690300123984EC43 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DBD3AB6DB93D7C2BE4FB5D89E1938FD /* SDAssociatedObject.m */; };
- C992A335399F942237E754EE65C40CA5 /* LookinObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F9AD4ED221D6EEDB441FAF35299C66 /* LookinObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C993A4D0CFA51E567F458CA65C1298AA /* MBProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F2AA502A31D7ACB4F28AAE65C3561F31 /* MBProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C9A72F0A93329C42B77395B0F6CEA26C /* HWPanModalPresentable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A4F0899D1AD5593F9373F8225D28188 /* HWPanModalPresentable.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C9B63C6ED2ED691EA83D3EE65939444B /* Lookin_PTProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7577D873945C0C370C14EE971C3509FB /* Lookin_PTProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C9E19D164C26414115CC969ED9A303C1 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 82512BA24900AE369D9A35A08C7187CC /* MASLayoutConstraint.m */; };
- C9E8C9372C2DA29D302B058BE3AE9877 /* CALayer+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = A89D8D8B71AD9A723D88B13AF519A214 /* CALayer+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CA1E0DCDF679EA2DE2ED0915426E1D04 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = E2E3CFC89381BAE830E4045CE02E25EB /* SDWeakProxy.m */; };
- CA56274BE7CBB3E759E0364785DF9799 /* Lookin_PTChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 39D285C0DD3F1106B921412AD679ADEC /* Lookin_PTChannel.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CE86196C00DC1D658B6CB7D47A0233AA /* LKS_ConnectionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DF4E1CE47903B976C738C7A1DB7C650 /* LKS_ConnectionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CF7005F2C42AC2E2DD6D437D52C7048B /* HWPresentingVCAnimatedTransitioning.h in Headers */ = {isa = PBXBuildFile; fileRef = FCCAFE3B7FF5BB1E728A5F5834F651D8 /* HWPresentingVCAnimatedTransitioning.h */; settings = {ATTRIBUTES = (Public, ); }; };
- CFF8D1A5E4C2097EF05E1021FE112886 /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 37B6B4596E25AE5CE5BE1FE14A6AF93B /* SDWebImageIndicator.m */; };
- D06BB547D59D183FD1DDD84DEBAC9EE8 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 360B7B34B46811D44994D83FAC09E663 /* SDWebImageCacheSerializer.m */; };
- D091F05269EE0566B665B00C7D912F8E /* Lookin_PTChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 230DC3B27944D3472C6A06DA7EEAF194 /* Lookin_PTChannel.m */; };
- D121163078CA9BBE54A83BD73EF784CF /* LSTPopViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 76DC37DEAFA5D12B1D7F9040EFB03DA5 /* LSTPopViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D1230E19DD1507E6370B80DF6653AC2A /* NSArray+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FBCAF641C4059BE19811532C4E3A0A2 /* NSArray+Lookin.m */; };
- D2AF9A7FD73B95960FDA4FD06C4BED08 /* NSObject+MJKeyValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 07752F7C2A34B933346F7E8E9D95461C /* NSObject+MJKeyValue.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D2CD8848F856EC9942A76610AAE66F0A /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A46088339E0DB93FCE586878F070297 /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D3615499AFE4D2A8EC2E773F4D8A82B2 /* KeyValueObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = AF32E35E8F4552F6AF08F140AD085FE4 /* KeyValueObserver.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D559CC4D0695CEE05F3B4C1C06475044 /* UIImageView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = EBD791825D3A6F564E4BA3B31B0F2BFB /* UIImageView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D5C046C46961BE465293625D6B870620 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CF307ACF82B2962F9E48DD0D029690F /* AFNetworking-dummy.m */; };
- D62A672EEB252581BD972DDA862BE1DD /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6407DC7FD67C9C74E0C3BA6B778AE0CD /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D662C83ECE8BEDA5FFB52F3575CA3E1A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EDF0BD9574A366871EF5B3FBEFB906D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C74589E03918328E4D27EFCBF6C4A0B8 /* JXCategoryBaseCellModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 65F97EE1352D7FC02982C03FB1D0FBEB /* JXCategoryBaseCellModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C857B8D2D0BAA5A8A764F9E1C4B85807 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BABE1F324CED82D14350741682D422B /* ViewController+MASAdditions.m */; };
+ C8685678D1B020F87365D022216FFE29 /* JXCategoryIndicatorImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D5D75E71D2ABCC5D3DDCC662DACBFAED /* JXCategoryIndicatorImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C8771885BEA9EA0BD2E2C474587325E2 /* LKS_ExportManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 44ABB514E2C8BB7AA8881283E1F0FE47 /* LKS_ExportManager.m */; };
+ C8EC35DFB0945DBE2F2FF9ECFE6D9711 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 25A7097BBC72B099A6C5D8BE403878A8 /* NSLayoutConstraint+MASDebugAdditions.m */; };
+ C922BFFF717515E5878910DF4078CE1E /* JXCategoryIndicatorDotLineView.m in Sources */ = {isa = PBXBuildFile; fileRef = EC4AC84F5855EC104608477917DF3145 /* JXCategoryIndicatorDotLineView.m */; };
+ C93E972E75F84674690300123984EC43 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B0E41FC583CAD966F98C60445BAB /* SDAssociatedObject.m */; };
+ C992A335399F942237E754EE65C40CA5 /* LookinObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B1D41519ED222707112BD66393CC6B2 /* LookinObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C993A4D0CFA51E567F458CA65C1298AA /* MBProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D5100072476E008E3F5E024784855C6A /* MBProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C9A72F0A93329C42B77395B0F6CEA26C /* HWPanModalPresentable.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D5AD11F2E32B53BA1869D6DE812341 /* HWPanModalPresentable.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C9B63C6ED2ED691EA83D3EE65939444B /* Lookin_PTProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = FB5DC78AEFAB6098819933CF81AAB15B /* Lookin_PTProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C9E19D164C26414115CC969ED9A303C1 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = EB21E143FD58D712C16E9026FBFFE194 /* MASLayoutConstraint.m */; };
+ C9E8C9372C2DA29D302B058BE3AE9877 /* CALayer+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 26925632A670841DDFC5067C12B16515 /* CALayer+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CA1E0DCDF679EA2DE2ED0915426E1D04 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5A9A86ABA54140CD0A5B6CD44C79740 /* SDWeakProxy.m */; };
+ CA56274BE7CBB3E759E0364785DF9799 /* Lookin_PTChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 35269DC2485E9AA07A892FDEB96B16C7 /* Lookin_PTChannel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CA9AFE3460622CC65F75A2DDE845F6E9 /* JXPagerSmoothView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A2E4F46AFE1B8413F8C1C81323B5831 /* JXPagerSmoothView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CE2AF36EBB17CDA2652CBADD4A7ABF82 /* JXCategoryImageCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EC57F0405D7809ECABB52C0C041C6F2F /* JXCategoryImageCellModel.m */; };
+ CE86196C00DC1D658B6CB7D47A0233AA /* LKS_ConnectionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 60913F6F25D56976457BFFCFF2C2FADC /* LKS_ConnectionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CEC9EF043F69710AC29940EB4E1E2B19 /* RTLManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E752820782AF474A360AC65F5EFA79D /* RTLManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CF7005F2C42AC2E2DD6D437D52C7048B /* HWPresentingVCAnimatedTransitioning.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AEB6DDDE2B74ABEB1D68CE037D784DC /* HWPresentingVCAnimatedTransitioning.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CFF8D1A5E4C2097EF05E1021FE112886 /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A8F3B5ED5052E8AFF569E50436DC3C0 /* SDWebImageIndicator.m */; };
+ D06BB547D59D183FD1DDD84DEBAC9EE8 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BEFA0A1959620AC394975A01082A23B /* SDWebImageCacheSerializer.m */; };
+ D08901EA319887BE6D694F8333BE8D1F /* JXCategoryIndicatorTriangleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E17CF24E4278604BB723E30B9997957 /* JXCategoryIndicatorTriangleView.m */; };
+ D091F05269EE0566B665B00C7D912F8E /* Lookin_PTChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 69AE4F19374B51CFBF6330CC5F82B32A /* Lookin_PTChannel.m */; };
+ D0E37358C3DCF2A8A572C4F38BB0569B /* JXCategoryListContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 29EA07EA8EF3C7818A9505A783C4FF02 /* JXCategoryListContainerView.m */; };
+ D121163078CA9BBE54A83BD73EF784CF /* LSTPopViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F35F0E5B188FD04E8E889503DEA5841 /* LSTPopViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D1230E19DD1507E6370B80DF6653AC2A /* NSArray+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = D4BC45247918896A52CA0C54F038B447 /* NSArray+Lookin.m */; };
+ D2AF9A7FD73B95960FDA4FD06C4BED08 /* NSObject+MJKeyValue.h in Headers */ = {isa = PBXBuildFile; fileRef = BDE2764DE3EEF78845A18DB898232DC0 /* NSObject+MJKeyValue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D2CD8848F856EC9942A76610AAE66F0A /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 31894250FE81D510485178A2F984B715 /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D31558927DE3F62D1BB1FC416E6F237D /* JXCategoryDotCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EF3A8DFB97BB54D169F6E8AC578F498C /* JXCategoryDotCellModel.m */; };
+ D3615499AFE4D2A8EC2E773F4D8A82B2 /* KeyValueObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E70DDAD553B6A4AC2379D01C3F133EF /* KeyValueObserver.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D380F9C945002DBF2E7D64983ABDC890 /* JXPagerListContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = CF85D3EF505C17C565E691AC344CCE5C /* JXPagerListContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D559CC4D0695CEE05F3B4C1C06475044 /* UIImageView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F45F2EB9AE5E2D5BDC0F9860DB695385 /* UIImageView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D5C046C46961BE465293625D6B870620 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 17CD950341D8F0132ADFEDC39B7267A7 /* AFNetworking-dummy.m */; };
+ D62A672EEB252581BD972DDA862BE1DD /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5409A465D5BE745D21B9F8847B798BD5 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D662C83ECE8BEDA5FFB52F3575CA3E1A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BCAF03C4FF87945F86C061039CB2443F /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
D663837F4347AF58660EE6F7FD426ECE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- D737D93725B0E072027AB6DA9C4DDDEC /* HWPanModalAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = CF585038948BE5BD9FDE25D090C77A52 /* HWPanModalAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D788BA4B9E8186271BA75CA52B30502C /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CF635A9AE952B4C70F06837B227DDCC /* View+MASAdditions.m */; };
- D7B3E8948DB04BD8FB6748419DA03EA9 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 5839F6C7ABFF6E515370151D7E470262 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D89C7D5455E3E8E2D7EC6B880253BD9B /* LookinIvarTrace.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DDCF4465DE05312EF540D3B5319ADAF /* LookinIvarTrace.m */; };
- D90607B4E56247B19B14462E487BA86E /* MJRefreshNormalTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = CF5E2B29305178430BD510351FDD6C99 /* MJRefreshNormalTrailer.m */; };
- D90DED0F5638B1C44F4B6C62D600D240 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A75653F7F6754FE7D26DA5C94A641DE8 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D90DF1376DF5E2EA644313BCD2E03058 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4056B0FA7CFCA3F0B3BA1F921297B1CC /* MJRefresh.bundle */; };
+ D737D93725B0E072027AB6DA9C4DDDEC /* HWPanModalAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 42F934D080B2CC7F2CD859E2B472A585 /* HWPanModalAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D788BA4B9E8186271BA75CA52B30502C /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 903038F34EE93C82A3EF6A1F6BDF857B /* View+MASAdditions.m */; };
+ D7B3E8948DB04BD8FB6748419DA03EA9 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 13D84A2503CDD440D0A0063FF97A2EB4 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D89C7D5455E3E8E2D7EC6B880253BD9B /* LookinIvarTrace.m in Sources */ = {isa = PBXBuildFile; fileRef = 89DA873F803BF9043720F615E8BC4CD5 /* LookinIvarTrace.m */; };
+ D90607B4E56247B19B14462E487BA86E /* MJRefreshNormalTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3BFE6DB15E8FF64920F720EA31EEDE /* MJRefreshNormalTrailer.m */; };
+ D90DED0F5638B1C44F4B6C62D600D240 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = D40BB639047461966566FFED666B3ACF /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D90DF1376DF5E2EA644313BCD2E03058 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 43F4AA149B8B7307ED5DA363EBC93DBF /* MJRefresh.bundle */; };
+ D93EA925FC24665584B3653514A56706 /* JXCategoryIndicatorImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2C056F5D1231FA94F92AA3712D545C2 /* JXCategoryIndicatorImageView.m */; };
D968461E31E8FF3FF6BA1DC621B0433B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F5B3C0CF01454E7AC9226E88FDFBAE6 /* UIKit.framework */; };
- DBA9500CBBA5FF6FCBBA115AE4D12152 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9005237D68B29ED337A382B01C2917F8 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DBA9500CBBA5FF6FCBBA115AE4D12152 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A75069F0A291D74DCBF8F50AA213D806 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
DBB7D12AC159E50D059772E4B6CF1D2F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- DBD9152526A180771BF7D7CD209B957E /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 68BFCD31885FD8664001BB1EFAC74751 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DCCBFE0D3914D33369C19AC135AB54AA /* HWBackgroundConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 3583F45BB2A021FDC55DB56C5C606CB1 /* HWBackgroundConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DD7F63D4E4640C7386877BB787740272 /* LookinServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 96AA5B4DE9A3DA12F53F6CB5D9AC99E2 /* LookinServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DDA16FB9C21AD941442357DAE6939530 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 17E50DA329E2F435CC41C2257BD0C866 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DDB268F1408C6AA5860C768310E9B9D6 /* LSTPopView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E90228ED50408CEB55B1257A093A4B1A /* LSTPopView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DE5A78F116018E2AC54714238276574D /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 37526D876665DA3E019DF167F09B21F4 /* UIActivityIndicatorView+AFNetworking.m */; };
- DE98ECCCA7106A4EA575EF34830D41FF /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 882CA8EEAEB3525FB7AD66F6FFC2CF6A /* MJRefresh-dummy.m */; };
- DEA09692CF813A23899CD4949A9B6801 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 119E6680DBF287ACAD4F054AA0D5AE17 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DED9ADFC8CC65243FC54E008A853742C /* MJPropertyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = F032CA5D8067C46163CF052F106C2A2D /* MJPropertyKey.m */; };
- DF2B15402CE105F5A8CE48BBDCFFD5DD /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ADF5834236B788D4ADA4E85DBD68395 /* MASConstraint.m */; };
- DF525E5405FAD3B98B0C2D966EB2DD95 /* UIViewController+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = F69E813A3DBBC0717A1A31E2B15A0606 /* UIViewController+LookinServer.m */; };
- E0B48B9D5D45AF3500FC718459D66E6C /* LookinDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 610E7F99F72A12BE4DBEF2C1ABF10115 /* LookinDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E0BCF21E9FA59F638C13ECCECC4D9690 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CC308EFB0F9E5B050F606DDD3E7A44F /* SDMemoryCache.m */; };
- E1B4145C5201DB66B65520B36849067C /* HWPanModal-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 13066DF230EEB3642E5BD7E5097A64F9 /* HWPanModal-dummy.m */; };
- E1BF615DD0422B06C97542F03C879D41 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 654D22CCA8871E0E0A65AB7C50503EB4 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E1DE69F6BB6235A6EDB6C99A184BEDB4 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E02C6844FCB15EFA12DE7936E2D89768 /* UIScrollView+MJExtension.m */; };
- E3FC6BEE41652C0500F57E0CB83B347F /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = C8667A6D81C45427108730E481B7134F /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E4773572BED239AA7D618F1C05BAF51E /* HWPanModalPresentationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 165D33815F330DB72870682C820A790B /* HWPanModalPresentationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E4F1B478580D6D7328BC29607BDE46F6 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 16A00EF4CD873ABB9D94776FACC7C92F /* UIImage+ExtendedCacheData.m */; };
- E50613C67DD02AF6EA825DA0B31EFFAD /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = A4288DFF17DF27DEEB1590D7281FBBD7 /* SDImageGraphics.m */; };
- E55B3151D86660E28CEABC3CDE6B1508 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 77A510DEE4CCFDB66B19F133A209CDF3 /* UIButton+AFNetworking.m */; };
- E5B057BC87284367918B2DB9CA084B4E /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 55CB47F746B1E99E4F1E11247844A401 /* MJRefreshAutoGifFooter.m */; };
- E7520DAA65004368C61453B8A2740295 /* HWPanModalShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = 883D06418312C016F973700D20558656 /* HWPanModalShadow.m */; };
- E76969F9B01139118427505B18F9CD21 /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D2E3EA9E3A659E147112B9E7A63EEC56 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E7FEAB9F421F7EBAF021F792D8E9C4D6 /* LookinCustomDisplayItemInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B417F374DC024262C256083E5EB6F70 /* LookinCustomDisplayItemInfo.m */; };
- E82964ED7092CDCDAD08BC596A57B43A /* UIImage+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E9004778D6831458C102A879DA83C285 /* UIImage+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- E8AB529B9E0B4C23921344F6C4ABFEA4 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = A43798E6CE0478C1CA6ECFD6AE110593 /* SDImageCoder.m */; };
- E8BB439BCA39F3ED41FF185D6A61EA98 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 28D5D9D40BE7D9F76DB8A620D92D6F6C /* PrivacyInfo.xcprivacy */; };
- E930A5612DC6D120BE040AD17C6D1BCD /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 051A3BFDC2997068DD4E7A11FEBAE63E /* MASViewAttribute.m */; };
- E97B2C62D3EE772504A939BEE7D6B459 /* HWPanModalPresentationAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 93A142314C8E6BF405461AFD41E16D08 /* HWPanModalPresentationAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EA82B6D97C9C5D0558047AF552D63203 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B4B2DB5DB2A6C79E9C1A5ABA6070B58 /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DBD9152526A180771BF7D7CD209B957E /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AD36233DB657DAA0ACBB8EEEAEB38EA /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DCCBFE0D3914D33369C19AC135AB54AA /* HWBackgroundConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = ACC63F439241C64C221C18A8991C569B /* HWBackgroundConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DD7F63D4E4640C7386877BB787740272 /* LookinServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A98C5DE93CCDA0FE6E6A916B05B69DCC /* LookinServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DDA16FB9C21AD941442357DAE6939530 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AD6EDFD2A6C9CC51CFC6A4BAA9C72A9 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DDB268F1408C6AA5860C768310E9B9D6 /* LSTPopView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DBE3855004E17CACAC82F75DF8EFEBD4 /* LSTPopView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DE5A78F116018E2AC54714238276574D /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FE8EB43019635F8DC34B96037E258505 /* UIActivityIndicatorView+AFNetworking.m */; };
+ DE98ECCCA7106A4EA575EF34830D41FF /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D58A6363674921528AA6EC052D65C890 /* MJRefresh-dummy.m */; };
+ DEA09692CF813A23899CD4949A9B6801 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 807026E96F55910EB566C0F4535DF3EB /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DED9ADFC8CC65243FC54E008A853742C /* MJPropertyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = C8B51A0410EE632DF42E1C298E25B221 /* MJPropertyKey.m */; };
+ DF2B15402CE105F5A8CE48BBDCFFD5DD /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A94C1FE25186BE811E6EC878BFA019B /* MASConstraint.m */; };
+ DF525E5405FAD3B98B0C2D966EB2DD95 /* UIViewController+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 920CD059C1364A6BD18420074E635F40 /* UIViewController+LookinServer.m */; };
+ E038F02D08E33A673A360ED34648A027 /* JXCategoryDotCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BEB32B7BEE20F8A74F80D03511F02260 /* JXCategoryDotCell.m */; };
+ E0B48B9D5D45AF3500FC718459D66E6C /* LookinDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = AFC299E1B60C8759EA1F35B7A91019A4 /* LookinDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E0BCF21E9FA59F638C13ECCECC4D9690 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B7AD3647BEEBE4C691B28F5746D51E7D /* SDMemoryCache.m */; };
+ E0DB14976CA6F6E604FD5E4EDF3378E7 /* JXPagerListContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC6BE1672FC4A4AA70F4CBD7E23C808 /* JXPagerListContainerView.m */; };
+ E1B4145C5201DB66B65520B36849067C /* HWPanModal-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EE80578D9DB416BD158323BE4D5C76F4 /* HWPanModal-dummy.m */; };
+ E1BF615DD0422B06C97542F03C879D41 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B56A01456E5166288620482B2A2180C /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E1DE69F6BB6235A6EDB6C99A184BEDB4 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 433A3E0D94E768912FBBE36F7C961678 /* UIScrollView+MJExtension.m */; };
+ E2DF1B379D9444D40D78320E90B1DC07 /* JXCategoryIndicatorLineView.h in Headers */ = {isa = PBXBuildFile; fileRef = 62CDFF5EFD0FE66B2DEECF2E904EBEC1 /* JXCategoryIndicatorLineView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E3FC6BEE41652C0500F57E0CB83B347F /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = A2309A5B4A1B9C14AF7AEDEC1036F76E /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E42D6EF120A5C17DA2F6FD6473CE7E7A /* JXCategoryTitleVerticalZoomCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6549E81907E05317DA862F329B2D4DDC /* JXCategoryTitleVerticalZoomCellModel.m */; };
+ E4773572BED239AA7D618F1C05BAF51E /* HWPanModalPresentationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C5C527FD40FDC2434064E6DE931921 /* HWPanModalPresentationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E4B688B8A0D07AFB883A52250CA874A1 /* JXCategoryNumberCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F15C652E7FDB0BE287A551718B00B6A8 /* JXCategoryNumberCellModel.m */; };
+ E4F1B478580D6D7328BC29607BDE46F6 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = C1F534C5FFF39633128C9B99F1BBF1B5 /* UIImage+ExtendedCacheData.m */; };
+ E50613C67DD02AF6EA825DA0B31EFFAD /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = 2504FFB7834ECCFC15329B28F3C9A331 /* SDImageGraphics.m */; };
+ E516B5B11193439E020DD2A908700B79 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
+ E52DCE394A6E02B6BA11FA64624F68F3 /* JXCategoryIndicatorParamsModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E5F2B584A65C9246E3E8A7A856FF44D /* JXCategoryIndicatorParamsModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E55B3151D86660E28CEABC3CDE6B1508 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C519E29CD93815AEE0C119E2109F0A2 /* UIButton+AFNetworking.m */; };
+ E5B057BC87284367918B2DB9CA084B4E /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D7FC4156E6779F82E6B8036FA7A1307 /* MJRefreshAutoGifFooter.m */; };
+ E7520DAA65004368C61453B8A2740295 /* HWPanModalShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FD7A1D3C3D9D8E6D3476B7C2093A431 /* HWPanModalShadow.m */; };
+ E76969F9B01139118427505B18F9CD21 /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F050843F5053FDD98D8FE72C1E28A5F /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E77175BDAE33AADF66766B28AA710247 /* JXPagerMainTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8087FD233990CE787D9977700977D0B8 /* JXPagerMainTableView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E7FEAB9F421F7EBAF021F792D8E9C4D6 /* LookinCustomDisplayItemInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F258366D8ED06A7D9EAD3DFCD004E /* LookinCustomDisplayItemInfo.m */; };
+ E82964ED7092CDCDAD08BC596A57B43A /* UIImage+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = DB3CBBCBF7B8B49A86FAC8D0A1741C77 /* UIImage+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E8AB529B9E0B4C23921344F6C4ABFEA4 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D7E450C43D308EE4C1B879D0B60A4BF /* SDImageCoder.m */; };
+ E930A5612DC6D120BE040AD17C6D1BCD /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF02F3D4DFB903955A463298716DCE2 /* MASViewAttribute.m */; };
+ E97B2C62D3EE772504A939BEE7D6B459 /* HWPanModalPresentationAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 552D2F14AF7B393E80A67680A66A34D4 /* HWPanModalPresentationAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EA82B6D97C9C5D0558047AF552D63203 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B0013F9906622545E27B913F2092F22 /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
EABCB60A26B06BF576E50BBD2F89A385 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- EB3DF628891F7D6AB114718AF760CB2A /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 09060CD8F1658C398DC40CC0221DB178 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EB646114ABEA7A4D6C2A724404778670 /* LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = A8107C05A5879CBA4916F6AD4685D772 /* LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EC8E84A8FFADDCA562A8608D141D9027 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 741395EF99DABB64E0E04129DB222FD2 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EC9B34262AED632D7EFB49804337648E /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = FE45E33A4A0C09CD0EBB222B7E40EE72 /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; };
- ECE64B732F9FA7C402DDEEC58DCB9D98 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9528B0058E986186BACF5E7A40A742 /* SDImageAPNGCoder.m */; };
- ED8991A8AE7C04362C2BED3875DC1656 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = AFF39BEB58B97CA8F3DFDE7996909112 /* AFURLResponseSerialization.m */; };
- ED8F64FF98CFAE0B12CF60A1B0E6BAF8 /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FC0CB167AF5751B03431E60D722046F /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EDB9E11998290348E4DFB5140D678942 /* HWPanContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 802FB1A32618485AA28D17584662FBAF /* HWPanContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EE6E8FE636D2C02E3D2FC1E8555B4612 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B25FB3699225E9D90B118E0F624383B /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EED016DE8173CD38CC01D88CD2628984 /* NSString+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = DA0B23D302091DCF531627DB2F06A5BA /* NSString+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
- EF6A6C725598F572A70C5FCEE328C184 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 524E9F65E894111FFD9563F30298E596 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EB3DF628891F7D6AB114718AF760CB2A /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E1682EACA92F366216BAB7320C375AA /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EB646114ABEA7A4D6C2A724404778670 /* LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E80EA469F2079302F38A991886C4B5A /* LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EC078D5CD76868BDE0F67BBEAFFEA217 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1C37C8F103EDECD09126133069B80115 /* PrivacyInfo.xcprivacy */; };
+ EC8E84A8FFADDCA562A8608D141D9027 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FAF0BE8296496D28F5C6AA6974B39E8 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EC9B34262AED632D7EFB49804337648E /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = 56642F6C221107F2F8D033758EEB482A /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EC9B8D81AEAF11E16149869246F7D4C1 /* JXCategoryFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E9F380E4292210FA99A8F5918C667C3 /* JXCategoryFactory.m */; };
+ ECC6BC85943DB873215826A344A462FD /* JXCategoryIndicatorBallView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A0C74EF09B54680C98CCBF1F2BD297A /* JXCategoryIndicatorBallView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ ECE64B732F9FA7C402DDEEC58DCB9D98 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 92B0AD9AA2CE09EEB0EF8C040E103B97 /* SDImageAPNGCoder.m */; };
+ ED8991A8AE7C04362C2BED3875DC1656 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F3CA71777F849F0196634A7AB215BDC /* AFURLResponseSerialization.m */; };
+ ED8F64FF98CFAE0B12CF60A1B0E6BAF8 /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 491DFACE04BF80FD0F37C4ECFE908522 /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EDB9E11998290348E4DFB5140D678942 /* HWPanContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB0E506E749384DE93170FA1EE1FD3B /* HWPanContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EE101918DFCDC1D6728BF910DB5AF29A /* JXPagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = D31BFB25B2F3620735E09AC6DE1CBFE3 /* JXPagerView.m */; };
+ EE6E8FE636D2C02E3D2FC1E8555B4612 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 367DF77D41DE010B9FA86137928C7C44 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EED016DE8173CD38CC01D88CD2628984 /* NSString+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = EE1A5661BE1EACFB3D2C7F19D51BF011 /* NSString+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EEF0BF7E53148EB20BED242061BDC5ED /* JXCategoryTitleVerticalZoomView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B4337532A4911F88E85BB14DE78FBB7 /* JXCategoryTitleVerticalZoomView.m */; };
+ EF6A6C725598F572A70C5FCEE328C184 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 61080F57DD92AB8ABC811791B547090C /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; };
F1A04C26FAF235FD6B0AF30E7ACD5DD5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D41AAC213895165C450F5576DE42CB2 /* Foundation.framework */; };
- F1D845E22D5B8FC6AFC3C2E41DA1B6DF /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A1CAA004ADB375344EE1C0A0FF7E804F /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F2AD91050B1FE3C8BC78567F1FDE3ED5 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 201F7289F3B83B98F487EC194493B7F3 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F2C9F9038FBEFD951516694AE873A2B9 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = CD29BD8633F552915B08BF15C7E0DFFF /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F3263D294D688533EB974E37C61F1E24 /* MJExtensionConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BF099C561E70E7E4EDAC96628F02E58 /* MJExtensionConst.m */; };
- F3AECEF6D3BB919B3E7392942E1BC58B /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = AFFA5747833468A5901D8AA31E822627 /* MJRefreshBackFooter.m */; };
- F3DA1005917E252B306712DAAA287FB0 /* UIViewController+PanModalDefault.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DDEE4190CA21B03ED83225BEC5FAC7D /* UIViewController+PanModalDefault.m */; };
- F3F4A6309BD95DFAA4DCC60A4E07C515 /* UITableView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = FF06402E5B9C49B794955B31F8067263 /* UITableView+LookinServer.m */; };
- F47EBDD360E642A0499A767BC7C17B4B /* HWPanIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88E8C1FFE2A2D6CB9741EF2354A3B30E /* HWPanIndicatorView.m */; };
- F49CB22863CCFEC7817D259F27F91C57 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = C657F16F9FE7919D2B27F05D611C2F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F53BE4449AE5896F76325E4DCB6D0B13 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 023A9DE33A4A369492D910BE237BE415 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F600BB873FD4764BAA9E02826F804486 /* FLAnimatedImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 56083A8D73CF98D49960B5783A36797F /* FLAnimatedImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F60F90EAF35CFF40DF1C33557965787D /* MJRefreshStateTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = F83A870FD420501FBBA293B2D6A26AD0 /* MJRefreshStateTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F62B0711DA506CCB3DF79F65134566C7 /* Lookin_PTPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = CF38798B2D107B8F8B096B856DF98A24 /* Lookin_PTPrivate.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F68889CD481716EE5D6B75EBD8FD53A6 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = B0023999B588A745D2530760778D09F9 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F6A0D6EA1B5DC3FE04DC4A1B0A914121 /* UIView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EDC641564DA302B6FFCBFCFFFAC5BA7 /* UIView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
- F6A2DEEA8E8B92D365AFDDBD5E8C1218 /* NSObject+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 85937FAC419CB28614ECAA70CE249673 /* NSObject+Lookin.m */; };
- F6A34F74BE7FE816114D7F3902296AF2 /* HWVisualEffectView.m in Sources */ = {isa = PBXBuildFile; fileRef = C15066DB017692FFB93D6BF3C34128D3 /* HWVisualEffectView.m */; };
- F6D1C960368EB1E067ABD0BFF707FC56 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FBE26B2A8BA76D5AA3E371D3CA2EAE6 /* MASConstraintMaker.m */; };
- F7623E7C314AA5010D8D0BD6ED4AAAD4 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = B1ABBFCC8D2F6B393D3F4389129E97F5 /* AFImageDownloader.m */; };
- F7815C2FBD9D954D0C2F3BF0BD6EB813 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F4AF21DC4288D196E2F556338C3101AE /* PrivacyInfo.xcprivacy */; };
- F8616FAFEE1124368CB96473CE20CDB4 /* LookinAttrIdentifiers.m in Sources */ = {isa = PBXBuildFile; fileRef = CB96704A28B66FFCFA6B43392123348C /* LookinAttrIdentifiers.m */; };
- F8F1B1196CAA5114BA9A95AA7E6D6AEB /* UIBlurEffect+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62ED382544D99079829F5E202E6E84A7 /* UIBlurEffect+LookinServer.m */; };
- F9789D86D3279D71B398B550F27C3EFF /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = ED1DD2A27A7141151DAB033BD707A1EF /* AFSecurityPolicy.m */; };
- FA3021DED76B9B182CC9195A60EB1209 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = 63746C791045958FEE981F032ACCAECE /* NSBezierPath+SDRoundedCorners.m */; };
- FA6DA93357E2E9E9AADDFB3E39DEB6C2 /* NSObject+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C899184976415922E8F39B277C1766 /* NSObject+LookinServer.m */; };
+ F1ABB5428A1CCF2EAC42A4C3B388F25D /* JXCategoryIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 658F3554D0CFB5BC5E252408F8CD5317 /* JXCategoryIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F1D845E22D5B8FC6AFC3C2E41DA1B6DF /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 60461DAD42E3B1F75AD82553A6C40C64 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F2AD91050B1FE3C8BC78567F1FDE3ED5 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = BBB6E7BC9BF649910D7654B98B396BD4 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F2C9F9038FBEFD951516694AE873A2B9 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = A98C848E174628ED3A950CA220B4CB9A /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F3263D294D688533EB974E37C61F1E24 /* MJExtensionConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 47A777C7602E23E11AE500103D52A253 /* MJExtensionConst.m */; };
+ F3AECEF6D3BB919B3E7392942E1BC58B /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A5E3A2C0C49EB165C854762A832D48A /* MJRefreshBackFooter.m */; };
+ F3DA1005917E252B306712DAAA287FB0 /* UIViewController+PanModalDefault.m in Sources */ = {isa = PBXBuildFile; fileRef = 3474F65ACB0FE00EF732580936B91D06 /* UIViewController+PanModalDefault.m */; };
+ F3F4A6309BD95DFAA4DCC60A4E07C515 /* UITableView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 95E2C10E638AC6421FE377F88DA72A45 /* UITableView+LookinServer.m */; };
+ F43396B5CB23638E5509B3ED61AE6192 /* JXCategoryListContainerRTLCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C70C9B1AD0F41A4C5E9026F5AF7F65F /* JXCategoryListContainerRTLCell.m */; };
+ F458385338076D8734DD74BE4A94B33F /* UIColor+JXAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = F904F7CF43AB518217FB1AB9236020D4 /* UIColor+JXAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F47EBDD360E642A0499A767BC7C17B4B /* HWPanIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EF0D4A56B002AB1528A77EBDA7EC804 /* HWPanIndicatorView.m */; };
+ F49CB22863CCFEC7817D259F27F91C57 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = AD28EF542A0B7F210E7C92D1D9DEC003 /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F53BE4449AE5896F76325E4DCB6D0B13 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D744043462D81E4ED2BB1ECAE8E9F696 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F600BB873FD4764BAA9E02826F804486 /* FLAnimatedImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 87DD67829823038B4E0D04582C0CB95C /* FLAnimatedImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F60F90EAF35CFF40DF1C33557965787D /* MJRefreshStateTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 846CA0BB8166DB9008D71F59F4A301EA /* MJRefreshStateTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F62B0711DA506CCB3DF79F65134566C7 /* Lookin_PTPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DD8CB4B9EF9002F59BC7DE12F17ED7E /* Lookin_PTPrivate.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F68889CD481716EE5D6B75EBD8FD53A6 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = C7E392E347A9555F1447E0FBB3E777E5 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F6A0D6EA1B5DC3FE04DC4A1B0A914121 /* UIView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = DC82DAFD220FAA7899CE21078C2C649D /* UIView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F6A2DEEA8E8B92D365AFDDBD5E8C1218 /* NSObject+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = D52171C8DB630868289299203B4ECD0C /* NSObject+Lookin.m */; };
+ F6A34F74BE7FE816114D7F3902296AF2 /* HWVisualEffectView.m in Sources */ = {isa = PBXBuildFile; fileRef = DACDF6DBB7030D05CC43C7DB516265EE /* HWVisualEffectView.m */; };
+ F6D1C960368EB1E067ABD0BFF707FC56 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = CDE98EE96840F02E6074E842D456A2E3 /* MASConstraintMaker.m */; };
+ F7623E7C314AA5010D8D0BD6ED4AAAD4 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 25A773C46121E6091EEB9AC88DC4E2A2 /* AFImageDownloader.m */; };
+ F847E3C26E5AC43CD73364AD3DF49AFE /* JXCategoryImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = B7498A05A9D7A9FEE19E027CABE6B9DD /* JXCategoryImageCell.m */; };
+ F8616FAFEE1124368CB96473CE20CDB4 /* LookinAttrIdentifiers.m in Sources */ = {isa = PBXBuildFile; fileRef = 41EF7420DD5FC6E4D1134632895868F3 /* LookinAttrIdentifiers.m */; };
+ F8F1B1196CAA5114BA9A95AA7E6D6AEB /* UIBlurEffect+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 98EB3787337AAE5AD71D422A832D852F /* UIBlurEffect+LookinServer.m */; };
+ F9789D86D3279D71B398B550F27C3EFF /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2458E327D6233EBA29A07B3E63113146 /* AFSecurityPolicy.m */; };
+ FA3021DED76B9B182CC9195A60EB1209 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = C5A25B7B454717DB3993591B5E8B612E /* NSBezierPath+SDRoundedCorners.m */; };
+ FA6DA93357E2E9E9AADDFB3E39DEB6C2 /* NSObject+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = C5719A8B6A945982F0856B5A616B379E /* NSObject+LookinServer.m */; };
FB6E014B34F33B89E5060DA1F00168A5 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77F4C0466DFC43C56F1D982F88EF74A0 /* ImageIO.framework */; };
- FC32143CA2A916F032F2B569313315AA /* HWPanContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC6D8F98A0A99B4F62553DD6B2DE362 /* HWPanContainerView.m */; };
- FCDEC6A53CF5517E1AF5B331FD65F6D9 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 9694A97A95DD31F14A6A155FCCFE7837 /* SDImageCacheConfig.m */; };
- FCEE5BD645E95FF55468C4AB6D17CFDA /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F6EA8BCC592FC8C87F6AB86D1783731 /* UIImageView+HighlightedWebCache.m */; };
- FD3AF10F8723DABEE406D25592B5F562 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81B71B9BB50BFCB7CBC2B6455296C14B /* FLAnimatedImageView.m */; };
- FDACBA49610EA6F39CABB7FE44B137D1 /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = EF6748BE01C63A0BA85DC20DBF82AD80 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ FC32143CA2A916F032F2B569313315AA /* HWPanContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2310AA8AAF9A85F5E639409B8AF0F292 /* HWPanContainerView.m */; };
+ FCDEC6A53CF5517E1AF5B331FD65F6D9 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB0E8A16F89DAA71F5718EDBF3E2A83 /* SDImageCacheConfig.m */; };
+ FCEE5BD645E95FF55468C4AB6D17CFDA /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D5019FBBC4DC80F31FB68B1820A427 /* UIImageView+HighlightedWebCache.m */; };
+ FD3AF10F8723DABEE406D25592B5F562 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = B4121F7B04BCCD0FB01ED16A27F6E571 /* FLAnimatedImageView.m */; };
+ FDACBA49610EA6F39CABB7FE44B137D1 /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94CFBBBF3DC429BAF55FD9493336B4 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
FDD4C4D4F03502D5CB0B8763009A0948 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BDEE6097B6411333154FEF90A280E3E4 /* QuartzCore.framework */; };
- FE07C069C2E3543002CEB5D751ABA9AC /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EDACCA592A0A0FC0428384009A75BD5 /* AFNetworkReachabilityManager.m */; };
- FEA8BA4F82CCBD1D28DCC7EF39FB4096 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = BDC5D95848173A06A25E49216A4BEFDC /* SDImageCacheDefine.m */; };
- FEE3D901B4A4638F9E00935144E982B3 /* HWPanModalPresentableHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = B876DE6F099D679F03040B8EF24E5C82 /* HWPanModalPresentableHandler.m */; };
- FEE883575278D5BE8F185437AB5DB3BB /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 820CCFAA740875554C05F59A0958E53B /* MJRefreshGifHeader.m */; };
- FF106518AFECA24E74B1D649E4F9AC70 /* HWPanIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 03CB4C12A5B494B4ECDEC92BC32E7490 /* HWPanIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; };
- FFC6D50089FA32FD7AAF25747E56EA60 /* LKS_CustomAttrGroupsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC0E1D78C95F4CC731325A284A8FC80 /* LKS_CustomAttrGroupsMaker.m */; };
+ FE07C069C2E3543002CEB5D751ABA9AC /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 81D1103F43F39D4BF9AE80E76478FA69 /* AFNetworkReachabilityManager.m */; };
+ FEA8BA4F82CCBD1D28DCC7EF39FB4096 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DB3789FF1142F1817E52B4F6C9BA1B6 /* SDImageCacheDefine.m */; };
+ FEE3D901B4A4638F9E00935144E982B3 /* HWPanModalPresentableHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = B8E404753BE7BE627A458AE982427654 /* HWPanModalPresentableHandler.m */; };
+ FEE883575278D5BE8F185437AB5DB3BB /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E84842FBF29954156976CB6DD0F275 /* MJRefreshGifHeader.m */; };
+ FF106518AFECA24E74B1D649E4F9AC70 /* HWPanIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DE32E1B12FEE2A9EAE1F5A67697D6E8 /* HWPanIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ FFC6D50089FA32FD7AAF25747E56EA60 /* LKS_CustomAttrGroupsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CF7F647B9D3AA2FB234C1CC5BB53582 /* LKS_CustomAttrGroupsMaker.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
- 01F386055DA043124AA00537EC691754 /* PBXContainerItemProxy */ = {
+ 0A1A465C500FD28324C60FF2111766F1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 8B7D23DD98E41BAE91418E9E85F191D6;
remoteInfo = LSTPopView;
};
- 02DDA276267B945D512FC6AF69590E37 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4D3BA58D0583DF37575CACAB3DDADC85;
- remoteInfo = MJExtension;
- };
- 077F2AA4B2BF11943204812B533088F5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1;
- remoteInfo = AFNetworking;
- };
- 1B50A2D51242B1B501E7A8FE17921A95 /* PBXContainerItemProxy */ = {
+ 0CEF032AE3DE8459AABC366D5EAD57AC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 5A2609DB0612F95A3450D2E02CA850A0;
remoteInfo = LSTTimer;
};
- 1C0C3A0BDFA6BDE041DC3D513C5650B3 /* PBXContainerItemProxy */ = {
+ 2635D33260052793F7319FAC3997C416 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 5A2609DB0612F95A3450D2E02CA850A0;
+ remoteInfo = LSTTimer;
+ };
+ 36EAD987437C03F015C383238BF3C1B7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F1BCD9702276377FB5B3BDB6EAF709D7;
+ remoteInfo = DZNEmptyDataSet;
+ };
+ 398B300FAF20E4012B54089285C6D68D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1;
+ remoteInfo = AFNetworking;
+ };
+ 39F2619DE86130266FA45394FE5C260D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 55AF53E6C77A10ED4985E04D74A8878E;
+ remoteInfo = Masonry;
+ };
+ 4262F1710F9698DFC113026BA2E31021 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4A68CFD979D413A619DF631BB121D98F;
remoteInfo = Bugly;
};
- 2307258CB6BB82D24A7CA6B7975B1292 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 94CFBA7D633ECA58DF85C327B035E6A3;
- remoteInfo = "SDWebImage-SDWebImage";
- };
- 2F4CEC846087978E04621E966B9DFF49 /* PBXContainerItemProxy */ = {
+ 4E0DD9B103CA9ED24B513A6147DEDB93 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4D3BA58D0583DF37575CACAB3DDADC85;
remoteInfo = MJExtension;
};
- 5ABBB136A0AE8EE61D30E75F4BE8572E /* PBXContainerItemProxy */ = {
+ 648F8AAC5DF3351FEF10F1C29B3E11DF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 31DCABABCA873FBA7A92FEB47D71ED8E;
- remoteInfo = HWPanModal;
+ remoteGlobalIDString = 8BEAFAA726C1965864B79B4B441AA513;
+ remoteInfo = JXCategoryView;
};
- 5ECDD709038035A28044669BFFE06267 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = F1BCD9702276377FB5B3BDB6EAF709D7;
- remoteInfo = DZNEmptyDataSet;
- };
- 5F98F8D71CDA25588EE186F7253F367F /* PBXContainerItemProxy */ = {
+ 686994C0035F8FADAF6A6C4E910239B2 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 82B0A41D3031FF27D78E17B0A9A46FB0;
remoteInfo = MBProgressHUD;
};
- 7FA3D0787FAE50268674AAEE62D45295 /* PBXContainerItemProxy */ = {
+ 6DB0C5460735B353E7FB2A7058DEB8F3 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1;
- remoteInfo = AFNetworking;
+ remoteGlobalIDString = C4E1020AF425614337737213AA26DBD5;
+ remoteInfo = JXPagingView;
};
- 80217EE617C295C4C81AA1DCF5D85E7E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = B32AF3F43989CBA171BB1FB3957A4509;
- remoteInfo = "MJExtension-MJExtension";
- };
- 92CA63B3B20D5FAC965226A6920F1BE4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 638FEAAFC575BB76BC6AC055CDDA3506;
- remoteInfo = LookinServer;
- };
- 95E55F6C03A77816AFA1A59466D8CD82 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 6868056D761E163D10FDAF8CF1C4D9B8;
- remoteInfo = MJRefresh;
- };
- 9946EDF6CEC75931EE3BCF2D4DC70585 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = B26054DF1DEA11585A231AF6D1D80D5E;
- remoteInfo = "MJRefresh-MJRefresh.Privacy";
- };
- 9F4B8D116BF04BD4F5A8C8D781DA5D62 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 55AF53E6C77A10ED4985E04D74A8878E;
- remoteInfo = Masonry;
- };
- B12FC64FF473558C45076A0CEB7D47D1 /* PBXContainerItemProxy */ = {
+ 6FA747ECA11691BE7229C287223E399A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = F1BCD9702276377FB5B3BDB6EAF709D7;
remoteInfo = DZNEmptyDataSet;
};
- B57744F595F66358CF4816DD4793C8A6 /* PBXContainerItemProxy */ = {
+ 79523FDE8CA807F68BC7DF678B3199B5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 4A8E8992707D01510894596DB9BCCA00;
- remoteInfo = FLAnimatedImage;
+ remoteGlobalIDString = 4D3BA58D0583DF37575CACAB3DDADC85;
+ remoteInfo = MJExtension;
};
- BDE883F6A985897AA115496E325146FA /* PBXContainerItemProxy */ = {
+ 7B014B80CCB8DDBC4906B5D8D3002093 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 82B0A41D3031FF27D78E17B0A9A46FB0;
- remoteInfo = MBProgressHUD;
+ remoteGlobalIDString = E79E29F55A2453370D27112480FCF6A2;
+ remoteInfo = "JXCategoryView-JXCategoryView";
};
- DE9FD566A2ADE13D0844AD68D51F7EAF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 55AF53E6C77A10ED4985E04D74A8878E;
- remoteInfo = Masonry;
- };
- EC0084E5D95CC67D69BF4291415A7EE1 /* PBXContainerItemProxy */ = {
+ 803F302DC5C2EA85B4CBBDCD27A43286 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429;
remoteInfo = SDWebImage;
};
- FBA8C5046E304FE4BB90D14C4A529288 /* PBXContainerItemProxy */ = {
+ 9E88A4DD9EF59B6718F28ECC701DF551 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 5A2609DB0612F95A3450D2E02CA850A0;
- remoteInfo = LSTTimer;
+ remoteGlobalIDString = 6868056D761E163D10FDAF8CF1C4D9B8;
+ remoteInfo = MJRefresh;
+ };
+ AE8D5D579627FAFF8F43B7CEFE066FF2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 638FEAAFC575BB76BC6AC055CDDA3506;
+ remoteInfo = LookinServer;
+ };
+ B296FC77430103DDB971813228C8D4EF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 94CFBA7D633ECA58DF85C327B035E6A3;
+ remoteInfo = "SDWebImage-SDWebImage";
+ };
+ C279C7A3A264FD3391C8C73B80D3A426 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B26054DF1DEA11585A231AF6D1D80D5E;
+ remoteInfo = "MJRefresh-MJRefresh.Privacy";
+ };
+ C389A17163C51915594BC17BC8BF9DE0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 16704C6B67439DA959DB043702C75A7A;
+ remoteInfo = "JXPagingView-JXPagerView";
+ };
+ CE0514BD8BDC97E49F2A38CD065EDCFC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 4A8E8992707D01510894596DB9BCCA00;
+ remoteInfo = FLAnimatedImage;
+ };
+ D89A563DA511A2A01EFDD5299EBCEE42 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B32AF3F43989CBA171BB1FB3957A4509;
+ remoteInfo = "MJExtension-MJExtension";
+ };
+ DB3A9F97FFF5759DFB4E243D0C12B290 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 31DCABABCA873FBA7A92FEB47D71ED8E;
+ remoteInfo = HWPanModal;
+ };
+ EF1EC9615D03559D465834BE2D7F527F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1;
+ remoteInfo = AFNetworking;
+ };
+ F121CDAC85A6DCADB4F82D081323C7C5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 55AF53E6C77A10ED4985E04D74A8878E;
+ remoteInfo = Masonry;
+ };
+ F9F28B72CAD6F7E15F267C3F8D685EA8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 82B0A41D3031FF27D78E17B0A9A46FB0;
+ remoteInfo = MBProgressHUD;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
- 0004D14E99E5CD92EA09732F82694FF5 /* HWPanModalPresentationAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = HWPanModalPresentationAnimator.m; path = Sources/Animator/HWPanModalPresentationAnimator.m; sourceTree = ""; };
- 0041D895443AAAA3D1BCD4056EBB4F37 /* UIViewController+LayoutHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+LayoutHelper.m"; path = "Sources/Presentable/UIViewController+LayoutHelper.m"; sourceTree = ""; };
- 00F09038ADB7D3ACE57173DD781066A5 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; };
- 0175DE132412321B3302CBE48CE0F712 /* LookinAutoLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAutoLayoutConstraint.m; path = Src/Main/Shared/LookinAutoLayoutConstraint.m; sourceTree = ""; };
- 01B6539E05000228B7BBD9BA57EDF5E3 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; };
- 01CCBFAC5118E8E6A44DA067EF8F2523 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; };
- 023A9DE33A4A369492D910BE237BE415 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; };
- 02B660DF025FBF070A8248624E25ED79 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; };
- 03BAE9F573ECB0A822C6757CBF10AB0E /* LookinConnectionAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinConnectionAttachment.m; path = Src/Main/Shared/LookinConnectionAttachment.m; sourceTree = ""; };
- 03CB4C12A5B494B4ECDEC92BC32E7490 /* HWPanIndicatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HWPanIndicatorView.h; path = Sources/View/HWPanIndicatorView.h; sourceTree = ""; };
- 03D72CC56F0CB2FCCB14E1335C16D41B /* MBProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MBProgressHUD.modulemap; sourceTree = ""; };
- 04A09AD12EF8C816FA9546838C3F429E /* Masonry.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.debug.xcconfig; sourceTree = ""; };
- 04A251837ED47D22FF5ACBFA97F91D4A /* LKS_TraceManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_TraceManager.m; path = Src/Main/Server/Others/LKS_TraceManager.m; sourceTree = ""; };
- 04D3C87C11221ADDA77670ED0731D145 /* LKS_CustomAttrSetterManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_CustomAttrSetterManager.m; path = Src/Main/Server/Others/LKS_CustomAttrSetterManager.m; sourceTree = ""; };
- 04FCA007C5BE63FC5541B26878E3DE79 /* HWPanModal.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HWPanModal.modulemap; sourceTree = ""; };
- 051A3BFDC2997068DD4E7A11FEBAE63E /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; };
- 0531DC0648DD160A9576D09368C28017 /* LookinAttributesSection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttributesSection.m; path = Src/Main/Shared/LookinAttributesSection.m; sourceTree = ""; };
- 057F1DBD0EB25FF8CA833DC6F478BF32 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; };
- 05E1785189AB18B6B47ECD584144AA0F /* KeyValueObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KeyValueObserver.m; path = Sources/KVO/KeyValueObserver.m; sourceTree = ""; };
- 069FA883A4FACC46317AB2BE1BDE30E4 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; };
- 074925B1189A88BAA6297431490B8041 /* LookinAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttribute.h; path = Src/Main/Shared/LookinAttribute.h; sourceTree = ""; };
- 07752F7C2A34B933346F7E8E9D95461C /* NSObject+MJKeyValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJKeyValue.h"; path = "MJExtension/NSObject+MJKeyValue.h"; sourceTree = ""; };
- 086D3945C39C8554602424E64D1A9F0B /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; };
- 0874A58BB3E268A75B1BD3D594CBAA2D /* LSTPopView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LSTPopView.debug.xcconfig; sourceTree = ""; };
- 09060CD8F1658C398DC40CC0221DB178 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; };
- 090BA40A2CB6D8D73A78895D821E7E93 /* Bugly.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bugly.release.xcconfig; sourceTree = ""; };
- 093706FD3573E105CD2368D496C2DF76 /* HWPanModalPresenterProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HWPanModalPresenterProtocol.h; path = Sources/Presenter/HWPanModalPresenterProtocol.h; sourceTree = ""; };
- 0AE63A9BC3D50E34C84263A87F782ACA /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; };
+ 00B67A73E7EE0522188FAE4145324D19 /* JXCategoryTitleCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JXCategoryTitleCell.h; path = Sources/Title/JXCategoryTitleCell.h; sourceTree = ""; };
+ 015571B1499F434BC7171DE7EA094577 /* UILabel+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UILabel+LookinServer.h"; path = "Src/Main/Server/Category/UILabel+LookinServer.h"; sourceTree = ""; };
+ 017032FDD415E1762246EBCDD2228351 /* HWDimmedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HWDimmedView.h; path = Sources/View/HWDimmedView.h; sourceTree = ""; };
+ 0210A2376F4634FAF99E871533D6AD1C /* LSTTimer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LSTTimer.modulemap; sourceTree = ""; };
+ 02986FE530B6F5FD0ABF721900839DA5 /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; };
+ 029DB3501B51C5C14FA8EC0A89559639 /* LKS_GestureTargetActionsSearcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_GestureTargetActionsSearcher.h; path = Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.h; sourceTree = ""; };
+ 02E945EEF3757BDF2B47E65C51C4D6D6 /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; };
+ 035807D7A9181D8E0DF6FAF1E2D6B33C /* MBProgressHUD.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MBProgressHUD.release.xcconfig; sourceTree = ""; };
+ 039AC3B9A6AA2BDAB5EB71E7A54C1EF5 /* HWPanModalShadow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HWPanModalShadow.h; path = Sources/View/HWPanModalShadow.h; sourceTree = ""; };
+ 04A50C0A5F4CA1B3AF632BFE12460FC6 /* MJExtensionConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtensionConst.h; path = MJExtension/MJExtensionConst.h; sourceTree = ""; };
+ 04A5DA1EDA3B5149D813E6B1D2B5ADDD /* MJExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.release.xcconfig; sourceTree = ""; };
+ 04AE87BD26EBAF13B558201544C0E822 /* JXCategoryTitleImageCellModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JXCategoryTitleImageCellModel.m; path = Sources/TitleImage/JXCategoryTitleImageCellModel.m; sourceTree = ""; };
+ 057CD48F09C7A5468D77A9691A639803 /* JXCategoryTitleCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JXCategoryTitleCell.m; path = Sources/Title/JXCategoryTitleCell.m; sourceTree = ""; };
+ 059C3C014AA92686FDCE895211A108CE /* JXCategoryTitleVerticalZoomView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JXCategoryTitleVerticalZoomView.h; path = Sources/VerticalZoomTitle/JXCategoryTitleVerticalZoomView.h; sourceTree = ""; };
+ 05B3B08A0927761DC2CBA02E9412CD21 /* LookinObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinObject.m; path = Src/Main/Shared/LookinObject.m; sourceTree = ""; };
+ 06077AACB035D8452C9F730B2E1F00DF /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; };
+ 06A633B376D525417B93138405029540 /* LookinCustomAttrModification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinCustomAttrModification.h; path = Src/Main/Shared/LookinCustomAttrModification.h; sourceTree = ""; };
+ 06AB57BB46CC82FE3257276649BAF8EA /* NSString+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Lookin.h"; path = "Src/Main/Shared/Category/NSString+Lookin.h"; sourceTree = ""; };
+ 06BE908D1EBE4269ACB69B26DE9B834E /* LKS_MultiplatformAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_MultiplatformAdapter.h; path = Src/Main/Server/Others/LKS_MultiplatformAdapter.h; sourceTree = ""; };
+ 06EFD395C240E38E2ED0DCAF40CE73FC /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; };
+ 0A19BDA4E648916460C20489D6D183F0 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; };
+ 0A5E3A2C0C49EB165C854762A832D48A /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; };
+ 0A7095DB3527991440F374C9F9DB5050 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; };
+ 0A8F3B5ED5052E8AFF569E50436DC3C0 /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; };
+ 0B08ADE1A4FFE94FDBBE13FE7CC2C1E5 /* JXCategoryBaseCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JXCategoryBaseCell.m; path = Sources/Base/JXCategoryBaseCell.m; sourceTree = ""; };
+ 0B0EEEE5F23AC446F4729522F4FC7A73 /* Masonry.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.release.xcconfig; sourceTree = ""; };
+ 0B18274068E3388B3808CDDEB810ECFA /* MJRefresh.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.debug.xcconfig; sourceTree = ""; };
+ 0B1D41519ED222707112BD66393CC6B2 /* LookinObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinObject.h; path = Src/Main/Shared/LookinObject.h; sourceTree = ""; };
+ 0B35D70EDD8A3E56FE6F0E6934A400CC /* LookinAttributeModification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttributeModification.m; path = Src/Main/Shared/LookinAttributeModification.m; sourceTree = ""; };
0B4AAC15A428CDC2A62AF9CC27BEA609 /* Pods-CustomKeyboard */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-CustomKeyboard"; path = Pods_CustomKeyboard.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 0BF099C561E70E7E4EDAC96628F02E58 /* MJExtensionConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJExtensionConst.m; path = MJExtension/MJExtensionConst.m; sourceTree = ""; };
+ 0BE68C7303DE07C8DA01573CDDE9003F /* HWPanModalInteractiveAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = HWPanModalInteractiveAnimator.m; path = Sources/Animator/HWPanModalInteractiveAnimator.m; sourceTree = ""; };
0C4AE62ED97252893F28F670D61AFB24 /* Pods-keyBoard-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-keyBoard-Info.plist"; sourceTree = ""; };
- 0C895614137416E86433C8E5EAF1D3CD /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; };
- 0CCA79288E187B2D3860B6A703D2D460 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; };
- 0CE9728E85B8432ED072CD0DC7926F20 /* UIView+LSTPV.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+LSTPV.m"; path = "LSTPopView/Classes/Code/UIView+LSTPV.m"; sourceTree = ""; };
- 0D53461EC25E2C6DAE3F3C2ABD951A2B /* LKSConfigManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKSConfigManager.h; path = Src/Main/Server/Others/LKSConfigManager.h; sourceTree = ""; };
+ 0C9F5466A18204DE825F30433C784EDB /* MJFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJFoundation.h; path = MJExtension/MJFoundation.h; sourceTree = ""; };
0D6215D1BCCE125B8DF73E38013CBBDC /* Pods-CustomKeyboard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CustomKeyboard.debug.xcconfig"; sourceTree = ""; };
- 0DDEE4190CA21B03ED83225BEC5FAC7D /* UIViewController+PanModalDefault.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+PanModalDefault.m"; path = "Sources/Presentable/UIViewController+PanModalDefault.m"; sourceTree = ""; };
- 0E350DE3AE3DE0F5FC5BD9A2EB159387 /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; };
- 0E376CA03D27B523F7F180B9EC99BD7C /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; };
- 0E5F47A6ED542F1D0EAA4DD94091B61C /* HWPanModalContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HWPanModalContentView.h; path = Sources/View/PanModal/HWPanModalContentView.h; sourceTree = ""; };
+ 0D8B581D78D02F65425434F924BB64B3 /* LookinHierarchyInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinHierarchyInfo.m; path = Src/Main/Shared/LookinHierarchyInfo.m; sourceTree = ""; };
+ 0E2875C79F8461486A975B000C1ABDE3 /* JXCategoryImageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JXCategoryImageCell.h; path = Sources/Image/JXCategoryImageCell.h; sourceTree = ""; };
0E732C0D026ACBC7DBD039DC3BDC2BCE /* Pods-keyBoard.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-keyBoard.modulemap"; sourceTree = ""; };
- 0E7B3F97FDF9522DB3E4FADD3DB88700 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; };
- 0EE4E19A07BCCCF8BDCE77F2A5966D55 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; };
- 0F067A700BA9565969A60D7617155FBC /* LSTTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LSTTimer.m; path = LSTTimer/Classes/LSTTimer.m; sourceTree = ""; };
- 107D93AEC1E186A8F21341BFB523B22C /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; };
- 107E86B9F22190515234220978E5F1C3 /* MJExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.release.xcconfig; sourceTree = ""; };
- 109CFCE9774385E51695E82E530412B8 /* UIView+HW_Frame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+HW_Frame.m"; path = "Sources/Category/UIView+HW_Frame.m"; sourceTree = ""; };
- 10A8507648AC9DE21CFA0929B1ED0404 /* HWPanModalInteractiveAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HWPanModalInteractiveAnimator.h; path = Sources/Animator/HWPanModalInteractiveAnimator.h; sourceTree = ""; };
- 10D1C021B7050EF6841A364EE9A0A570 /* HWDimmedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = HWDimmedView.m; path = Sources/View/HWDimmedView.m; sourceTree = ""; };
- 110C7A39306E93E5D29F1709FE16720F /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; };
- 119E6680DBF287ACAD4F054AA0D5AE17 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; };
- 11A5C3D2E3080F2A5EECFB7F1FC6C319 /* HWBackgroundConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = HWBackgroundConfig.m; path = Sources/View/HWBackgroundConfig.m; sourceTree = ""; };
- 13066DF230EEB3642E5BD7E5097A64F9 /* HWPanModal-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HWPanModal-dummy.m"; sourceTree = "