添加LYEmptyView '~> 0.3.10'

This commit is contained in:
2025-11-09 20:54:14 +08:00
parent 883b222254
commit e5ddcc4308
34 changed files with 5454 additions and 3115 deletions

View File

@@ -15,6 +15,7 @@ target 'keyBoard' do
pod 'HWPanModal', '~> 0.9.9'
pod 'LSTPopView', '~> 0.3.10'
pod 'LookinServer', :configurations => ['Debug']
pod 'LYEmptyView'
pod 'Masonry', '1.1.0'
pod 'MBProgressHUD', '1.2.0'
pod 'MJExtension', '3.4.2'

View File

@@ -29,6 +29,7 @@ PODS:
- LSTPopView/Code (0.3.10):
- LSTTimer
- LSTTimer (0.2.10)
- LYEmptyView (1.3.1)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.4.2)
@@ -43,10 +44,11 @@ DEPENDENCIES:
- DZNEmptyDataSet (= 1.8.1)
- FLAnimatedImage (~> 1.0.17)
- HWPanModal (~> 0.9.9)
- JXCategoryView
- JXCategoryView (~> 1.6.8)
- JXPagingView/Pager (~> 2.1.3)
- LookinServer
- LSTPopView (~> 0.3.10)
- LYEmptyView
- Masonry (= 1.1.0)
- MBProgressHUD (= 1.2.0)
- MJExtension (= 3.4.2)
@@ -65,6 +67,7 @@ SPEC REPOS:
- LookinServer
- LSTPopView
- LSTTimer
- LYEmptyView
- Masonry
- MBProgressHUD
- MJExtension
@@ -82,12 +85,13 @@ SPEC CHECKSUMS:
LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80
LSTPopView: 9379f00f6ce7d1fc620b50ab00ed3ef97b2d4d52
LSTTimer: caf8f02ff366ca175cf4c1778d26c166183c1b6f
LYEmptyView: b6d418cfa38b78df0cf243f9a9c25ccbdc399922
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: f29024626962457f3470184232766516dee8dfea
PODFILE CHECKSUM: ce689000a7b9b24f5d74cc50a93350665c3af035
PODFILE CHECKSUM: e5e2037c9180ed40ba4a0e264e837eaf839ca6b2
COCOAPODS: 1.16.2

View File

@@ -20,8 +20,6 @@
self.separatorLine = [[UIView alloc] init];
self.separatorLine.hidden = YES;
/// STTODO
self.contentView.layer.cornerRadius = 4;
[self.contentView addSubview:self.separatorLine];
}

21
Pods/LYEmptyView/LICENSE generated Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 yang
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.

View File

@@ -0,0 +1,146 @@
//
// LYEmptyBaseView.h
// LYEmptyViewDemo
//
// Created by liyang on 2017/5/5.
// Copyright © 2017年 liyang. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UIView+LYExtension.h"
//事件回调
typedef void (^LYActionTapBlock)(void);
@interface LYEmptyBaseView : UIView
/////////属性传递(可修改)
/* image 的优先级大于 imageStr只有一个有效*/
@property (nonatomic, strong)UIImage *image;
@property (nonatomic, copy) NSString *imageStr;
@property (nonatomic, copy) NSString *titleStr;
@property (nonatomic, copy) NSString *detailStr;
@property (nonatomic, copy) NSString *btnTitleStr;
/////////属性传递 (只读)
@property (nonatomic,strong,readonly) UIView *contentView;
@property (nonatomic, weak, readonly) id actionBtnTarget;
@property (nonatomic,assign,readonly) SEL actionBtnAction;
@property (nonatomic, copy, readonly) LYActionTapBlock btnClickBlock;
@property (nonatomic,strong,readonly) UIView *customView;
/**
emptyView点击事件
*/
@property (nonatomic, copy) LYActionTapBlock tapEmptyViewBlock;
///初始化配置
- (void)prepare;
///重置Subviews
- (void)setupSubviews;
/**
构造方法 - 创建emptyView
@param image 占位图片
@param titleStr 标题
@param detailStr 详细描述
@param btnTitleStr 按钮的名称
@param target 响应的对象
@param action 按钮点击事件
@return 返回一个emptyView
*/
+ (instancetype)emptyActionViewWithImage:(UIImage *)image
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
target:(id)target
action:(SEL)action;
/**
构造方法 - 创建emptyView
@param image 占位图片
@param titleStr 占位描述
@param detailStr 详细描述
@param btnTitleStr 按钮的名称
@param btnClickBlock 按钮点击事件回调
@return 返回一个emptyView
*/
+ (instancetype)emptyActionViewWithImage:(UIImage *)image
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
btnClickBlock:(LYActionTapBlock)btnClickBlock;
/**
构造方法 - 创建emptyView
@param imageStr 占位图片名称
@param titleStr 标题
@param detailStr 详细描述
@param btnTitleStr 按钮的名称
@param target 响应的对象
@param action 按钮点击事件
@return 返回一个emptyView
*/
+ (instancetype)emptyActionViewWithImageStr:(NSString *)imageStr
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
target:(id)target
action:(SEL)action;
/**
构造方法 - 创建emptyView
@param imageStr 占位图片名称
@param titleStr 占位描述
@param detailStr 详细描述
@param btnTitleStr 按钮的名称
@param btnClickBlock 按钮点击事件回调
@return 返回一个emptyView
*/
+ (instancetype)emptyActionViewWithImageStr:(NSString *)imageStr
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
btnClickBlock:(LYActionTapBlock)btnClickBlock;
/**
构造方法 - 创建emptyView
@param image 占位图片
@param titleStr 占位描述
@param detailStr 详细描述
@return 返回一个没有点击事件的emptyView
*/
+ (instancetype)emptyViewWithImage:(UIImage *)image
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr;
/**
构造方法 - 创建emptyView
@param imageStr 占位图片名称
@param titleStr 占位描述
@param detailStr 详细描述
@return 返回一个没有点击事件的emptyView
*/
+ (instancetype)emptyViewWithImageStr:(NSString *)imageStr
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr;
/**
构造方法 - 创建一个自定义的emptyView
@param customView 自定义view
@return 返回一个自定义内容的emptyView
*/
+ (instancetype)emptyViewWithCustomView:(UIView *)customView;
@end

View File

@@ -0,0 +1,212 @@
//
// LYEmptyBaseView.h
// LYEmptyViewDemo
//
// Created by liyang on 2017/5/5.
// Copyright © 2017 liyang. All rights reserved.
//
#import "LYEmptyBaseView.h"
@interface LYEmptyBaseView ()
@end
@implementation LYEmptyBaseView
#pragma mark - ------------------ Life Cycle ------------------
- (instancetype)init
{
self = [super init];
if (self) {
[self initialize];
[self prepare];
}
return self;
}
- (void)initialize{
}
- (void)prepare{
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
- (void)layoutSubviews
{
[super layoutSubviews];
UIView *view = self.superview;
//UIView
if (view && [view isKindOfClass:[UIView class]]){
self.ly_width = view.ly_width;
self.ly_height = view.ly_height;
}
[self setupSubviews];
}
- (void)setupSubviews{
}
- (void)willMoveToSuperview:(UIView *)newSuperview
{
[super willMoveToSuperview:newSuperview];
//UIView
if (newSuperview && ![newSuperview isKindOfClass:[UIView class]]) return;
if (newSuperview) {
self.ly_width = newSuperview.ly_width;
self.ly_height = newSuperview.ly_height;
}
}
#pragma mark - ------------------ ------------------
+ (instancetype)emptyActionViewWithImage:(UIImage *)image
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
target:(id)target
action:(SEL)action{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithImage:image imageStr:nil titleStr:titleStr detailStr:detailStr btnTitleStr:btnTitleStr target:target action:action btnClickBlock:nil];
return emptyView;
}
+ (instancetype)emptyActionViewWithImage:(UIImage *)image
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
btnClickBlock:(LYActionTapBlock)btnClickBlock{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithImage:image imageStr:nil titleStr:titleStr detailStr:detailStr btnTitleStr:btnTitleStr target:nil action:nil btnClickBlock:btnClickBlock];
return emptyView;
}
+ (instancetype)emptyActionViewWithImageStr:(NSString *)imageStr
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
target:(id)target
action:(SEL)action{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithImage:nil imageStr:imageStr titleStr:titleStr detailStr:detailStr btnTitleStr:btnTitleStr target:target action:action btnClickBlock:nil];
return emptyView;
}
+ (instancetype)emptyActionViewWithImageStr:(NSString *)imageStr
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr
btnTitleStr:(NSString *)btnTitleStr
btnClickBlock:(LYActionTapBlock)btnClickBlock{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithImage:nil imageStr:imageStr titleStr:titleStr detailStr:detailStr btnTitleStr:btnTitleStr target:nil action:nil btnClickBlock:btnClickBlock];
return emptyView;
}
+ (instancetype)emptyViewWithImage:(UIImage *)image
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithImage:image imageStr:nil titleStr:titleStr detailStr:detailStr btnTitleStr:nil target:nil action:nil btnClickBlock:nil];
return emptyView;
}
+ (instancetype)emptyViewWithImageStr:(NSString *)imageStr
titleStr:(NSString *)titleStr
detailStr:(NSString *)detailStr{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithImage:nil imageStr:imageStr titleStr:titleStr detailStr:detailStr btnTitleStr:nil target:nil action:nil btnClickBlock:nil];
return emptyView;
}
+ (instancetype)emptyViewWithCustomView:(UIView *)customView{
LYEmptyBaseView *emptyView = [[self alloc] init];
[emptyView creatEmptyViewWithCustomView:customView];
return emptyView;
}
- (void)creatEmptyViewWithImage:(UIImage *)image imageStr:(NSString *)imageStr titleStr:(NSString *)titleStr detailStr:(NSString *)detailStr btnTitleStr:(NSString *)btnTitleStr target:(id)target action:(SEL)action btnClickBlock:(LYActionTapBlock)btnClickBlock{
_image = image;
_imageStr = imageStr;
_titleStr = titleStr;
_detailStr = detailStr;
_btnTitleStr = btnTitleStr;
_actionBtnTarget = target;
_actionBtnAction = action;
_btnClickBlock = btnClickBlock;
//
if (!_contentView) {
_contentView = [[UIView alloc] initWithFrame:CGRectZero];
[self addSubview:_contentView];
}
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapEmptyView:)];
[self addGestureRecognizer:tap];
}
- (void)creatEmptyViewWithCustomView:(UIView *)customView{
//
if (!_contentView) {
_contentView = [[UIView alloc] initWithFrame:CGRectZero];
[self addSubview:_contentView];
}
if (!_customView) {
[_contentView addSubview:customView];
}
_customView = customView;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapEmptyView:)];
[self addGestureRecognizer:tap];
}
#pragma mark - ------------------ Event Method ------------------
- (void)tapEmptyView:(UITapGestureRecognizer *)tap{
if (_tapEmptyViewBlock) {
_tapEmptyViewBlock();
}
}
#pragma mark - ------------------ Setter ------------------
- (void)setImage:(UIImage *)image{
_image = image;
[self setNeedsLayout];
}
- (void)setImageStr:(NSString *)imageStr{
_imageStr = imageStr;
[self setNeedsLayout];
}
- (void)setTitleStr:(NSString *)titleStr{
_titleStr = titleStr;
[self setNeedsLayout];
}
- (void)setDetailStr:(NSString *)detailStr{
_detailStr = detailStr;
[self setNeedsLayout];
}
- (void)setBtnTitleStr:(NSString *)btnTitleStr{
_btnTitleStr = btnTitleStr;
[self setNeedsLayout];
}
@end

142
Pods/LYEmptyView/LYEmptyView/LYEmptyView.h generated Executable file
View File

@@ -0,0 +1,142 @@
//
// LYEmptyView.h
// LYEmptyViewDemo
//
// Created by liyang on 2017/5/10.
// Copyright © 2017年 liyang. All rights reserved.
//
#import "LYEmptyBaseView.h"
@interface LYEmptyView : LYEmptyBaseView
/**
是否自动显隐EmptyView, default=YES
*/
@property (nonatomic, assign) BOOL autoShowEmptyView;
/**
占位图是否完全覆盖父视图, default=NO
当设置为YES后占位图的backgroundColor默认为浅白色可自行设置
*/
@property (nonatomic, assign) BOOL emptyViewIsCompleteCoverSuperView;
/**
内容物上每个子控件之间的间距 default is 20.f , 这是统一设置的,每个子控件可单独设置
*/
@property (nonatomic, assign) CGFloat subViewMargin;
/**
内容物-垂直方向偏移 (此属性与contentViewY 互斥,只有一个会有效)
*/
@property (nonatomic, assign) CGFloat contentViewOffset;
/**
内容物-Y坐标 (此属性与contentViewOffset 互斥,只有一个会有效)
*/
@property (nonatomic, assign) CGFloat contentViewY;
/**
是否忽略scrollView的contentInset
*/
@property (nonatomic, assign) BOOL ignoreContentInset;
//-------------------------- image --------------------------//
/**
图片可设置固定大小 (default=图片实际大小)
*/
@property (nonatomic, assign) CGSize imageSize;
//-------------------------- titleLab 相关 --------------------------//
/**
标题字体, 大小default is 16.f
*/
@property (nonatomic, strong) UIFont *titleLabFont;
/**
标题文字颜色
*/
@property (nonatomic, strong) UIColor *titleLabTextColor;
/**
标题与图片之间的间距 default is @subViewMargin
*/
@property (nonatomic, assign) CGFloat titleLabMargin;
//-------------------------- detailLab 相关 --------------------------//
/**
详细描述字体大小default is 14.f
*/
@property (nonatomic, strong) UIFont *detailLabFont;
/**
详细描述最大行数, default is 2
*/
@property (nonatomic, assign) NSInteger detailLabMaxLines;
/**
详细描述文字颜色
*/
@property (nonatomic, strong) UIColor *detailLabTextColor;
/**
详细描述文字行间距
*/
@property (nonatomic, assign) NSInteger detailLabLineSpacing;
/**
详细描述 与 (标题或图片) 之间的间距 default is @subViewMargin
*/
@property (nonatomic, assign) CGFloat detailLabMargin;
//-------------------------- Button 相关 --------------------------//
/**
按钮字体, 大小default is 14.f
*/
@property (nonatomic, strong) UIFont *actionBtnFont;
/**
按钮的高度, default is 40.f
*/
@property (nonatomic, assign) CGFloat actionBtnHeight;
/**
按钮的宽度, default is 0.f, (此属性和actionBtnHorizontalMargin只有一个有效都>0时此属性优先级大)
*/
@property (nonatomic, assign) CGFloat actionBtnWidth;
/**
按钮的水平方向内边距, default is 30.f, (此属性和actionBtnWidth只有一个有效都>0时此属性优先级小)
*/
@property (nonatomic, assign) CGFloat actionBtnHorizontalMargin;
/**
按钮的圆角大小, default is 0
*/
@property (nonatomic, assign) CGFloat actionBtnCornerRadius;
/**
按钮边框border的宽度, default is 0
*/
@property (nonatomic, assign) CGFloat actionBtnBorderWidth;
/**
按钮边框颜色
*/
@property (nonatomic, strong) UIColor *actionBtnBorderColor;
/**
按钮文字颜色
*/
@property (nonatomic, strong) UIColor *actionBtnTitleColor;
/**
按钮背景颜色
*/
@property (nonatomic, strong) UIColor *actionBtnBackGroundColor;
/**
按钮背景渐变颜色集合2个
*/
@property (nonatomic, strong) NSArray<UIColor *> *actionBtnBackGroundGradientColors;
/**
按钮 与 (详细描述或标题或图片) 之间的间距 default is @subViewMargin
*/
@property (nonatomic, assign) CGFloat actionBtnMargin;
@end

656
Pods/LYEmptyView/LYEmptyView/LYEmptyView.m generated Executable file
View File

@@ -0,0 +1,656 @@
//
// LYEmptyView.m
// LYEmptyViewDemo
//
// Created by liyang on 2017/5/10.
// Copyright © 2017 liyang. All rights reserved.
//
#import "LYEmptyView.h"
//
#define kSubViewMargin 20.f
//
#define kTitleLabFont [UIFont systemFontOfSize:16.f]
//
#define kDetailLabFont [UIFont systemFontOfSize:14.f]
//
#define kActionBtnFont [UIFont systemFontOfSize:14.f]
//
#define kActionBtnHeight 40.f
//
#define kActionBtnWidth 120.f
//
#define kActionBtnHorizontalMargin 30.f
//
#define kBackgroundColor [UIColor colorWithRed:250.f/255.f green:250.f/255.f blue:250.f/255.f alpha:1.f]
//
#define kBlackColor [UIColor colorWithRed:0.3f green:0.3f blue:0.3f alpha:1.f]
//
#define kGrayColor [UIColor colorWithRed:0.5f green:0.5f blue:0.5f alpha:1.f]
@interface LYEmptyView ()
@property (nonatomic, strong) UIImageView *promptImageView;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *detailLabel;
@property (nonatomic, strong) UIButton *actionButton;
@property (nonatomic, strong) UIView *customV;
@end
@implementation LYEmptyView
{
CGFloat contentMaxWidth; //
CGFloat contentWidth; //
CGFloat contentHeight; //
CGFloat subViweMargin; //
}
- (void)initialize{
self.actionBtnHeight = 40.f;
self.actionBtnWidth = 120.f;
self.actionBtnHorizontalMargin = 30.f;
self.detailLabMaxLines = 2;
}
- (void)prepare{
[super prepare];
self.autoShowEmptyView = YES; //
self.contentViewY = 1000; //,contentY
}
- (void)setupSubviews{
[super setupSubviews];
contentMaxWidth = self.emptyViewIsCompleteCoverSuperView ? self.ly_width : self.ly_width - 30.f;
contentWidth = 0;//
contentHeight = 0;//
subViweMargin = self.subViewMargin ? self.subViewMargin : kSubViewMargin;
//
UIImage *image;
if (self.imageStr.length) {
image = [UIImage imageNamed:self.imageStr];
}
if(self.image){
[self setupPromptImageView:self.image];
}else if (image) {
[self setupPromptImageView:image];
} else{
if (_promptImageView) {
[self.promptImageView removeFromSuperview];
self.promptImageView = nil;
}
}
//
if (self.titleStr.length) {
[self setupTitleLabel:self.titleStr];
}else{
if (_titleLabel) {
[self.titleLabel removeFromSuperview];
self.titleLabel = nil;
}
}
//
if (self.detailStr.length) {
[self setupDetailLabel:self.detailStr];
}else{
if (_detailLabel) {
[self.detailLabel removeFromSuperview];
self.detailLabel = nil;
}
}
//
if (self.btnTitleStr.length) {
if (self.actionBtnTarget && self.actionBtnAction) {
[self setupActionBtn:self.btnTitleStr target:self.actionBtnTarget action:self.actionBtnAction btnClickBlock:nil];
}else if (self.btnClickBlock) {
[self setupActionBtn:self.btnTitleStr target:nil action:nil btnClickBlock:self.btnClickBlock];
}else{
if (_actionButton) {
[self.actionButton removeFromSuperview];
self.actionButton = nil;
}
}
}else{
if (_actionButton) {
[self.actionButton removeFromSuperview];
self.actionButton = nil;
}
}
//view
if (self.customView) {
contentWidth = self.customView.ly_width;
contentHeight = self.customView.ly_maxY;
}
///frame
[self setSubViewFrame];
}
- (void)setSubViewFrame{
//emptyView
CGFloat originEmptyWidth = self.ly_width;
CGFloat originEmptyHeight = self.ly_height;
CGFloat emptyViewCenterX = originEmptyWidth * 0.5f;
CGFloat emptyViewCenterY = originEmptyHeight * 0.5f;
//selfframecontent
if (!self.emptyViewIsCompleteCoverSuperView) {
self.ly_size = CGSizeMake(contentWidth, contentHeight);
}
self.center = CGPointMake(emptyViewCenterX, emptyViewCenterY);
//contentView
self.contentView.ly_size = CGSizeMake(contentWidth, contentHeight);
if (self.emptyViewIsCompleteCoverSuperView) {
self.contentView.center = CGPointMake(emptyViewCenterX, emptyViewCenterY);
} else {
self.contentView.center = CGPointMake(contentWidth*0.5, contentHeight*0.5);
}
//centerX
CGFloat centerX = self.contentView.ly_width * 0.5f;
if (self.customView) {
self.customView.ly_centerX = centerX;
}else{
_promptImageView.ly_centerX = centerX;
_titleLabel.ly_centerX = centerX;
_detailLabel.ly_centerX = centerX;
_actionButton.ly_centerX = centerX;
}
if (self.contentViewOffset) { //
self.ly_centerY += self.contentViewOffset;
} else if (self.contentViewY < 1000) { //Y
self.ly_y = self.contentViewY;
}
//scrollViewcontentInset
if (self.ignoreContentInset && [self.superview isKindOfClass:[UIScrollView class]]) {
UIScrollView *scrollView = (UIScrollView *)self.superview;
self.ly_centerY -= scrollView.contentInset.top;
self.ly_centerX -= scrollView.contentInset.left;
self.ly_centerY += scrollView.contentInset.bottom;
self.ly_centerX += scrollView.contentInset.right;
}
}
#pragma mark - ------------------ Setup View ------------------
- (void)setupPromptImageView:(UIImage *)img{
self.promptImageView.image = img;
CGFloat imgViewWidth = img.size.width;
CGFloat imgViewHeight = img.size.height;
if (self.imageSize.width && self.imageSize.height) {//
if (imgViewWidth > imgViewHeight) {//
imgViewHeight = (imgViewHeight / imgViewWidth) * self.imageSize.width;
imgViewWidth = self.imageSize.width;
}else{//
imgViewWidth = (imgViewWidth / imgViewHeight) * self.imageSize.height;
imgViewHeight = self.imageSize.height;
}
}
self.promptImageView.frame = CGRectMake(0, 0, imgViewWidth, imgViewHeight);
contentWidth = self.promptImageView.ly_size.width;
contentHeight = self.promptImageView.ly_maxY;
}
- (void)setupTitleLabel:(NSString *)titleStr{
UIFont *font = self.titleLabFont.pointSize ? self.titleLabFont : kTitleLabFont;
CGFloat fontSize = font.pointSize;
UIColor *textColor = self.titleLabTextColor ? self.titleLabTextColor : kBlackColor;
CGFloat titleMargin = self.titleLabMargin > 0 ? self.titleLabMargin : (contentHeight == 0 ?: subViweMargin);
CGSize size = [self returnTextWidth:titleStr size:CGSizeMake(contentMaxWidth, fontSize + 5) font:font];
CGFloat width = size.width;
CGFloat height = size.height;
self.titleLabel.frame = CGRectMake(0, contentHeight + titleMargin, width, height);
self.titleLabel.font = font;
self.titleLabel.text = titleStr;
self.titleLabel.textColor = textColor;
contentWidth = width > contentWidth ? width : contentWidth;
contentHeight = self.titleLabel.ly_maxY;
}
- (void)setupDetailLabel:(NSString *)detailStr{
UIColor *textColor = self.detailLabTextColor ? self.detailLabTextColor : kGrayColor;
UIFont *font = self.detailLabFont.pointSize ? self.detailLabFont : kDetailLabFont;
CGFloat fontSize = font.pointSize;
CGFloat maxLines = self.detailLabMaxLines > 0 ? self.detailLabMaxLines : 1;
CGFloat detailMargin = self.detailLabMargin > 0 ? self.detailLabMargin : (contentHeight == 0 ?: subViweMargin);
self.detailLabel.font = font;
self.detailLabel.textColor = textColor;
self.detailLabel.text = detailStr;
CGFloat width = 0;
CGFloat height = 0;
//
if(self.detailLabLineSpacing){
CGFloat maxHeight = maxLines * (fontSize + 5) + (maxLines-1) * self.detailLabLineSpacing;
NSDictionary *dic = [self sizeWithAttributedString:self.detailLabel.text font:font lineSpacing:self.detailLabLineSpacing maxSize:CGSizeMake(contentMaxWidth, maxHeight)];
NSMutableAttributedString *attStr = dic[@"attributed"];
NSValue *sizeValue = dic[@"size"];
CGSize size = sizeValue.CGSizeValue;
width = size.width;
height = size.height;
self.detailLabel.attributedText = attStr;
}
else{
CGFloat maxHeight = maxLines * (fontSize + 5);
CGSize size = [self returnTextWidth:detailStr size:CGSizeMake(contentMaxWidth, maxHeight) font:font];//label
width = size.width;
height = size.height;
}
self.detailLabel.frame = CGRectMake(0, contentHeight + detailMargin, width, height);
contentWidth = width > contentWidth ? width : contentWidth;
contentHeight = self.detailLabel.ly_maxY;
}
- (void)setupActionBtn:(NSString *)btnTitle target:(id)target action:(SEL)action btnClickBlock:(LYActionTapBlock)btnClickBlock{
UIFont *font = self.actionBtnFont.pointSize ? self.actionBtnFont : kActionBtnFont;
CGFloat fontSize = font.pointSize;
UIColor *titleColor = self.actionBtnTitleColor ?: kBlackColor;
UIColor *backGColor = self.actionBtnBackGroundColor ?: [UIColor whiteColor];
UIColor *borderColor = self.actionBtnBorderColor ?: [UIColor colorWithRed:0.8f green:0.8f blue:0.8f alpha:1.f];
CGFloat borderWidth = self.actionBtnBorderWidth ?: 0;
CGFloat cornerRadius = self.actionBtnCornerRadius ?: 0;
CGFloat width = self.actionBtnWidth;
CGFloat horiMargin = self.actionBtnHorizontalMargin;
CGFloat height = self.actionBtnHeight;
CGSize textSize = [self returnTextWidth:btnTitle size:CGSizeMake(contentMaxWidth, fontSize) font:font];//title
if (height < textSize.height) {
height = textSize.height + 4.f;
}
//
CGFloat btnWidth = textSize.width;
if (width) {
btnWidth = width;
} else if (horiMargin) {
btnWidth = textSize.width + horiMargin * 2.f;
}
//
CGFloat btnHeight = height;
btnWidth = btnWidth > contentMaxWidth ? contentMaxWidth : btnWidth;
CGFloat btnMargin = self.actionBtnMargin > 0 ? self.actionBtnMargin : (contentHeight == 0 ?: subViweMargin);
self.actionButton.frame = CGRectMake(0, contentHeight + btnMargin, btnWidth, btnHeight);
[self.actionButton setTitle:btnTitle forState:UIControlStateNormal];
self.actionButton.titleLabel.font = font;
self.actionButton.backgroundColor = backGColor;
if (self.actionBtnBackGroundGradientColors) [self addGradientWithView:self.actionButton gradientColors:self.actionBtnBackGroundGradientColors];
[self.actionButton setTitleColor:titleColor forState:UIControlStateNormal];
self.actionButton.layer.borderColor = borderColor.CGColor;
self.actionButton.layer.borderWidth = borderWidth;
self.actionButton.layer.cornerRadius = cornerRadius;
//
if (target && action) {
[self.actionButton addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
[self.actionButton addTarget:self action:@selector(actionBtnClick:) forControlEvents:UIControlEventTouchUpInside];
}else if (btnClickBlock) {
[self.actionButton addTarget:self action:@selector(actionBtnClick:) forControlEvents:UIControlEventTouchUpInside];
}
contentWidth = btnWidth > contentWidth ? btnWidth : contentWidth;
contentHeight = self.actionButton.ly_maxY;
}
#pragma mark - ------------------ Event Method ------------------
- (void)actionBtnClick:(UIButton *)sender{
if (self.btnClickBlock) {
self.btnClickBlock();
}
}
#pragma mark - ------------------ setter ------------------
- (void)setEmptyViewIsCompleteCoverSuperView:(BOOL)emptyViewIsCompleteCoverSuperView{
_emptyViewIsCompleteCoverSuperView = emptyViewIsCompleteCoverSuperView;
if (emptyViewIsCompleteCoverSuperView) {
if (!self.backgroundColor || [self.backgroundColor isEqual:[UIColor clearColor]]) {
self.backgroundColor = kBackgroundColor;
}
[self setNeedsLayout];
}else{
self.backgroundColor = [UIColor clearColor];
}
}
#pragma mark
- (void)setSubViewMargin:(CGFloat)subViewMargin{
if (_subViewMargin != subViewMargin) {
_subViewMargin = subViewMargin;
[self reSetupSubviews];
}
}
- (void)setTitleLabMargin:(CGFloat)titleLabMargin{
if (_titleLabMargin != titleLabMargin) {
_titleLabMargin = titleLabMargin;
[self reSetupSubviews];
}
}
- (void)setDetailLabMargin:(CGFloat)detailLabMargin{
if (_detailLabMargin != detailLabMargin) {
_detailLabMargin = detailLabMargin;
[self reSetupSubviews];
}
}
- (void)setActionBtnMargin:(CGFloat)actionBtnMargin{
if (_actionBtnMargin != actionBtnMargin) {
_actionBtnMargin = actionBtnMargin;
[self reSetupSubviews];
}
}
- (void)reSetupSubviews{
if (_promptImageView || _titleLabel || _detailLabel || _actionButton || self.customView) {//self
[self setupSubviews];
}
}
- (void)setContentViewOffset:(CGFloat)contentViewOffset{
if (_contentViewOffset != contentViewOffset) {
_contentViewOffset = contentViewOffset;
if (_promptImageView || _titleLabel || _detailLabel || _actionButton || self.customView) {
self.ly_centerY += self.contentViewOffset;
}
}
}
- (void)setContentViewY:(CGFloat)contentViewY{
if (_contentViewY != contentViewY) {
_contentViewY = contentViewY;
if (_promptImageView || _titleLabel || _detailLabel || _actionButton || self.customView) {
self.ly_y = self.contentViewY;
}
}
}
#pragma mark Image
- (void)setImageSize:(CGSize)imageSize{
if (_imageSize.width != imageSize.width || _imageSize.height != imageSize.height) {
_imageSize = imageSize;
if (_promptImageView) {
[self setupSubviews];
}
}
}
#pragma mark Label
- (void)setTitleLabFont:(UIFont *)titleLabFont{
if (_titleLabFont != titleLabFont) {
_titleLabFont = titleLabFont;
if (_titleLabel) {
[self setupSubviews];
}
}
}
- (void)setTitleLabTextColor:(UIColor *)titleLabTextColor{
if (_titleLabTextColor != titleLabTextColor) {
_titleLabTextColor = titleLabTextColor;
if (_titleLabel) {
_titleLabel.textColor = titleLabTextColor;
}
}
}
#pragma mark Label
- (void)setDetailLabFont:(UIFont *)detailLabFont{
if (_detailLabFont != detailLabFont) {
_detailLabFont = detailLabFont;
if (_detailLabel) {
[self setupSubviews];
}
}
}
- (void)setDetailLabMaxLines:(NSInteger)detailLabMaxLines{
if (_detailLabMaxLines != detailLabMaxLines) {
_detailLabMaxLines = detailLabMaxLines;
if (_detailLabel) {
[self setupSubviews];
}
}
}
- (void)setDetailLabTextColor:(UIColor *)detailLabTextColor{
if (_detailLabTextColor != detailLabTextColor) {
_detailLabTextColor = detailLabTextColor;
if (_detailLabel) {
_detailLabel.textColor = detailLabTextColor;
}
}
}
- (void)setDetailLabLineSpacing:(NSInteger)detailLabLineSpacing{
if (_detailLabLineSpacing != detailLabLineSpacing) {
_detailLabLineSpacing = detailLabLineSpacing;
if (_detailLabel) {
[self setupSubviews];
}
}
}
#pragma mark Button
//////////-
- (void)setActionBtnFont:(UIFont *)actionBtnFont{
if (_actionBtnFont != actionBtnFont) {
_actionBtnFont = actionBtnFont;
if (_actionButton) {
[self setupSubviews];
}
}
}
- (void)setActionBtnHeight:(CGFloat)actionBtnHeight{
if (_actionBtnHeight != actionBtnHeight) {
_actionBtnHeight = actionBtnHeight;
if (_actionButton) {
[self setupSubviews];
}
}
}
- (void)setActionBtnWidth:(CGFloat)actionBtnWidth{
if (_actionBtnWidth != actionBtnWidth) {
_actionBtnWidth = actionBtnWidth;
if (_actionButton) {
[self setupSubviews];
}
}
}
- (void)setActionBtnHorizontalMargin:(CGFloat)actionBtnHorizontalMargin{
if (_actionBtnHorizontalMargin != actionBtnHorizontalMargin) {
_actionBtnHorizontalMargin = actionBtnHorizontalMargin;
if (_actionButton) {
[self setupSubviews];
}
}
}
//////////-
- (void)setActionBtnCornerRadius:(CGFloat)actionBtnCornerRadius{
if (_actionBtnCornerRadius != actionBtnCornerRadius) {
_actionBtnCornerRadius = actionBtnCornerRadius;
if (_actionButton) {
_actionButton.layer.cornerRadius = actionBtnCornerRadius;
}
}
}
- (void)setActionBtnBorderWidth:(CGFloat)actionBtnBorderWidth{
if (actionBtnBorderWidth != _actionBtnBorderWidth) {
_actionBtnBorderWidth = actionBtnBorderWidth;
if (_actionButton) {
_actionButton.layer.borderWidth = actionBtnBorderWidth;
}
}
}
- (void)setActionBtnBorderColor:(UIColor *)actionBtnBorderColor{
if (_actionBtnBorderColor != actionBtnBorderColor) {
_actionBtnBorderColor = actionBtnBorderColor;
if (_actionButton) {
_actionButton.layer.borderColor = actionBtnBorderColor.CGColor;
}
}
}
- (void)setActionBtnTitleColor:(UIColor *)actionBtnTitleColor{
if (_actionBtnTitleColor != actionBtnTitleColor) {
_actionBtnTitleColor = actionBtnTitleColor;
if (_actionButton) {
[_actionButton setTitleColor:actionBtnTitleColor forState:UIControlStateNormal];
}
}
}
- (void)setActionBtnBackGroundColor:(UIColor *)actionBtnBackGroundColor{
if (actionBtnBackGroundColor != _actionBtnBackGroundColor) {
_actionBtnBackGroundColor = actionBtnBackGroundColor;
if (_actionButton) {
[_actionButton setBackgroundColor:actionBtnBackGroundColor];
}
}
}
- (void)setActionBtnBackGroundGradientColors:(NSArray<UIColor *> *)actionBtnBackGroundGradientColors
{
if (actionBtnBackGroundGradientColors.count >= 2) {
_actionBtnBackGroundGradientColors = [actionBtnBackGroundGradientColors subarrayWithRange:NSMakeRange(0, 2)];
if (_actionButton) {
[self addGradientWithView:_actionButton gradientColors:_actionBtnBackGroundGradientColors];
}
}
}
#pragma mark - ------------------ getter ------------------
- (UIImageView *)promptImageView{
if (!_promptImageView) {
_promptImageView = [[UIImageView alloc] init];
_promptImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.contentView addSubview:_promptImageView];
}
return _promptImageView;
}
- (UILabel *)titleLabel{
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.textAlignment = NSTextAlignmentCenter;
[self.contentView addSubview:_titleLabel];
}
return _titleLabel;
}
- (UILabel *)detailLabel{
if (!_detailLabel) {
_detailLabel = [[UILabel alloc] init];
_detailLabel.textAlignment = NSTextAlignmentCenter;
_detailLabel.numberOfLines = 0;
[self.contentView addSubview:_detailLabel];
}
return _detailLabel;
}
- (UIButton *)actionButton{
if (!_actionButton) {
_actionButton = [[UIButton alloc] init];
_actionButton.layer.masksToBounds = YES;
[self.contentView addSubview:_actionButton];
}
return _actionButton;
}
#pragma mark - ------------------ Help Method ------------------
- (CGSize)returnTextWidth:(NSString *)text size:(CGSize)size font:(UIFont *)font{
CGSize textSize = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil].size;
return textSize;
}
- (NSDictionary *)sizeWithAttributedString:(NSString *)string font:(UIFont *)font lineSpacing:(CGFloat)lineSpacing maxSize:(CGSize)maxSize{
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
paragraphStyle.lineSpacing = lineSpacing; //
paragraphStyle.alignment = NSTextAlignmentCenter;
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:string attributes:@{NSParagraphStyleAttributeName: paragraphStyle, NSFontAttributeName:font}];
CGSize size = [attributedStr boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size;
NSDictionary *dic = @{
@"attributed":attributedStr,
@"size": [NSValue valueWithCGSize:size]
};
return dic;
}
- (void)addGradientWithView:(UIView *)view gradientColors:(NSArray<UIColor *> *)gradientColors
{
[view setBackgroundColor:[UIColor clearColor]];
NSArray *colors = @[(__bridge id)[gradientColors.firstObject CGColor],
(__bridge id)[gradientColors.lastObject CGColor]];
CAGradientLayer *layer = [CAGradientLayer layer];
layer.colors = colors;
layer.locations = @[@0.3, @0.5, @1.0];
layer.startPoint = CGPointMake(0, 0);
layer.endPoint = CGPointMake(1.0, 0);
layer.frame = view.bounds;
layer.masksToBounds = YES;
layer.cornerRadius = view.frame.size.height * 0.5;
CALayer *firstLayer = self.layer.sublayers.firstObject;
if ([firstLayer isKindOfClass:[CAGradientLayer class]]) {
[view.layer replaceSublayer:firstLayer with:layer];
} else {
[view.layer insertSublayer:layer atIndex:0];
}
}
@end

View File

@@ -0,0 +1,15 @@
//
// LYEmptyViewHeader.h
// LYEmptyViewDemo
//
// Created by 李阳 on 2017/5/11.
// Copyright © 2017年 liyang. All rights reserved.
//
#ifndef LYEmptyViewHeader_h
#define LYEmptyViewHeader_h
#import "LYEmptyView.h"
#import "UIView+Empty.h"
#endif /* LYEmptyViewHeader_h */

View File

@@ -0,0 +1,54 @@
//
// UIView+Empty.h
// LYEmptyViewDemo
//
// Created by liyang on 2018/5/10.
// Copyright © 2018年 liyang. All rights reserved.
//
#import <UIKit/UIKit.h>
@class LYEmptyView;
@interface UIView (Empty)
/**
空页面占位图控件
*/
@property (nonatomic, strong) LYEmptyView *ly_emptyView;
///////////////////////
///////////////////////
//使用下面的四个方法请将EmptyView的autoShowEmptyView值置为NO关闭自动显隐以保证不受自动显隐的影响
///////////////////////
///////////////////////
/**
一般用于开始请求网络时调用ly_startLoading调用时会暂时隐藏emptyView
当调用ly_endLoading方法时ly_endLoading方法内部会根据当前的tableView/collectionView的
DataSource来自动判断是否显示emptyView
*/
- (void)ly_startLoading;
/**
在想要刷新emptyView状态时调用
注意:ly_endLoading 的调用时机有刷新UI的地方一定要等到刷新UI的方法之后调用
因为只有刷新了UIview的DataSource才会更新故调用此方法才能正确判断是否有内容。
*/
- (void)ly_endLoading;
//调用下面两个手动显隐的方法不受DataSource的影响单独设置显示与隐藏前提是关闭autoShowEmptyView
/**
手动调用显示emptyView
*/
- (void)ly_showEmptyView;
/**
手动调用隐藏emptyView
*/
- (void)ly_hideEmptyView;
@end

View File

@@ -0,0 +1,224 @@
//
// UIView+Empty.m
// LYEmptyViewDemo
//
// Created by liyang on 2018/5/10.
// Copyright © 2018 liyang. All rights reserved.
//
#import "UIView+Empty.h"
#import <objc/runtime.h>
#import "LYEmptyView.h"
#pragma mark - ------------------ UIView ------------------
@implementation UIView (Empty)
+ (void)exchangeInstanceMethod1:(SEL)method1 method2:(SEL)method2
{
method_exchangeImplementations(class_getInstanceMethod(self, method1), class_getInstanceMethod(self, method2));
}
#pragma mark - Setter/Getter
static char kEmptyViewKey;
- (void)setLy_emptyView:(LYEmptyView *)ly_emptyView{
if (ly_emptyView != self.ly_emptyView) {
objc_setAssociatedObject(self, &kEmptyViewKey, ly_emptyView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
for (UIView *view in self.subviews) {
if ([view isKindOfClass:[LYEmptyView class]]) {
[view removeFromSuperview];
}
}
[self addSubview:self.ly_emptyView];
if ([self isKindOfClass:[UITableView class]] || [self isKindOfClass:[UICollectionView class]]) {
[self getDataAndSet]; // DataSource
} else {
self.ly_emptyView.hidden = YES;//
}
}
}
- (LYEmptyView *)ly_emptyView{
return objc_getAssociatedObject(self, &kEmptyViewKey);
}
#pragma mark - Private Method (UITableViewUICollectionView)
- (NSInteger)totalDataCount
{
NSInteger totalCount = 0;
if ([self isKindOfClass:[UITableView class]]) {
UITableView *tableView = (UITableView *)self;
for (NSInteger section = 0; section < tableView.numberOfSections; section++) {
totalCount += [tableView numberOfRowsInSection:section];
}
} else if ([self isKindOfClass:[UICollectionView class]]) {
UICollectionView *collectionView = (UICollectionView *)self;
for (NSInteger section = 0; section < collectionView.numberOfSections; section++) {
totalCount += [collectionView numberOfItemsInSection:section];
}
}
return totalCount;
}
- (void)getDataAndSet{
//emptyView
if (!self.ly_emptyView) {
return;
}
if ([self totalDataCount] == 0) {
[self show];
}else{
[self hide];
}
}
- (void)show{
//show ly_showEmptyView
if (!self.ly_emptyView.autoShowEmptyView) {
return;
}
[self ly_showEmptyView];
}
- (void)hide{
//hide ly_hideEmptyView
if (!self.ly_emptyView.autoShowEmptyView) {
return;
}
[self ly_hideEmptyView];
}
#pragma mark - Public Method
- (void)ly_showEmptyView{
NSAssert(![self isKindOfClass:[LYEmptyView class]], @"LYEmptyView及其子类不能调用ly_showEmptyView方法");
self.ly_emptyView.hidden = NO;
// emptyBGView
[self bringSubviewToFront:self.ly_emptyView];
}
- (void)ly_hideEmptyView{
NSAssert(![self isKindOfClass:[LYEmptyView class]], @"LYEmptyView及其子类不能调用ly_hideEmptyView方法");
self.ly_emptyView.hidden = YES;
}
- (void)ly_startLoading{
NSAssert(![self isKindOfClass:[LYEmptyView class]], @"LYEmptyView及其子类不能调用ly_startLoading方法");
self.ly_emptyView.hidden = YES;
}
- (void)ly_endLoading{
NSAssert(![self isKindOfClass:[LYEmptyView class]], @"LYEmptyView及其子类不能调用ly_endLoading方法");
self.ly_emptyView.hidden = [self totalDataCount];
}
@end
#pragma mark - ------------------ UITableView ------------------
@implementation UITableView (Empty)
+ (void)load{
[self exchangeInstanceMethod1:@selector(reloadData) method2:@selector(ly_reloadData)];
///section
[self exchangeInstanceMethod1:@selector(insertSections:withRowAnimation:) method2:@selector(ly_insertSections:withRowAnimation:)];
[self exchangeInstanceMethod1:@selector(deleteSections:withRowAnimation:) method2:@selector(ly_deleteSections:withRowAnimation:)];
[self exchangeInstanceMethod1:@selector(reloadSections:withRowAnimation:) method2:@selector(ly_reloadSections:withRowAnimation:)];
///row
[self exchangeInstanceMethod1:@selector(insertRowsAtIndexPaths:withRowAnimation:) method2:@selector(ly_insertRowsAtIndexPaths:withRowAnimation:)];
[self exchangeInstanceMethod1:@selector(deleteRowsAtIndexPaths:withRowAnimation:) method2:@selector(ly_deleteRowsAtIndexPaths:withRowAnimation:)];
[self exchangeInstanceMethod1:@selector(reloadRowsAtIndexPaths:withRowAnimation:) method2:@selector(ly_reloadRowsAtIndexPaths:withRowAnimation:)];
}
- (void)ly_reloadData{
[self ly_reloadData];
[self getDataAndSet];
}
///section
- (void)ly_insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation{
[self ly_insertSections:sections withRowAnimation:animation];
[self getDataAndSet];
}
- (void)ly_deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation{
[self ly_deleteSections:sections withRowAnimation:animation];
[self getDataAndSet];
}
- (void)ly_reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation{
[self ly_reloadSections:sections withRowAnimation:animation];
[self getDataAndSet];
}
///row
- (void)ly_insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation{
[self ly_insertRowsAtIndexPaths:indexPaths withRowAnimation:animation];
[self getDataAndSet];
}
- (void)ly_deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation{
[self ly_deleteRowsAtIndexPaths:indexPaths withRowAnimation:animation];
[self getDataAndSet];
}
- (void)ly_reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation{
[self ly_reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation];
[self getDataAndSet];
}
@end
#pragma mark - ------------------ UICollectionView ------------------
@implementation UICollectionView (Empty)
+ (void)load{
[self exchangeInstanceMethod1:@selector(reloadData) method2:@selector(ly_reloadData)];
///section
[self exchangeInstanceMethod1:@selector(insertSections:) method2:@selector(ly_insertSections:)];
[self exchangeInstanceMethod1:@selector(deleteSections:) method2:@selector(ly_deleteSections:)];
[self exchangeInstanceMethod1:@selector(reloadSections:) method2:@selector(ly_reloadSections:)];
///item
[self exchangeInstanceMethod1:@selector(insertItemsAtIndexPaths:) method2:@selector(ly_insertItemsAtIndexPaths:)];
[self exchangeInstanceMethod1:@selector(deleteItemsAtIndexPaths:) method2:@selector(ly_deleteItemsAtIndexPaths:)];
[self exchangeInstanceMethod1:@selector(reloadItemsAtIndexPaths:) method2:@selector(ly_reloadItemsAtIndexPaths:)];
}
- (void)ly_reloadData{
[self ly_reloadData];
[self getDataAndSet];
}
///section
- (void)ly_insertSections:(NSIndexSet *)sections{
[self ly_insertSections:sections];
[self getDataAndSet];
}
- (void)ly_deleteSections:(NSIndexSet *)sections{
[self ly_deleteSections:sections];
[self getDataAndSet];
}
- (void)ly_reloadSections:(NSIndexSet *)sections{
[self ly_reloadSections:sections];
[self getDataAndSet];
}
///item
- (void)ly_insertItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths{
[self ly_insertItemsAtIndexPaths:indexPaths];
[self getDataAndSet];
}
- (void)ly_deleteItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths{
[self ly_deleteItemsAtIndexPaths:indexPaths];
[self getDataAndSet];
}
- (void)ly_reloadItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths{
[self ly_reloadItemsAtIndexPaths:indexPaths];
[self getDataAndSet];
}
@end

View File

@@ -0,0 +1,26 @@
//
// UIView+LYExtension.h
// LYEmptyViewDemo
//
// Created by 李阳 on 2017/5/12.
// Copyright © 2017年 liyang. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIView (LYExtension)
@property (nonatomic, assign) CGFloat ly_x;
@property (nonatomic, assign) CGFloat ly_y;
@property (nonatomic, assign) CGFloat ly_width;
@property (nonatomic, assign) CGFloat ly_height;
@property (nonatomic, assign) CGFloat ly_centerX;
@property (nonatomic, assign) CGFloat ly_centerY;
@property (nonatomic, assign) CGSize ly_size;
@property (nonatomic, assign) CGPoint ly_origin;
@property (nonatomic, assign, readonly) CGFloat ly_maxX;
@property (nonatomic, assign, readonly) CGFloat ly_maxY;
@end

View File

@@ -0,0 +1,108 @@
//
// UIView+LYExtension.m
// LYEmptyViewDemo
//
// Created by on 2017/5/12.
// Copyright © 2017 liyang. All rights reserved.
//
#import "UIView+LYExtension.h"
@implementation UIView (LYExtension)
- (void)setLy_x:(CGFloat)ly_x{
CGRect frame = self.frame;
frame.origin.x = ly_x;
self.frame = frame;
}
- (CGFloat)ly_x
{
return self.frame.origin.x;
}
- (void)setLy_y:(CGFloat)ly_y{
CGRect frame = self.frame;
frame.origin.y = ly_y;
self.frame = frame;
}
- (CGFloat)ly_y
{
return self.frame.origin.y;
}
- (void)setLy_centerX:(CGFloat)ly_centerX{
CGPoint center = self.center;
center.x = ly_centerX;
self.center = center;
}
- (CGFloat)ly_centerX
{
return self.center.x;
}
- (void)setLy_centerY:(CGFloat)ly_centerY
{
CGPoint center = self.center;
center.y = ly_centerY;
self.center = center;
}
- (CGFloat)ly_centerY
{
return self.center.y;
}
- (void)setLy_width:(CGFloat)ly_width
{
CGRect frame = self.frame;
frame.size.width = ly_width;
self.frame = frame;
}
- (CGFloat)ly_width
{
return self.frame.size.width;
}
- (void)setLy_height:(CGFloat)ly_height
{
CGRect frame = self.frame;
frame.size.height = ly_height;
self.frame = frame;
}
- (CGFloat)ly_height
{
return self.frame.size.height;
}
- (void)setLy_size:(CGSize)ly_size
{
CGRect frame = self.frame;
frame.size = ly_size;
self.frame = frame;
}
- (CGSize)ly_size
{
return self.frame.size;
}
- (void)setLy_origin:(CGPoint)ly_origin
{
CGRect frame = self.frame;
frame.origin = ly_origin;
self.frame = frame;
}
- (CGPoint)ly_origin
{
return self.frame.origin;
}
- (CGFloat)ly_maxX{
return self.frame.origin.x + self.frame.size.width;
}
- (CGFloat)ly_maxY{
return self.frame.origin.y + self.frame.size.height;
}
@end

297
Pods/LYEmptyView/README.md generated Normal file
View File

@@ -0,0 +1,297 @@
# LYEmptyView
不需要遵循协议不需要设置代理不需要实现代理方法只需这一句代码就可为一个UITableViwe/UICollectionView集成空白页面占位图。<br>`self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];`
#### 注意点:
#### 1.除UITableViwe/UICollectionView外这些View(包括UIScrollView)没有DataSource代码层面无法判断有无数据需手动管理显示隐藏调用示例请移步示例8
| 特点 | 描述 |
| ---------- | -----------|
| 与项目完全解耦 | 在需要集成的界面中加入一行代码即可集成,与原代码没有一点耦合度 |
| 0学习成本 | 无需关心视图的显示隐藏时机只需加入一行代码即可框架监听了系统刷新UI的方法其内部计算后自动进行显示隐藏 |
| 调用简单 | 利用分类+runtime使调用非常简便 |
| 高度自定义   | 利用继承特性,可对框架进行二次封装,使自定义更简便 |
| 支持全部的刷新方法 | reload...、insert...、delete...等方法。你的项目中调用这些刷新方法时该框架都会自动根据DataSource自动进行计算判断是否显示emptyView |
# 目录
* [一、效果展示](#效果展示)<br>
* [二、集成方式](#集成方式)<br>
* [三、使用参考示例](#使用参考示例)<br>
* [1.一行代码集成空内容视图](#一行代码集成空内容视图)<br>
* [2.自由选择空内容元素](#自由选择空内容元素)<br>
* [3.自定义空内容元素](#自定义空内容元素)<br>
* [4.自定义元素的UI样式](#自定义元素的UI样式)<br>
* [5.二次封装](#二次封装)<br>
* [6.延迟显示emptyView](#延迟显示emptyView)<br>
* [7.特殊需求手动控制emptyView的显示隐藏](#特殊需求手动控制emptyView的显示隐藏)<br>
* [8.普通view调用示例](#普通view调用示例)<br>
* [9.占位图完全覆盖父视图](#占位图完全覆盖父视图)<br>
## <a id="效果展示"></a>一、效果展示
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/ImitateOtherApp.png)
## <a id="集成方式"></a>二、集成方式
1.Cocoapods方式集成: `pod 'LYEmptyView'`<br>
使用时导入头文件 `#import <LYEmptyView/LYEmptyViewHeader.h>`
<br><br>
2.手动下载集成: 将LYEmptyView文件夹导入你的工程<br>
使用时导入头文件:`#import "LYEmptyViewHeader.h"`
## <a id="使用参考示例"></a>三、使用参考示例
### <a id="一行代码集成空内容视图"></a>1.一行代码集成空内容视图
```Objective-C
//框架方法
self.tableView.ly_emptyView = [LYEmptyView emptyViewWithImageStr:@"noData"
titleStr:@"暂无数据,点击重新加载"
detailStr:@""];
```
PS:可对库进行二次封装调用更简洁二次封装方法在下面的示例5中会讲到
```Objective-C
//二次封装方法,调用简洁
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
```
完全低耦合,在你的项目中加入这一行代码就可集成<br>
不管项目中是reloadData方法刷UI还是insert、delete等方式刷UI,不需做其他任何操作,只需这一行代码就可实现以下效果
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/example1.gif)
### <a id="自由选择空内容元素"></a>2.自由选择空内容元素
```Objective-C
交互事件可选择SEL或block方式
self.tableView.ly_emptyView = [LYEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
target:target
action:action];
self.tableView.ly_emptyView = [LYEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@""
detailStr:@""
btnTitleStr:@""
btnClickBlock:^{}];
// imageStr   : 占位图片
// titleStr   : 标题
// detailStr   : 详细描述
// btnTitleStr : 按钮标题
```
框架提供四个元素传入相应元素的字符串即可显示对应元素按钮的显示前提是传入targetaction或btnClickBlock
可根据项目需求,自由进行组合,如下只展示了部分组合效果
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/example2.png)
### <a id="自定义空内容元素"></a>3.自定义空内容元素
特殊情况下,如果空内容状态布局不满足需求时,可进行自定义<br>
通过方法` + (instancetype)emptyViewWithCustomView:(UIView *)customView;`<br>
传入一个View 即可创建一个自定义的emptyView
```Objective-C
self.tableView.ly_emptyView = [LYEmptyView emptyViewWithCustomView:customView];
```
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/example3.png)
### <a id="自定义元素的UI样式"></a>4.自定义元素的UI样式
这里自定义UI样式需要很多代码别担心在示例5中会讲解二次封装的方式封装后调用时就只需要一行代码了 ^_^
```Objective-C
//初始化一个emptyView
LYEmptyView *emptyView = [LYEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
btnClickBlock:^{}];
//元素竖直方向的间距
emptyView.subViewMargin = 20.f;
//标题颜色
emptyView.titleLabTextColor = MainColor(90, 180, 160);
//描述字体
emptyView.detailLabFont = [UIFont systemFontOfSize:17];
//按钮背景色
emptyView.actionBtnBackGroundColor = MainColor(90, 180, 160);
//设置空内容占位图
self.tableView.ly_emptyView = emptyView;
```
>这里只列举了一些常用的属性更多属性请到LYEmptyView.h查看
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/example4.png)
### <a id="二次封装"></a>5.二次封装
第4小节的示例代码修改emptyView的样式需要一个个属性单独去改如果项目中每个界面都这么写就显得很麻烦而且不易维护<br>
解决办法是对库进行二次封装二次封装后对UI样式单独管理方便维护<br>
##### 1)新建一个类继承自LYEmptyView例如demo中的MyDIYEmpty
##### 2)重写`- (void)prepare` 方法并修改想要改变的元素的UI样式
```Objective-C
- (void)prepare{
[super prepare];
self.titleLabFont = [UIFont systemFontOfSize:25];
self.titleLabTextColor = MainColor(90, 180, 160);
self.detailLabFont = [UIFont systemFontOfSize:17];
self.detailLabTextColor = MainColor(180, 120, 90);
self.detailLabMaxLines = 5;
self.actionBtnBackGroundColor = MainColor(90, 180, 160);
self.actionBtnTitleColor = [UIColor whiteColor];
}
```
操作上面的两步就可实现对样式的单独管理<br>
调用方法不变只是调用的类变成了MYDiyEmpty
```Objective-C
self.tableView.ly_emptyView = [MyDIYEmpty emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
                                                       btnClickBlock:^{}];
```
##### 3)进一步封装显示的元素内容,比如无数据状态图、无网络状态图<br>
在MyDIYEmpty.h定义方法`+ (instancetype)diyNoDataEmpty;`<br>
在MyDIYEmpty.m实现方法
```Objective-C
+ (instancetype)diyNoDataEmpty{
return [MyDIYEmpty emptyViewWithImageStr:@"nodata"
titleStr:@"暂无数据"
detailStr:@"请检查您的网络连接是否正确!"];
}
```
>经过3步封装自定义了UI样式使管理更方便使调用更简洁<br>
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
### <a id="延迟显示emptyView"></a>6.延迟显示emptyView
如示例1图框架自动根据DataSource计算是否显示emptyView在空页面发起网络请求时DataSource肯定为空会自动显示emptyView有的产品需求可能不希望这样希望发起请求时暂时隐藏emptyView。
本框架提供了两个方法可实现此需求两个方法都是scrollView的分类调用非常方便
```Objective-C
/**
一般用于开始请求网络时调用ly_startLoading调用时会暂时隐藏emptyView
当调用ly_endLoading方法时ly_endLoading方法内部会根据当前的tableView/collectionView的
DataSource来自动判断是否显示emptyView
*/
- (void)ly_startLoading;
/**
在想要刷新emptyView状态时调用
注意:ly_endLoading 的调用时机有刷新UI的地方一定要等到刷新UI的方法之后调用
因为只有刷新了UIview的DataSource才会更新故调用此方法才能正确判断是否有内容。
*/
- (void)ly_endLoading;
```
*注意点:使用这两个方法请先将emptyView的autoShowEmptyView属性置为NO关闭自动显隐
以下是调用示例具体细节可参看demo中的demo2
```Objective-C
//1.先设置样式
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.关闭自动显隐(此步可封装进自定义类中,相关调用就可省去这步)
self.tableView.ly_emptyView.autoShowEmptyView = NO;
//3.网络请求时调用
[self.tableView ly_startLoading];
//4.刷新UI时调用保证在刷新UI后调用
[self.tableView ly_endLoading];
```
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/example6.gif)
### <a id="特殊需求手动控制emptyView的显示隐藏"></a>7.特殊需求手动控制emptyView的显示隐藏
在某些特殊界面下有的tableView/collectionView有固定的一些死数据其它的数据根据网络加载这时根据以上的示例方法可能达不到这需求。<br>
本框架提供另外的两个方法来解决这个问题。
```Objective-C
/**
手动调用显示emptyView
*/
- (void)ly_showEmptyView;
/**
手动调用隐藏emptyView
*/
- (void)ly_hideEmptyView;
```
*注意点:使用这两个方法请先将emptyView的autoShowEmptyView属性置为NO关闭自动显隐
以下是调用示例具体细节可参看demo中的demo4
```Objective-C
//1.先设置样式
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.关闭自动显隐(此步可封装进自定义类中,相关调用就可省去这步)
self.tableView.ly_emptyView.autoShowEmptyView = NO;
//3.显示emptyView
[self.tableView ly_showEmptyView];
//4.隐藏emptyView
[self.tableView ly_hideEmptyView];
```
![](https://github.com/dev-liyang/LYEmptyView/blob/master/images/example7.gif)
### <a id="普通view调用示例"></a>8.普通view调用示例
因普通view(包括scrollView)没有DataSource代码层面无法判断view上有无数据所以view想要实现占位图
还需通过两个方法来手动控制emptyView的显示和隐藏。
以下是调用示例
```Objective-C
//1.先设置样式
self.view.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.显示emptyView
[self.view ly_showEmptyView];
//3.隐藏emptyView
[self.view ly_hideEmptyView];
```
### <a id="占位图完全覆盖父视图"></a>9.占位图完全覆盖父视图
每个项目需求不同有的占位图内容多大占位图就多大这种情况是默认的不用设置属性。而有的占位图想要和父视图一样大以达到覆盖住父视图的目的这种情况下将LYEmptyView的emptyViewIsCompleteCoverSuperView属性值设置为YES即可。
```Objective-C
DemoEmptyView *emptyView = [DemoEmptyView diyEmptyView];
emptyView.emptyViewIsCompleteCoverSuperView = YES;//完全覆盖父视图,背景色默认为浅白色,可自行设置
//emptyView.backgroundColor = [UIColor redColor];//自己设置背景色为红色此设置也可封装到公共的地方DemoEmptyView就不用每次都单独设置了
self.tableView.ly_emptyView = emptyView;
```
## 更新记录
### 2019-08-16 (pod V1.3.0)
* 1.detailLab添加行间距属性
* 2.每个子控件可单独设置间距
* 3.actionBtn添加渐变背景颜色属性
* 4.更改添加emptyView时其显隐的逻辑
### 2019-07-04 (pod V1.2.5)
* 1.新增属性:按钮宽度actionBtnWidth
* 2.修改属性默认值:按钮的圆角actionBtnCornerRadius默认改为0
### 2019-06-18 (pod V1.2.4)
* 1.将点击重试事件加到emptyView上当设置empty完全覆盖父视图时就可实现点击屏幕重试的效果
* 2.swift项目中imageNamed:方法string为nil时崩溃解决
### 2018-12-04 (pod V1.2.3)
* 1.fix bug当子控件的文字被设置为空并再次设置为非空时, 子控件无法正常显示
* 2.新增属性ignoreContentInset是否忽略scrollView的contentInset
### 2018-09-11 (pod V1.2.2)
* 新增构造方法具体请查看LYEmptyBaseView.h
### 2018-08-22 (pod V1.2.1)
* 大神的建议不要手动调用layoutSubviews。优化baseView里setter方法调用的重绘机制使用setNeedsLayout更加优美
### 2018-07-31 (pod V1.2.0)
* 新增属性emptyViewIsCompleteCoverSuperView, 占位图是否完全覆盖父视图
### 2018-05-11 (pod V1.1.0)
* 新增普通View可设置占位图实现所有的View都能集成占位图
### 2018-03-26 (pod V1.0.3)
* 添加reloadSections、reloadRows、reloadItems 等方法的监听
* emptyBaseView setter 方法bug fix
### 2018-02-09 (pod V1.0.2)
* 解决只是在导入本框架的情况下导致UIScrollView上的内容不显示的bug
## 技术交流
本人QQ:944801216<br>
技术交流群:818290484<br>
大家有任何的问题和建议,可以联系我,我一定尽力为大家解决问题,也可以进群和大家一起交流。

8
Pods/Manifest.lock generated
View File

@@ -29,6 +29,7 @@ PODS:
- LSTPopView/Code (0.3.10):
- LSTTimer
- LSTTimer (0.2.10)
- LYEmptyView (1.3.1)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.4.2)
@@ -43,10 +44,11 @@ DEPENDENCIES:
- DZNEmptyDataSet (= 1.8.1)
- FLAnimatedImage (~> 1.0.17)
- HWPanModal (~> 0.9.9)
- JXCategoryView
- JXCategoryView (~> 1.6.8)
- JXPagingView/Pager (~> 2.1.3)
- LookinServer
- LSTPopView (~> 0.3.10)
- LYEmptyView
- Masonry (= 1.1.0)
- MBProgressHUD (= 1.2.0)
- MJExtension (= 3.4.2)
@@ -65,6 +67,7 @@ SPEC REPOS:
- LookinServer
- LSTPopView
- LSTTimer
- LYEmptyView
- Masonry
- MBProgressHUD
- MJExtension
@@ -82,12 +85,13 @@ SPEC CHECKSUMS:
LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80
LSTPopView: 9379f00f6ce7d1fc620b50ab00ed3ef97b2d4d52
LSTTimer: caf8f02ff366ca175cf4c1778d26c166183c1b6f
LYEmptyView: b6d418cfa38b78df0cf243f9a9c25ccbdc399922
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: f29024626962457f3470184232766516dee8dfea
PODFILE CHECKSUM: ce689000a7b9b24f5d74cc50a93350665c3af035
PODFILE CHECKSUM: e5e2037c9180ed40ba4a0e264e837eaf839ca6b2
COCOAPODS: 1.16.2

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4AA4C7BB776C55F3421BA137B643DD64"
BuildableName = "LYEmptyView.framework"
BlueprintName = "LYEmptyView"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>${PODS_DEVELOPMENT_LANGUAGE}</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.3.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_LYEmptyView : NSObject
@end
@implementation PodsDummy_LYEmptyView
@end

View File

@@ -0,0 +1,12 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

View File

@@ -0,0 +1,21 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
#import "LYEmptyBaseView.h"
#import "LYEmptyView.h"
#import "LYEmptyViewHeader.h"
#import "UIView+Empty.h"
#import "UIView+LYExtension.h"
FOUNDATION_EXPORT double LYEmptyViewVersionNumber;
FOUNDATION_EXPORT const unsigned char LYEmptyViewVersionString[];

View File

@@ -0,0 +1,12 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/LYEmptyView
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View File

@@ -0,0 +1,6 @@
framework module LYEmptyView {
umbrella header "LYEmptyView-umbrella.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,12 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/LYEmptyView
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View File

@@ -183,6 +183,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
## LYEmptyView
MIT License
Copyright (c) 2017 yang
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.
## LookinServer
MIT License

View File

@@ -246,6 +246,37 @@ THE SOFTWARE.
<key>FooterText</key>
<string>MIT License
Copyright (c) 2017 yang
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.
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>LYEmptyView</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>MIT License
Copyright (c) [2023] [LI KAI]
Permission is hereby granted, free of charge, to any person obtaining a copy

View File

@@ -7,6 +7,7 @@ ${BUILT_PRODUCTS_DIR}/JXCategoryView/JXCategoryView.framework
${BUILT_PRODUCTS_DIR}/JXPagingView/JXPagingView.framework
${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework
${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.framework
${BUILT_PRODUCTS_DIR}/LYEmptyView/LYEmptyView.framework
${BUILT_PRODUCTS_DIR}/LookinServer/LookinServer.framework
${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework

View File

@@ -6,6 +6,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXCategoryView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXPagingView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTPopView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTTimer.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LYEmptyView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LookinServer.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MBProgressHUD.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework

View File

@@ -7,6 +7,7 @@ ${BUILT_PRODUCTS_DIR}/JXCategoryView/JXCategoryView.framework
${BUILT_PRODUCTS_DIR}/JXPagingView/JXPagingView.framework
${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework
${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.framework
${BUILT_PRODUCTS_DIR}/LYEmptyView/LYEmptyView.framework
${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework

View File

@@ -6,6 +6,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXCategoryView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXPagingView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTPopView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTTimer.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LYEmptyView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MBProgressHUD.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework

View File

@@ -184,6 +184,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/JXPagingView/JXPagingView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LYEmptyView/LYEmptyView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LookinServer/LookinServer.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework"
@@ -200,6 +201,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/JXPagingView/JXPagingView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LYEmptyView/LYEmptyView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"

View File

@@ -1,10 +1,10 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "${PODS_CONFIGURATION_BUILD_DIR}/LookinServer" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage"
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView" "${PODS_CONFIGURATION_BUILD_DIR}/LookinServer" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal/HWPanModal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView/JXCategoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView/LSTPopView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer/LSTTimer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LookinServer/LookinServer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers"
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal/HWPanModal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView/JXCategoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView/LSTPopView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer/LSTTimer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView/LYEmptyView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LookinServer/LookinServer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "CoreGraphics" -framework "DZNEmptyDataSet" -framework "FLAnimatedImage" -framework "Foundation" -framework "HWPanModal" -framework "ImageIO" -framework "JXCategoryView" -framework "JXPagingView" -framework "LSTPopView" -framework "LSTTimer" -framework "LookinServer" -framework "MBProgressHUD" -framework "MJExtension" -framework "MJRefresh" -framework "Masonry" -framework "QuartzCore" -framework "SDWebImage" -framework "UIKit"
OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "-F${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "-F${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "-F${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "-F${PODS_CONFIGURATION_BUILD_DIR}/LookinServer" "-F${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "-F${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage"
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "CoreGraphics" -framework "DZNEmptyDataSet" -framework "FLAnimatedImage" -framework "Foundation" -framework "HWPanModal" -framework "ImageIO" -framework "JXCategoryView" -framework "JXPagingView" -framework "LSTPopView" -framework "LSTTimer" -framework "LYEmptyView" -framework "LookinServer" -framework "MBProgressHUD" -framework "MJExtension" -framework "MJRefresh" -framework "Masonry" -framework "QuartzCore" -framework "SDWebImage" -framework "UIKit"
OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "-F${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "-F${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "-F${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "-F${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LookinServer" "-F${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "-F${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.

View File

@@ -1,10 +1,10 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_ROOT}/Bugly"
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_ROOT}/Bugly"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal/HWPanModal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView/JXCategoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView/LSTPopView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer/LSTTimer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers"
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal/HWPanModal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView/JXCategoryView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView/LSTPopView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer/LSTTimer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView/LYEmptyView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "CoreGraphics" -framework "DZNEmptyDataSet" -framework "FLAnimatedImage" -framework "Foundation" -framework "HWPanModal" -framework "ImageIO" -framework "JXCategoryView" -framework "JXPagingView" -framework "LSTPopView" -framework "LSTTimer" -framework "MBProgressHUD" -framework "MJExtension" -framework "MJRefresh" -framework "Masonry" -framework "QuartzCore" -framework "SDWebImage" -framework "Security" -framework "SystemConfiguration" -framework "UIKit"
OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "-F${PODS_CONFIGURATION_BUILD_DIR}/Bugly" "-F${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "-F${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "-F${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "-F${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "-F${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage"
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "CoreGraphics" -framework "DZNEmptyDataSet" -framework "FLAnimatedImage" -framework "Foundation" -framework "HWPanModal" -framework "ImageIO" -framework "JXCategoryView" -framework "JXPagingView" -framework "LSTPopView" -framework "LSTTimer" -framework "LYEmptyView" -framework "MBProgressHUD" -framework "MJExtension" -framework "MJRefresh" -framework "Masonry" -framework "QuartzCore" -framework "SDWebImage" -framework "Security" -framework "SystemConfiguration" -framework "UIKit"
OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "-F${PODS_CONFIGURATION_BUILD_DIR}/Bugly" "-F${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "-F${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "-F${PODS_CONFIGURATION_BUILD_DIR}/HWPanModal" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXCategoryView" "-F${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView" "-F${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer" "-F${PODS_CONFIGURATION_BUILD_DIR}/LYEmptyView" "-F${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "-F${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.

View File

@@ -70,6 +70,8 @@
048908EF2EBF861800FABA60 /* KBSkinSectionTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908EE2EBF861800FABA60 /* KBSkinSectionTitleCell.m */; };
048908F22EC047FD00FABA60 /* KBShopHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908F12EC047FD00FABA60 /* KBShopHeadView.m */; };
048908F52EC0496400FABA60 /* KBShopItemVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908F42EC0496400FABA60 /* KBShopItemVC.m */; };
048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */; };
048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */; };
04A9FE0F2EB481100020DB6D /* KBHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC97082EB31B14007BD342 /* KBHUD.m */; };
04A9FE132EB4D0D20020DB6D /* KBFullAccessManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04A9FE112EB4D0D20020DB6D /* KBFullAccessManager.m */; };
04A9FE162EB873C80020DB6D /* UIViewController+Extension.m in Sources */ = {isa = PBXBuildFile; fileRef = 04A9FE152EB873C80020DB6D /* UIViewController+Extension.m */; };
@@ -124,8 +126,6 @@
A1B2E1012EBC7AAA00000001 /* KBTopThreeView.m in Sources */ = {isa = PBXBuildFile; fileRef = A1B2E0022EBC7AAA00000001 /* KBTopThreeView.m */; };
A1B2E1022EBC7AAA00000001 /* HomeHotCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A1B2E0042EBC7AAA00000001 /* HomeHotCell.m */; };
ECC9EE02174D86E8D792472F /* Pods_keyBoard.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 967065BB5230E43F293B3AF9 /* Pods_keyBoard.framework */; };
048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */; };
048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -250,6 +250,10 @@
048908F12EC047FD00FABA60 /* KBShopHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBShopHeadView.m; sourceTree = "<group>"; };
048908F32EC0496400FABA60 /* KBShopItemVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBShopItemVC.h; sourceTree = "<group>"; };
048908F42EC0496400FABA60 /* KBShopItemVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBShopItemVC.m; sourceTree = "<group>"; };
048909F02EC0AAAA00FABA60 /* KBCategoryTitleCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleCell.h; sourceTree = "<group>"; };
048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleCell.m; sourceTree = "<group>"; };
048909F22EC0AAAA00FABA60 /* KBCategoryTitleView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleView.h; sourceTree = "<group>"; };
048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleView.m; sourceTree = "<group>"; };
04A9A67D2EB9E1690023B8F4 /* KBResponderUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBResponderUtils.h; sourceTree = "<group>"; };
04A9FE102EB4D0D20020DB6D /* KBFullAccessManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBFullAccessManager.h; sourceTree = "<group>"; };
04A9FE112EB4D0D20020DB6D /* KBFullAccessManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBFullAccessManager.m; sourceTree = "<group>"; };
@@ -355,10 +359,6 @@
B12EC429812407B9F0E67565 /* Pods-CustomKeyboard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomKeyboard.release.xcconfig"; path = "Target Support Files/Pods-CustomKeyboard/Pods-CustomKeyboard.release.xcconfig"; sourceTree = "<group>"; };
B8CA018AB878499327504AAD /* Pods-CustomKeyboard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomKeyboard.debug.xcconfig"; path = "Target Support Files/Pods-CustomKeyboard/Pods-CustomKeyboard.debug.xcconfig"; sourceTree = "<group>"; };
F67DDBD716E4E616D8CC2C9C /* Pods-keyBoard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-keyBoard.debug.xcconfig"; path = "Target Support Files/Pods-keyBoard/Pods-keyBoard.debug.xcconfig"; sourceTree = "<group>"; };
048909F02EC0AAAA00FABA60 /* KBCategoryTitleCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleCell.h; sourceTree = "<group>"; };
048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleCell.m; sourceTree = "<group>"; };
048909F22EC0AAAA00FABA60 /* KBCategoryTitleView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleView.h; sourceTree = "<group>"; };
048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleView.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -496,10 +496,10 @@
children = (
048908F02EC047FD00FABA60 /* KBShopHeadView.h */,
048908F12EC047FD00FABA60 /* KBShopHeadView.m */,
048909F02EC0AAAA00FABA60 /* KBCategoryTitleCell.h */,
048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */,
048909F22EC0AAAA00FABA60 /* KBCategoryTitleView.h */,
048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */,
048909F02EC0AAAA00FABA60 /* KBCategoryTitleCell.h */,
048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */,
048909F22EC0AAAA00FABA60 /* KBCategoryTitleView.h */,
048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */,
);
path = V;
sourceTree = "<group>";
@@ -1239,14 +1239,10 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh\"\n";
@@ -1308,8 +1304,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */,
048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */,
048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */,
048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */,
04FC95E92EB23B67007BD342 /* KBNetworkManager.m in Sources */,
04FC95D22EB1E7AE007BD342 /* MyVC.m in Sources */,
047C65582EBCC06D0035E841 /* HomeRankCardCell.m in Sources */,