This commit is contained in:
2025-11-06 13:18:27 +08:00
parent abf32e8457
commit d7874829d9
48 changed files with 6952 additions and 2389 deletions

View File

@@ -8,15 +8,16 @@ target 'keyBoard' do
pod 'AFNetworking','4.0.1'
pod 'Bugly', :configurations => ['Release']
pod 'DZNEmptyDataSet', '1.8.1'
pod 'FLAnimatedImage', '~> 1.0.17'
pod 'HWPanModal', '~> 0.9.9'
pod 'LSTPopView', '~> 0.3.10'
pod 'LookinServer', :configurations => ['Debug']
pod 'Masonry', '1.1.0'
pod 'MBProgressHUD', '1.2.0'
pod 'MJExtension', '3.4.2'
pod 'MJRefresh', '3.7.9'
pod 'SDWebImage', '5.21.1'
pod 'DZNEmptyDataSet', '1.8.1'
pod 'HWPanModal', '~> 0.9.9'
pod 'FLAnimatedImage', '~> 1.0.17'
pod 'LookinServer', :configurations => ['Debug']
end
target 'CustomKeyboard' do

View File

@@ -21,6 +21,12 @@ PODS:
- LookinServer (1.2.8):
- LookinServer/Core (= 1.2.8)
- LookinServer/Core (1.2.8)
- LSTPopView (0.3.10):
- LSTPopView/Code (= 0.3.10)
- LSTTimer
- LSTPopView/Code (0.3.10):
- LSTTimer
- LSTTimer (0.2.10)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.4.2)
@@ -36,6 +42,7 @@ DEPENDENCIES:
- FLAnimatedImage (~> 1.0.17)
- HWPanModal (~> 0.9.9)
- LookinServer
- LSTPopView (~> 0.3.10)
- Masonry (= 1.1.0)
- MBProgressHUD (= 1.2.0)
- MJExtension (= 3.4.2)
@@ -50,6 +57,8 @@ SPEC REPOS:
- FLAnimatedImage
- HWPanModal
- LookinServer
- LSTPopView
- LSTTimer
- Masonry
- MBProgressHUD
- MJExtension
@@ -63,12 +72,14 @@ SPEC CHECKSUMS:
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2
LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80
LSTPopView: 9379f00f6ce7d1fc620b50ab00ed3ef97b2d4d52
LSTTimer: caf8f02ff366ca175cf4c1778d26c166183c1b6f
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: f29024626962457f3470184232766516dee8dfea
PODFILE CHECKSUM: c407e365492f78edcfea5c78b0fb36d8bf0e447d
PODFILE CHECKSUM: c50284c86c4e30cee59c186e48767667019dcb61
COCOAPODS: 1.16.2

19
Pods/LSTPopView/LICENSE generated Normal file
View File

@@ -0,0 +1,19 @@
Copyright (c) 2020 490790096@qq.com <LoSenTrad@163.com>
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,231 @@
//
// LSTPopView.h
// LoSenTrad
//
// Created by LoSenTrad on 2020/2/22.
//
/**
联系方式---> QQ群: 1045568246 微信: a_LSTKit , 邮箱: losentrad@163.com 欢迎反馈建议和问题
博客地址 如果觉得好用 伸出你的小指头 点Star 点赞 点收藏! 就是给予我最大的支持!
github: https://github.com/LoSenTrad/LSTPopView
简书: https://www.jianshu.com/p/8023a85dc2a2
cocoachina: http://www.cocoachina.com/articles/899060
*/
#import <UIKit/UIKit.h>
#import "LSTPopViewProtocol.h"
#import "UIView+LSTPV.h"
#define LSTPopViewWK(object) __weak typeof(object) wk_##object = object;
#define LSTPopViewSS(object) __strong typeof(object) object = weak##object;
NS_ASSUME_NONNULL_BEGIN
@interface LSTPopView : UIView
/** 代理 支持多代理 */
@property (nonatomic, weak) id<LSTPopViewProtocol> _Nullable delegate;
/** 标识 默认为空 */
@property (nonatomic, copy) NSString *_Nullable identifier;
/** 弹窗容器 */
@property (nonatomic, readonly) UIView *parentView;
/** 自定义view */
@property (nonatomic, readonly) UIView *currCustomView;
/** 弹窗位置 默认LSTHemStyleCenter */
@property (nonatomic, assign) LSTHemStyle hemStyle;
/** 显示时动画弹窗样式 默认LSTPopStyleNO */
@property (nonatomic, assign) LSTPopStyle popStyle;
/** 移除时动画弹窗样式 默认LSTDismissStyleNO */
@property (nonatomic, assign) LSTDismissStyle dismissStyle;
/** 显示时动画时长,> 0。不设置则使用默认的动画时长 设置成LSTPopStyleNO, 该属性无效 */
@property (nonatomic, assign) NSTimeInterval popDuration;
/** 隐藏时动画时长,>0。不设置则使用默认的动画时长 设置成LSTDismissStyleNO, 该属性无效 */
@property (nonatomic, assign) NSTimeInterval dismissDuration;
/** 弹窗水平方向(X)偏移量校准 默认0 */
@property (nonatomic, assign) CGFloat adjustX;
/** 弹窗垂直方向(Y)偏移量校准 默认0 */
@property (nonatomic, assign) CGFloat adjustY;
/** 背景颜色 默认rgb(0,0,0) 透明度0.3 */
@property (nullable,nonatomic,strong) UIColor *bgColor;
/** 显示时背景的透明度,取值(0.0~1.0)默认为0.3 */
@property (nonatomic, assign) CGFloat bgAlpha;
/** 是否隐藏背景 默认NO */
@property (nonatomic, assign) BOOL isHideBg;
/** 显示时点击背景是否移除弹窗默认为NO。 */
@property (nonatomic, assign) BOOL isClickBgDismiss;
/** 是否监听屏幕旋转默认为YES */
@property (nonatomic, assign) BOOL isObserverScreenRotation;
/** 是否支持点击回馈 默认NO (暂时关闭) */
@property (nonatomic, assign) BOOL isClickFeedback;
/** 是否规避键盘 默认YES */
@property (nonatomic, assign) BOOL isAvoidKeyboard;
/** 弹窗和键盘的距离 默认10 */
@property (nonatomic, assign) CGFloat avoidKeyboardSpace;
/** 显示多长时间 默认0 不会消失 */
@property (nonatomic, assign) NSTimeInterval showTime;
/** 自定view圆角方向设置 默认UIRectCornerAllCorners 当cornerRadius>0时生效*/
@property (nonatomic, assign) UIRectCorner rectCorners;
/** 自定义view圆角大小 */
@property (nonatomic, assign) CGFloat cornerRadius;
/** 弹出震动反馈 默认NO iOS10+ 系统才有此效果 */
@property (nonatomic, assign) BOOL isImpactFeedback;
//************ 群组相关属性 ****************
/** 群组标识 统一给弹窗编队 方便独立管理 默认为nil,统一全局处理 */
@property (nullable,nonatomic,strong) NSString *groupId;
/** 是否堆叠 默认NO 如果是YES priority优先级不生效*/
@property (nonatomic,assign) BOOL isStack;
/** 单显示 默认NO 只会显示优先级最高的popView */
@property (nonatomic, assign) BOOL isSingle;
/** 优先级 范围0~1000 (默认0,遵循先进先出) isStack和isSingle为NO的时候生效 */
@property (nonatomic, assign) CGFloat priority;
//****************************************
//************ 拖拽手势相关属性 ****************
/** 拖拽方向 默认 不可拖拽 */
@property (nonatomic, assign) LSTDragStyle dragStyle;
/** X轴或者Y轴拖拽移除临界距离 范围(0 ~ +∞) 默认0 不拖拽移除 基使用于dragStyle */
@property (nonatomic, assign) CGFloat dragDistance;
/** 拖拽移除动画类型 默认同dismissStyle */
@property (nonatomic, assign) LSTDismissStyle dragDismissStyle;
/** 拖拽消失动画时间 默认同 dismissDuration */
@property (nonatomic, assign) NSTimeInterval dragDismissDuration;
/** 拖拽复原动画时间 默认0.25s */
@property (nonatomic, assign) NSTimeInterval dragReboundTime;
/** 轻扫方向 默认 不可轻扫 前提开启dragStyle */
@property (nonatomic, assign) LSTSweepStyle sweepStyle;
/** 轻扫速率 控制轻扫移除 默认1000 基于使用sweepStyle */
@property (nonatomic, assign) CGFloat swipeVelocity;
/** 轻扫移除的动画 默认LSTSweepDismissStyleVelocity */
@property (nonatomic, assign) LSTSweepDismissStyle sweepDismissStyle;
//@property (nonatomic, strong) NSArray *xDragDistances;//待计划
//@property (nonatomic, strong) NSArray *yDragDistances;//待计划
//****************************************
/** 点击背景 */
@property (nullable, nonatomic, copy) void(^bgClickBlock)(void);
/** 长按背景 */
@property (nullable, nonatomic, copy) void(^bgLongPressBlock)(void);
/** 弹窗pan手势偏移量 */
@property (nullable, nonatomic, copy) void(^panOffsetBlock)(CGPoint offset);
//以下键盘弹出/收起 第三方键盘会多次回调(百度,搜狗测试得出), 原生键盘回调一次
/** 键盘将要弹出 */
@property (nullable, nonatomic, copy) void(^keyboardWillShowBlock)(void);
/** 键盘弹出完毕 */
@property (nullable, nonatomic, copy) void(^keyboardDidShowBlock)(void);
/** 键盘frame将要改变 */
@property (nullable, nonatomic, copy) void(^keyboardFrameWillChangeBlock)(CGRect beginFrame,CGRect endFrame,CGFloat duration);
/** 键盘frame改变完毕 */
@property (nullable, nonatomic, copy) void(^keyboardFrameDidChangeBlock)(CGRect beginFrame,CGRect endFrame,CGFloat duration);
/** 键盘将要收起 */
@property (nullable, nonatomic, copy) void(^keyboardWillHideBlock)(void);
/** 键盘收起完毕 */
@property (nullable, nonatomic, copy) void(^keyboardDidHideBlock)(void);
//************ 生命周期回调(Block) ************
/** 将要显示 回调 */
@property (nullable, nonatomic, copy) void(^popViewWillPopBlock)(void);
/** 已经显示完毕 回调 */
@property (nullable, nonatomic, copy) void(^popViewDidPopBlock)(void);
/** 将要开始移除 回调 */
@property (nullable, nonatomic, copy) void(^popViewWillDismissBlock)(void);
/** 已经移除完毕 回调 */
@property (nullable, nonatomic, copy) void(^popViewDidDismissBlock)(void);
/** 倒计时 回调 */
@property (nullable, nonatomic, copy) void(^popViewCountDownBlock)(LSTPopView *popView,NSTimeInterval timeInterval);
//********************************************
/*
以下是构建方法
customView: 已定义view
popStyle: 弹出动画
dismissStyle: 移除动画
parentView: 弹窗父容器
*/
+ (nullable instancetype)initWithCustomView:(UIView *_Nonnull)customView;
+ (nullable instancetype)initWithCustomView:(UIView *)customView
popStyle:(LSTPopStyle)popStyle
dismissStyle:(LSTDismissStyle)dismissStyle;
+ (nullable instancetype)initWithCustomView:(UIView *)customView
parentView:(UIView *_Nullable)parentView
popStyle:(LSTPopStyle)popStyle
dismissStyle:(LSTDismissStyle)dismissStyle;
/*
以下是弹出方法
popStyle: 弹出动画 优先级大于全局的popStyle 局部起作用
duration: 弹出时间 优先级大于全局的popDuration 局部起作用
*/
- (void)pop;
- (void)popWithStyle:(LSTPopStyle)popStyle;
- (void)popWithDuration:(NSTimeInterval)duration;
- (void)popWithStyle:(LSTPopStyle)popStyle duration:(NSTimeInterval)duration;
/*
以下是弹出方法
dismissStyle: 弹出动画 优先级大于全局的dismissStyle 局部起作用
duration: 弹出时间 优先级大于全局的dismissDuration 局部起作用
*/
- (void)dismiss;
- (void)dismissWithStyle:(LSTDismissStyle)dismissStyle;
- (void)dismissWithDuration:(NSTimeInterval)duration;
- (void)dismissWithStyle:(LSTDismissStyle)dismissStyle duration:(NSTimeInterval)duration;
/** 删除指定代理 */
- (void)removeForDelegate:(id<LSTPopViewProtocol>)delegate;
/** 删除代理池 删除所有代理 */
- (void)removeAllDelegate;
#pragma mark - ***** 以下是 窗口管理api *****
/** 获取全局(整个app内)所有popView */
+ (NSArray *)getAllPopView;
/** 获取当前页面所有popView */
+ (NSArray *)getAllPopViewForParentView:(UIView *)parentView;
/** 获取当前页面指定编队的所有popView */
+ (NSArray *)getAllPopViewForPopView:(UIView *)popView;
/**
读取popView (有可能会跨编队读取弹窗)
建议使用getPopViewForGroupId:forkey: 方法进行精确读取
*/
+ (LSTPopView *)getPopViewForKey:(NSString *)key;
/** 移除popView */
+ (void)removePopView:(LSTPopView *)popView;
/**
移除popView 通过唯一key (有可能会跨编队误删弹窗)
建议使用removePopViewForGroupId:forkey: 方法进行精确删除
*/
+ (void)removePopViewForKey:(NSString *)key;
/** 移除所有popView */
+ (void)removeAllPopView;
/** 移除 最后一个弹出的 popView */
+ (void)removeLastPopView;
/** 开启调试view 建议设置成 线上隐藏 测试打开 */
+ (void)setLogStyle:(LSTPopViewLogStyle)logStyle;
@end
NS_ASSUME_NONNULL_END

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,143 @@
//
// LSTPopViewProtocol.h
// LSTCategory
//
// Created by LoSenTrad on 2020/5/30.
//
#import <Foundation/Foundation.h>
@class LSTPopView;
#ifdef DEBUG
#define LSTPVLog(format, ...) printf("class: <%p %s:(第%d行) > method: %s \n%s\n", self, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String] )
#else
#define LSTPVLog(format, ...)
#endif
/** 调试日志类型 */
typedef NS_ENUM(NSInteger, LSTPopViewLogStyle) {
LSTPopViewLogStyleNO = 0, // 关闭调试信息(窗口和控制台日志输出)
LSTPopViewLogStyleWindow, // 开启左上角小窗
LSTPopViewLogStyleConsole, // 开启控制台日志输出
LSTPopViewLogStyleALL // 开启小窗和控制台日志
};
/** 显示动画样式 */
typedef NS_ENUM(NSInteger, LSTPopStyle) {
LSTPopStyleFade = 0, // 默认 渐变出现
LSTPopStyleNO, // 无动画
LSTPopStyleScale, // 缩放 先放大 后恢复至原大小
LSTPopStyleSmoothFromTop, // 顶部 平滑淡入动画
LSTPopStyleSmoothFromLeft, // 左侧 平滑淡入动画
LSTPopStyleSmoothFromBottom, // 底部 平滑淡入动画
LSTPopStyleSmoothFromRight, // 右侧 平滑淡入动画
LSTPopStyleSpringFromTop, // 顶部 平滑淡入动画 带弹簧
LSTPopStyleSpringFromLeft, // 左侧 平滑淡入动画 带弹簧
LSTPopStyleSpringFromBottom, // 底部 平滑淡入动画 带弹簧
LSTPopStyleSpringFromRight, // 右侧 平滑淡入动画 带弹簧
LSTPopStyleCardDropFromLeft, // 顶部左侧 掉落动画
LSTPopStyleCardDropFromRight, // 顶部右侧 掉落动画
};
/** 消失动画样式 */
typedef NS_ENUM(NSInteger, LSTDismissStyle) {
LSTDismissStyleFade = 0, // 默认 渐变消失
LSTDismissStyleNO, // 无动画
LSTDismissStyleScale, // 缩放
LSTDismissStyleSmoothToTop, // 顶部 平滑淡出动画
LSTDismissStyleSmoothToLeft, // 左侧 平滑淡出动画
LSTDismissStyleSmoothToBottom, // 底部 平滑淡出动画
LSTDismissStyleSmoothToRight, // 右侧 平滑淡出动画
LSTDismissStyleCardDropToLeft, // 卡片从中间往左侧掉落
LSTDismissStyleCardDropToRight, // 卡片从中间往右侧掉落
LSTDismissStyleCardDropToTop, // 卡片从中间往顶部移动消失
};
/** 主动动画样式(开发中) */
typedef NS_ENUM(NSInteger, LSTActivityStyle) {
LSTActivityStyleNO = 0, /// 无动画
LSTActivityStyleScale, /// 缩放
LSTActivityStyleShake, /// 抖动
};
/** 弹窗位置 */
typedef NS_ENUM(NSInteger, LSTHemStyle) {
LSTHemStyleCenter = 0, //居中
LSTHemStyleTop, //贴顶
LSTHemStyleLeft, //贴左
LSTHemStyleBottom, //贴底
LSTHemStyleRight, //贴右
LSTHemStyleTopLeft, //贴顶和左
LSTHemStyleBottomLeft, //贴底和左
LSTHemStyleBottomRight, //贴底和右
LSTHemStyleTopRight //贴顶和右
};
/** 拖拽方向 */
typedef NS_ENUM(NSInteger, LSTDragStyle) {
LSTDragStyleNO = 0, //默认 不能拖拽窗口
LSTDragStyleX_Positive = 1<<0, //X轴正方向拖拽
LSTDragStyleX_Negative = 1<<1, //X轴负方向拖拽
LSTDragStyleY_Positive = 1<<2, //Y轴正方向拖拽
LSTDragStyleY_Negative = 1<<3, //Y轴负方向拖拽
LSTDragStyleX = (LSTDragStyleX_Positive|LSTDragStyleX_Negative), //X轴方向拖拽
LSTDragStyleY = (LSTDragStyleY_Positive|LSTDragStyleY_Negative), //Y轴方向拖拽
LSTDragStyleAll = (LSTDragStyleX|LSTDragStyleY) //全向拖拽
};
///** 可轻扫消失的方向 */
typedef NS_ENUM(NSInteger, LSTSweepStyle) {
LSTSweepStyleNO = 0, //默认 不能拖拽窗口
LSTSweepStyleX_Positive = 1<<0, //X轴正方向拖拽
LSTSweepStyleX_Negative = 1<<1, //X轴负方向拖拽
LSTSweepStyleY_Positive = 1<<2, //Y轴正方向拖拽
LSTSweepStyleY_Negative = 1<<3, //Y轴负方向拖拽
LSTSweepStyleX = (LSTSweepStyleX_Positive|LSTSweepStyleX_Negative), //X轴方向拖拽
LSTSweepStyleY = (LSTSweepStyleY_Positive|LSTSweepStyleY_Negative), //Y轴方向拖拽
LSTSweepStyleALL = (LSTSweepStyleX|LSTSweepStyleY) //全向轻扫
};
/**
可轻扫消失动画类型 对单向横扫 设置有效
LSTSweepDismissStyleSmooth: 自动适应选择以下其一
LSTDismissStyleSmoothToTop,
LSTDismissStyleSmoothToLeft,
LSTDismissStyleSmoothToBottom ,
LSTDismissStyleSmoothToRight
*/
typedef NS_ENUM(NSInteger, LSTSweepDismissStyle) {
LSTSweepDismissStyleVelocity = 0, //默认加速度 移除
LSTSweepDismissStyleSmooth = 1 //平顺移除
};
NS_ASSUME_NONNULL_BEGIN
@protocol LSTPopViewProtocol <NSObject>
/** 点击弹窗 回调 */
- (void)lst_PopViewBgClickForPopView:(LSTPopView *)popView;
/** 长按弹窗 回调 */
- (void)lst_PopViewBgLongPressForPopView:(LSTPopView *)popView;
// ****** 生命周期 ******
/** 将要显示 */
- (void)lst_PopViewWillPopForPopView:(LSTPopView *)popView;
/** 已经显示完毕 */
- (void)lst_PopViewDidPopForPopView:(LSTPopView *)popView;
/** 倒计时进行中 timeInterval:时长 */
- (void)lst_PopViewCountDownForPopView:(LSTPopView *)popView forCountDown:(NSTimeInterval)timeInterval;
/** 倒计时倒计时完成 */
- (void)lst_PopViewCountDownFinishForPopView:(LSTPopView *)popView;
/** 将要开始移除 */
- (void)lst_PopViewWillDismissForPopView:(LSTPopView *)popView;
/** 已经移除完毕 */
- (void)lst_PopViewDidDismissForPopView:(LSTPopView *)popView;
//***********************
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,49 @@
//
// UIView+LSTPV.h
// LSTPopView
//
// Created by LoSenTrad on 2020/11/30.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView (LSTPV)
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_X;
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_Y;
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_Width;
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_Height;
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_CenterX;
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_CenterY;
/** 获取/设置view的x坐标 */
@property (nonatomic, assign) CGFloat pv_Top;
/** 获取/设置view的左边坐标 */
@property (nonatomic, assign) CGFloat pv_Left;
/** 获取/设置view的底部坐标Y */
@property (nonatomic, assign) CGFloat pv_Bottom;
/** 获取/设置view的右边坐标 */
@property (nonatomic, assign) CGFloat pv_Right;
/** 获取/设置view的size */
@property (nonatomic, assign) CGSize pv_Size;
/** 是否是苹果X系列(刘海屏系列) */
BOOL pv_IsIphoneX_ALL(void);
/** 屏幕大小 */
CGSize pv_ScreenSize(void);
/** 屏幕宽度 */
CGFloat pv_ScreenWidth(void);
/** 屏幕高度 */
CGFloat pv_ScreenHeight(void);
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,148 @@
//
// UIView+LSTPV.m
// LSTPopView
//
// Created by LoSenTrad on 2020/11/30.
//
#import "UIView+LSTPV.h"
@implementation UIView (LSTPV)
- (void)setPv_X:(CGFloat)pv_X {
CGRect frame = self.frame;
frame.origin.x = pv_X;
self.frame = frame;
}
- (CGFloat)pv_X {
return self.frame.origin.x;
}
- (void)setPv_Y:(CGFloat)pv_Y {
CGRect frame = self.frame;
frame.origin.y = pv_Y;
self.frame = frame;
}
- (CGFloat)pv_Y {
return self.frame.origin.y;
}
- (void)setPv_Width:(CGFloat)pv_Width {
CGRect frame = self.frame;
frame.size.width = pv_Width;
self.frame = frame;
}
- (CGFloat)pv_Width {
return self.frame.size.width;
}
- (void)setPv_Height:(CGFloat)pv_Height {
CGRect frame = self.frame;
frame.size.height = pv_Height;
self.frame = frame;
}
- (CGFloat)pv_Height {
return self.frame.size.height;
}
- (void)setPv_Size:(CGSize)pv_Size {
CGRect frame = self.frame;
frame.size = pv_Size;
self.frame = frame;
}
- (CGSize)pv_Size {
return self.frame.size;
}
- (void)setPv_CenterX:(CGFloat)pv_CenterX {
CGPoint center = self.center;
center.x = pv_CenterX;
self.center = center;
}
- (CGFloat)pv_CenterX {
return self.center.x;
}
- (void)setPv_CenterY:(CGFloat)pv_CenterY {
CGPoint center = self.center;
center.y = pv_CenterY;
self.center = center;
}
- (CGFloat)pv_CenterY {
return self.center.y;
}
- (void)setPv_Top:(CGFloat)pv_Top {
CGRect newframe = self.frame;
newframe.origin.y = pv_Top;
self.frame = newframe;
}
- (CGFloat)pv_Top {
return self.frame.origin.y;
}
- (void)setPv_Left:(CGFloat)pv_Left {
CGRect newframe = self.frame;
newframe.origin.x = pv_Left;
self.frame = newframe;
}
- (CGFloat)pv_Left {
return self.frame.origin.x;
}
- (void)setPv_Bottom:(CGFloat)pv_Bottom {
CGRect newframe = self.frame;
newframe.origin.y = pv_Bottom - self.frame.size.height;
self.frame = newframe;
}
- (CGFloat)pv_Bottom {
return self.frame.origin.y + self.frame.size.height;
}
- (void)setPv_Right:(CGFloat)pv_Right {
CGFloat delta = pv_Right - (self.frame.origin.x + self.frame.size.width);
CGRect newframe = self.frame;
newframe.origin.x += delta ;
self.frame = newframe;
}
- (CGFloat)pv_Right {
return self.frame.origin.x + self.frame.size.width;
}
/** X() */
BOOL pv_IsIphoneX_ALL(void) {
BOOL isPhoneX = NO;
if (@available(iOS 11.0, *)) {
isPhoneX = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;
}
return isPhoneX;
}
CGSize pv_ScreenSize(void) {
CGSize size = [UIScreen mainScreen].bounds.size;
return size;
}
CGFloat pv_ScreenWidth(void) {
CGSize size = [UIScreen mainScreen].bounds.size;
return size.width;
}
CGFloat pv_ScreenHeight(void) {
CGSize size = [UIScreen mainScreen].bounds.size;
return size.height;
}
@end

178
Pods/LSTPopView/README.md generated Normal file
View File

@@ -0,0 +1,178 @@
# LSTPopView iOS万能弹窗
[![Platform](https://img.shields.io/badge/platform-iOS-red.svg)](https://developer.apple.com/iphone/index.action) [![Language](http://img.shields.io/badge/language-OC-yellow.svg?style=flat )](https://en.wikipedia.org/wiki/Objective-C) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](http://mit-license.org) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/LSTPopView.svg)](https://img.shields.io/cocoapods/v/LSTPopView.svg)
### LSTPopView 万能弹窗,功能强大,易于拓展,性能优化和内存控制让其运行更加的流畅和稳健, LSTPopView的出现,可以让我们更专注弹窗页面的布局. 省心省力 ! 提高开发效率 !
## 前言
- 考虑到笔者的精力问题,遇到问题请先查看 API、效仿Demo、阅读README、搜索 Issues。如果是BUG 或 Feature,最好是提Issue
- 联系方式: LoSenTrad@163.com, QQ群:1045568246, 微信:a_LSTKit
- 开发环境: Xcode12.3, iOS13.5, iPhone XS Max
## 博客地址
- github: [https://github.com/LoSenTrad/LSTPopView](https://github.com/LoSenTrad/LSTPopView)
- CSDN: [https://blog.csdn.net/u012400600/article/details/106279654](https://blog.csdn.net/u012400600/article/details/106279654)
- 简书: [https://www.jianshu.com/p/8023a85dc2a2](https://www.jianshu.com/p/8023a85dc2a2)
## 目录
* [特性](#特性)
* [版本更新历史](#版本更新历史)
* [安装](#安装)
* [基本使用](#基本使用)
* [使用注意事项](#使用注意事项)
* [演示效果](#演示效果)
* [作者](#作者)
* [版权](#版权)
## 特性
- 提供丰富的api,高度自定义弹窗,简单入手使用
- 支持弹出动画,消失动画,主动动画等多重动画搭配
- 支持点击,长按,拖拽,横扫手势交互
- 支持多弹窗管理:编队,堆叠,优先级等
- 支持指定弹窗父类,eg: UIWindow,self.view等
- 安全且内存占用小,弹窗内存自动回收
- 提供生命周期api,自定义动画控制
- 自动规避键盘,防止被键盘遮挡
- 支持定时器,多定时器机制
- 支持纯代码/xib页面
- 支持横竖屏切换
- 支持多代理机制
- 支持二次封装,比如组件LSTHUD,LSTAlertView等
## 版本更新历史
- [点我查看](https://github.com/LoSenTrad/LSTPopView/blob/master/UPDATE_HISTORY.md)
## 安装
- OC版本安装
- CocoaPods安装: 在podfile文件中添加以下描述,然后 `pod install` 或者 `pod update`
```
pod 'LSTPopView'
```
- Carthage安装:(暂时未适配)
- Swift版本安装
- (计划开发中)
- 手动导入集成
- 1.拖动LSTPopView文件下5个文件到项目中
```objective-c
LSTPopView.h
LSTPopView.m
UIView+LSTPV.h
UIView+LSTPV.m
LSTPopViewProtocol.h
```
- 2.在项目中podfile添加依赖库LSTTimer: https://github.com/LoSenTrad/LSTTimer
```ruby
pod 'LSTTimer'
```
## 基本使用
- 代码示例
```objective-c
//自定义view
LSTPopViewTVView *customView = [[LSTPopViewTVView alloc] initWithFrame:CGRectMake(0, 0, 300,400)];
//创建弹窗PopViiew 指定父容器self.view, 不指定默认是app window
LSTPopView *popView = [LSTPopView initWithCustomView:customView
parentView:self.view
popStyle:LSTPopStyleSmoothFromBottom
dismissStyle:LSTDismissStyleSmoothToBottom];
//弹窗位置: 居中 贴顶 贴左 贴底 贴右
popView.hemStyle = LSTHemStyleBottom;
LSTPopViewWK(popView)
//点击背景触发
popView.bgClickBlock = ^{ [wk_popView dismiss]; };
//弹窗显示
[popView pop];
```
- 调试日志
```objective-c
/** 调试日志类型 */
typedef NS_ENUM(NSInteger, LSTPopViewLogStyle) {
LSTPopViewLogStyleNO = 0, // 关闭调试信息(窗口和控制台日志输出)
LSTPopViewLogStyleWindow, // 开启左上角小窗
LSTPopViewLogStyleConsole, // 开启控制台日志输出
LSTPopViewLogStyleALL // 开启小窗和控制台日志
};
```
- 调试小窗: S表示当前已经显示的弹窗数, R表示在移除队列的弹窗, S+R是表示当前所有的弹窗数
## 使用注意事项
#### (一定用weak修饰)
- 解析: LSTPopView对每个弹窗都有自动内存销毁机制, 外部对弹窗的强引用对打破这种自动内存销毁机制, 比如成员变量用strong修饰,否则弹窗不能自动销毁,导致内存回收不了.
- 类成员变量使用规范:
```objective-c
//成员变量用weak修饰, 不可以用strong修饰
@property (nonatomic,weak) LSTPopView *popView;
```
- 成员变量的创建
```objective-c
LSTPopViewTVView *customView = [[LSTPopViewTVView alloc] initWithFrame:CGRectMake(0, 0, 300,400)];
//弹窗实例创建
LSTPopView *popView = [LSTPopView initWithCustomView:customView
popStyle:LSTPopStyleSmoothFromBottom
dismissStyle:LSTDismissStyleSmoothToBottom];
//这里赋值给成员变量self.popView
self.popView = popView;
[popView pop];
```
- 错误使用:
```objective-c
//直接赋值给成员变量 导致成员变量为空, 请参考以上使用规范
self.popView = [LSTPopView initWithCustomView:customView
popStyle:LSTPopStyleSmoothFromBottom
dismissStyle:LSTDismissStyleSmoothToBottom];
```
## 演示效果
- 应用市场常用的示例场景
|QQ,微信,UC,微博,抖音<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/base_demo.gif" width = "200" height = "424" alt="图片名称" align=center />|拖拽移除,横扫移除<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/drag_sweep.gif" width = "200" height = "424" alt="图片名称" align=center /> |
|---|---|
- 丰富的出入场动画, 拖拽, 横扫动画
|弹出动画,中间,自上,自左,自下,自左<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/pop.gif" width = "200" height = "424" alt="图片名称" align=center />|移除动画,中间,至上,至左,至下,至左<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/dismiss.gif" width = "200" height = "424" alt="图片名称" align=center /> |拖拽,横扫动画<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/dragSweep.gif" width = "200" height = "424" alt="图片名称" align=center /> |
|---|---|---|
- 弹窗位置
|弹窗位置,中间,贴顶,贴左,贴底,贴右<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/hem_Style.gif" width = "200" height = "424" alt="图片名称" align=center />|X轴,Y轴调教,宽度和高度调教<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/x_y_w_h.gif" width = "200" height = "424" alt="图片名称" align=center /> |
|---|---|
- 自动规避键盘遮挡,指定容器,定时器
|自动规避键盘遮挡<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/keyboard.gif" width = "200" height = "424" alt="图片名称" align=center />|指定容器弹出<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTPopView/%E6%8C%87%E5%AE%9A%E5%AE%B9%E5%99%A8.gif" width = "200" height = "424" alt="图片名称" align=center />|弹窗计时<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTPopView/%E8%AE%A1%E6%97%B6%E5%99%A8.gif" width = "200" height = "424" alt="图片名称" align=center />|
|---|---|---|
- 多弹窗管理(优先级,编队)
|app启动多弹窗优先级显示<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/uPic/launch.gif" width = "200" height = "424" alt="图片名称" align=center />|多窗口编队使用<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTPopView/%E7%AA%97%E5%8F%A3%E7%BC%96%E9%98%9F%E7%9A%84%E4%BD%BF%E7%94%A8.gif" width = "200" height = "424" alt="图片名称" align=center />|
|---|---|
- 支持横竖屏
|屏幕旋转<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTPopView/%E5%B1%8F%E5%B9%95%E6%97%8B%E8%BD%AC.gif" width = "500" height = "500" alt="图片名称" align=center />|
|---|
## 作者
LoSenTrad@163.com, QQ群:1045568246, 微信:a_LSTKit
## 版权
尊重劳动成果, 人人有责.

19
Pods/LSTTimer/LICENSE generated Normal file
View File

@@ -0,0 +1,19 @@
Copyright (c) 2020 490790096@qq.com <LoSenTrad@163.com>
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.

165
Pods/LSTTimer/LSTTimer/Classes/LSTTimer.h generated Normal file
View File

@@ -0,0 +1,165 @@
//
// LSTTimer.h
// LSTTimer
//
// Created by LoSenTrad on 2020/7/13.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^LSTTimerChangeBlock)(NSString *day, NSString *hour, NSString *minute, NSString *second, NSString *ms);
typedef void(^LSTTimerFinishBlock)(NSString *identifier);
typedef void(^LSTTimerPauseBlock)(NSString *identifier);
/** 倒计时变化通知类型 */
typedef NS_ENUM(NSInteger, LSTTimerSecondChangeNFType) {
LSTTimerSecondChangeNFTypeNone = 0,
LSTTimerSecondChangeNFTypeMS, //每100ms(毫秒) 发出一次
LSTTimerSecondChangeNFTypeSecond, //每1s(秒) 发出一次
};
@interface LSTTimer : NSObject
/** 单例 */
LSTTimer *LSTTimerM(void);
#pragma mark - ***** 配置计时任务通知回调 *****
/// 设置倒计时任务的通知回调
/// @param name 通知名
/// @param identifier 倒计时任务的标识
/// @param type 倒计时变化通知类型
+ (void)setNotificationForName:(NSString *)name identifier:(NSString *)identifier changeNFType:(LSTTimerSecondChangeNFType)type;
#pragma mark - ***** 添加计时任务(100ms回调一次) *****
/// 添加计时任务
/// @param time 时间长度
/// @param handle 每100ms回调一次
+ (void)addTimerForTime:(NSTimeInterval)time handle:(LSTTimerChangeBlock)handle;
/// 添加计时任务
/// @param time 时间长度
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
+ (void)addTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle;
/// 添加计时任务
/// @param time 时间长度
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
/// @param finishBlock 计时完成回调
/// @param pauseBlock 计时暂停回调
+ (void)addTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock;
/// 添加计时任务,持久化到硬盘
/// @param time 时间长度
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
+ (void)addDiskTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle;
/// 添加计时任务,持久化到硬盘
/// @param time 添加计时任务,持久化到硬盘
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
/// @param finishBlock 计时完成回调
/// @param pauseBlock 计时暂停回调
+ (void)addDiskTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock;
#pragma mark - ***** 添加计时任务(1s回调一次) *****
/// 添加计时任务
/// @param time 时间长度
/// @param handle 计时任务标识
+ (void)addMinuteTimerForTime:(NSTimeInterval)time handle:(LSTTimerChangeBlock)handle;
/// 添加计时任务
/// @param time 时间长度
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
+ (void)addMinuteTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle;
/// 添加计时任务
/// @param time 时间长度
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
/// @param finishBlock 计时完成回调
/// @param pauseBlock 计时暂停回调
+ (void)addMinuteTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock;
/// 添加计时任务
/// @param time 时间长度
/// @param identifier 计时任务标识
/// @param handle 每100ms回调一次
/// @param finishBlock 计时完成回调
/// @param pauseBlock 计时暂停回调
+ (void)addDiskMinuteTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock;
#pragma mark - ***** 获取计时任务时间间隔 *****
/// 通过任务标识获取 计时任务 间隔(毫秒)
/// @param identifier 计时任务标识
+ (NSTimeInterval)getTimeIntervalForIdentifier:(NSString *)identifier;
#pragma mark - ***** 暂停计时任务 *****
/// 通过标识暂停计时任务
/// @param identifier 计时任务标识
+ (BOOL)pauseTimerForIdentifier:(NSString *)identifier;
/// 暂停所有计时任务
+ (void)pauseAllTimer;
#pragma mark - ***** 重启计时任务 *****
/// 通过标识重启 计时任务
/// @param identifier 计时任务标识
+ (BOOL)restartTimerForIdentifier:(NSString *)identifier;
/// 重启所有计时任务
+ (void)restartAllTimer;
#pragma mark - ***** 重置计时任务(恢复初始状态) *****
/// 通过标识重置 计时任务
/// @param identifier 计时任务标识
+ (BOOL)resetTimerForIdentifier:(NSString *)identifier;
/// 重置所有计时任务
+ (void)resetAllTimer;
#pragma mark - ***** 移除计时任务 *****
/// 通过标识移除计时任务
/// @param identifier 计时任务标识
+ (BOOL)removeTimerForIdentifier:(NSString *)identifier;
/// 移除所有计时任务
+ (void)removeAllTimer;
#pragma mark - ***** 格式化时间 *****
/// 将毫秒数 格式化成 时:分:秒:毫秒
/// @param time 时间长度(毫秒单位)
/// @param handle 格式化完成回调
+ (void)formatDateForTime:(NSTimeInterval)time handle:(LSTTimerChangeBlock)handle;
@end
NS_ASSUME_NONNULL_END

790
Pods/LSTTimer/LSTTimer/Classes/LSTTimer.m generated Normal file
View File

@@ -0,0 +1,790 @@
//
// LSTTimer.m
// LSTTimer
//
// Created by LoSenTrad on 2020/7/13.
//
#import "LSTTimer.h"
#define LSTPopViewTimerPath(name) [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"LSTTimer_%@_Timer",name]]
@interface LSTPopViewTimerModel : NSObject
/** */
@property (nonatomic, assign) NSTimeInterval time;
/** */
@property (nonatomic, assign) NSTimeInterval oriTime;
/** */
@property (nonatomic, assign) NSTimeInterval unit;
/** block */
/** */
@property (nonatomic,assign) BOOL isDisk;
/** */
@property (nonatomic,assign) BOOL isPause;
/** */
@property (nonatomic, copy) NSString *identifier;
/** */
@property (nonatomic, copy) NSString *NFName;
/** 0. 1. 2. */
@property (nonatomic, assign) LSTTimerSecondChangeNFType NFType;
@property (nonatomic, copy) LSTTimerChangeBlock handleBlock;
/** block */
@property (nonatomic, copy) LSTTimerFinishBlock finishBlock;
/** block */
@property (nonatomic, copy) LSTTimerPauseBlock pauseBlock;
+ (instancetype)timeInterval:(NSInteger)timeInterval;
@end
@implementation LSTPopViewTimerModel
+ (instancetype)timeInterval:(NSInteger)timeInterval {
LSTPopViewTimerModel *object = [LSTPopViewTimerModel new];
object.time = timeInterval*1000;
object.oriTime = timeInterval*1000;
return object;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeDouble:self.time forKey:@"timeInterval"];
[aCoder encodeDouble:self.oriTime forKey:@"oriTime"];
[aCoder encodeDouble:self.unit forKey:@"unit"];
[aCoder encodeBool:self.isDisk forKey:@"isDisk"];
[aCoder encodeBool:self.isPause forKey:@"isPause"];
[aCoder encodeObject:self.identifier forKey:@"identifier"];
[aCoder encodeBool:self.NFType forKey:@"NFType"];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.time = [aDecoder decodeDoubleForKey:@"timeInterval"];
self.oriTime = [aDecoder decodeDoubleForKey:@"oriTime"];
self.unit = [aDecoder decodeDoubleForKey:@"unit"];
self.isDisk = [aDecoder decodeBoolForKey:@"isDisk"];
self.isPause = [aDecoder decodeBoolForKey:@"isPause"];
self.identifier = [aDecoder decodeObjectForKey:@"identifier"];
self.NFType = [aDecoder decodeBoolForKey:@"NFType"];
}
return self;
}
@end
@interface LSTTimer ()
@property (nonatomic, strong) NSTimer * _Nullable showTimer;
/** */
@property (nonatomic, strong) NSMutableDictionary<NSString *, LSTPopViewTimerModel *> *timerMdic;
@end
@implementation LSTTimer
static LSTTimer *_instance;
LSTTimer *LSTTimerM() {
return [LSTTimer sharedInstance];
}
+ (instancetype)sharedInstance {
if (!_instance) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
}
return _instance;
}
+ (id)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
///
/// @param name
/// @param identifier
/// @param type
+ (void)setNotificationForName:(NSString *)name identifier:(NSString *)identifier changeNFType:(LSTTimerSecondChangeNFType)type {
if (identifier.length<=0) {
NSLog(@"计时器标识不能为空");
return;
}
LSTPopViewTimerModel *model = LSTTimerM().timerMdic[identifier];
if (model) {
model.NFType = type;
model.NFName = name;
return;
}else {
NSLog(@"找不到计时器任务");
return;
}
}
/** */
+ (void)addTimerForTime:(NSTimeInterval)time handle:(LSTTimerChangeBlock)handle {
[self initTimerForForTime:time identifier:nil ForIsDisk:NO unit:0 handle:handle finish:nil pause:nil];
}
/** */
+ (void)addTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:NO
unit:-1
handle:handle
finish:nil
pause:nil];
}
/** */
+ (void)addTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:NO
unit:-1
handle:handle
finish:finishBlock
pause:pauseBlock];
}
/** */
+ (void)addDiskTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:YES
unit:-1
handle:handle
finish:nil
pause:nil];
}
/** */
+ (void)addDiskTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:YES
unit:-1
handle:handle
finish:finishBlock
pause:pauseBlock];
}
/** */
+ (void)addMinuteTimerForTime:(NSTimeInterval)time handle:(LSTTimerChangeBlock)handle {
[self initTimerForForTime:time identifier:nil ForIsDisk:NO unit:1000 handle:handle finish:nil pause:nil];
}
/** */
+ (void)addMinuteTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:NO
unit:1000
handle:handle
finish:nil
pause:nil];
}
/** */
+ (void)addMinuteTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:NO
unit:1000
handle:handle
finish:finishBlock
pause:pauseBlock];
}
/** */
+ (void)addDiskMinuteTimerForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock {
[self initTimerForForTime:time
identifier:identifier
ForIsDisk:YES
unit:1000
handle:handle
finish:finishBlock
pause:pauseBlock];
}
//
+ (void)initTimerForForTime:(NSTimeInterval)time
identifier:(NSString *)identifier
ForIsDisk:(BOOL)isDisk
unit:(NSTimeInterval)unit
handle:(LSTTimerChangeBlock)handle
finish:(LSTTimerFinishBlock)finishBlock
pause:(LSTTimerPauseBlock)pauseBlock {
if (identifier.length<=0) {
LSTPopViewTimerModel *model = [LSTPopViewTimerModel timeInterval:time];
model.isDisk = isDisk;
model.identifier = [NSString stringWithFormat:@"%p",model];
model.unit = unit;
model.handleBlock = handle;
model.finishBlock = finishBlock;
model.pauseBlock = pauseBlock;
[LSTTimerM().timerMdic setObject:model forKey:model.identifier];
if (model.handleBlock) {
NSInteger totalSeconds = model.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(model.time))%1000/10;
NSString *ss = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ss.integerValue < 10) {
ss = [NSString stringWithFormat:@"0%@", ss];
}
model.handleBlock(days,hours,minute,second,ss);
}
//
if (model.NFType != LSTTimerSecondChangeNFTypeNone) {
[[NSNotificationCenter defaultCenter] postNotificationName:model.NFName object:nil userInfo:nil];
}
if (model.isDisk) {
[self savaForTimerModel:model];
}
[self initTimer];
return;
}
BOOL isTempDisk = [LSTTimer timerIsExistInDiskForIdentifier:identifier];//
BOOL isRAM = LSTTimerM().timerMdic[identifier]?YES:NO;//
if (!isRAM && !isTempDisk) {//
LSTPopViewTimerModel *model = [LSTPopViewTimerModel timeInterval:time];
model.handleBlock = handle;
model.isDisk = isDisk;
model.identifier = identifier;
model.unit = unit;
model.finishBlock = finishBlock;
model.pauseBlock = pauseBlock;
[LSTTimerM().timerMdic setObject:model forKey:identifier];
if (model.handleBlock) {
NSInteger totalSeconds = model.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(model.time))%1000/10;
NSString *ss = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ss.integerValue < 10) {
ss = [NSString stringWithFormat:@"0%@", ss];
}
if (model.isDisk) {
[self savaForTimerModel:model];
}
model.handleBlock(days,hours,minute,second,ss);
}
//
if (model.NFType != LSTTimerSecondChangeNFTypeNone) {
[[NSNotificationCenter defaultCenter] postNotificationName:model.NFName object:nil userInfo:nil];
}
[self initTimer];
}
if (isRAM && !isTempDisk) {//
LSTPopViewTimerModel *model = LSTTimerM().timerMdic[identifier];
model.isPause = NO;
model.handleBlock = handle;
model.isDisk = isDisk;
model.finishBlock = finishBlock;
model.pauseBlock = pauseBlock;
if (model.isDisk) {
[self savaForTimerModel:model];
}
// [self initTimer];
}
if (!isRAM && isTempDisk) {//
LSTPopViewTimerModel *model = [LSTTimer getTimerModelForIdentifier:identifier];
if (isDisk == NO) {
[LSTTimer deleteForIdentifier:identifier];
}
model.isPause = NO;
model.isDisk = isDisk;
model.handleBlock = handle;
model.finishBlock = finishBlock;
model.pauseBlock = pauseBlock;
[LSTTimerM().timerMdic setObject:model forKey:identifier];
if (model.handleBlock) {
NSInteger totalSeconds = model.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(model.time))%1000/10;
NSString *ss = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ss.integerValue < 10) {
ss = [NSString stringWithFormat:@"0%@", ss];
}
model.handleBlock(days,hours,minute,second,ss);
}
//
if (model.NFType != LSTTimerSecondChangeNFTypeNone) {
[[NSNotificationCenter defaultCenter] postNotificationName:model.NFName object:nil userInfo:nil];
}
if (model.isDisk) {
[self savaForTimerModel:model];
}
[self initTimer];
}
if (isRAM && isTempDisk) {//
LSTPopViewTimerModel *model = [LSTTimer getTimerModelForIdentifier:identifier];
model.isPause = NO;
if (isDisk == NO) {
[LSTTimer deleteForIdentifier:identifier];
}
model.isDisk = isDisk;
model.handleBlock = handle;
model.finishBlock = finishBlock;
model.pauseBlock = pauseBlock;
[LSTTimerM().timerMdic setObject:model forKey:identifier];
if (model.handleBlock) {
NSInteger totalSeconds = model.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(model.time))%1000/10;
NSString *ss = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ss.integerValue < 10) {
ss = [NSString stringWithFormat:@"0%@", ss];
}
model.handleBlock(days,hours,minute,second,ss);
}
//
if (model.NFType != LSTTimerSecondChangeNFTypeNone) {
[[NSNotificationCenter defaultCenter] postNotificationName:model.NFName object:nil userInfo:nil];
}
if (model.isDisk) {
[self savaForTimerModel:model];
}
// [self initTimer];
}
}
+ (NSTimeInterval)getTimeIntervalForIdentifier:(NSString *)identifier {
if (identifier.length<=0) {
return 0.0;
}
BOOL isTempDisk = [LSTTimer timerIsExistInDiskForIdentifier:identifier];//
BOOL isRAM = LSTTimerM().timerMdic[identifier]?YES:NO;//
if (isTempDisk) {
LSTPopViewTimerModel *model = [LSTTimer loadTimerForIdentifier:identifier];
return model.oriTime - model.time;
}else if (isRAM) {
LSTPopViewTimerModel *model = LSTTimerM().timerMdic[identifier];
return model.oriTime - model.time;
}else {
NSLog(@"找不到计时任务");
return 0.0;
}
}
+ (BOOL)pauseTimerForIdentifier:(NSString *)identifier {
if (identifier.length<=0) {
NSLog(@"计时器标识不能为空");
return NO;
}
LSTPopViewTimerModel *model = LSTTimerM().timerMdic[identifier];
if (model) {
model.isPause = YES;
if (model.pauseBlock) { model.pauseBlock(model.identifier); }
return YES;
}else {
NSLog(@"找不到计时器任务");
return NO;
}
}
+ (void)pauseAllTimer {
[LSTTimerM().timerMdic enumerateKeysAndObjectsUsingBlock:^(NSString *key, LSTPopViewTimerModel *obj, BOOL *stop) {
obj.isPause = YES;
if (obj.pauseBlock) { obj.pauseBlock(obj.identifier); }
}];
}
+ (BOOL)restartTimerForIdentifier:(NSString *)identifier {
if (identifier.length<=0) {
NSLog(@"计时器标识不能为空");
return NO;
}
//, addTimer
BOOL isRAM = LSTTimerM().timerMdic[identifier]?YES:NO;//
if (isRAM) {
LSTPopViewTimerModel *model = LSTTimerM().timerMdic[identifier];
model.isPause = NO;
return YES;
}else {
NSLog(@"找不到计时器任务");
return NO;
}
}
+ (void)restartAllTimer {
if (LSTTimerM().timerMdic.count<=0) {
return;
}
[LSTTimerM().timerMdic enumerateKeysAndObjectsUsingBlock:^(NSString *key, LSTPopViewTimerModel *obj, BOOL *stop) {
obj.isPause = NO;
}];
}
+ (BOOL)resetTimerForIdentifier:(NSString *)identifier {
if (identifier.length<=0) {
NSLog(@"计时器标识不能为空");
return NO;
}
//, addTimer
BOOL isRAM = LSTTimerM().timerMdic[identifier]?YES:NO;//
if (isRAM) {
LSTPopViewTimerModel *model = LSTTimerM().timerMdic[identifier];
model.isPause = NO;
model.time = model.oriTime;
if (model.handleBlock) {
NSInteger totalSeconds = model.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(model.time))%1000/10;
NSString *ss = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ss.integerValue < 10) {
ss = [NSString stringWithFormat:@"0%@", ss];
}
model.handleBlock(days,hours,minute,second,ss);
}
return YES;
}else {
NSLog(@"找不到计时器任务");
return NO;
}
}
+ (void)resetAllTimer {
if (LSTTimerM().timerMdic.count<=0) {
return;
}
[LSTTimerM().timerMdic enumerateKeysAndObjectsUsingBlock:^(NSString *key, LSTPopViewTimerModel *obj, BOOL *stop) {
obj.isPause = NO;
obj.time = obj.oriTime;
if (obj.handleBlock) {
NSInteger totalSeconds = obj.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(obj.time))%1000/10;
NSString *ss = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ss.integerValue < 10) {
ss = [NSString stringWithFormat:@"0%@", ss];
}
obj.handleBlock(days,hours,minute,second,ss);
}
}];
}
+ (BOOL)removeTimerForIdentifier:(NSString *)identifier {
if (identifier.length<=0) {
NSLog(@"计时器标识不能为空");
return NO;
}
[LSTTimerM().timerMdic removeObjectForKey:identifier];
if (LSTTimerM().timerMdic.count<=0) {//
[LSTTimerM().showTimer invalidate];
LSTTimerM().showTimer = nil;
}
return YES;
}
+ (void)removeAllTimer {
[LSTTimerM().timerMdic removeAllObjects];
[LSTTimerM().showTimer invalidate];
LSTTimerM().showTimer = nil;
}
/** increase YES: NO: */
+ (void)initTimer {
if (LSTTimerM().showTimer) {
return;
}
NSTimer *timer = [NSTimer timerWithTimeInterval:0.01f target:LSTTimerM() selector:@selector(timerChange) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
LSTTimerM().showTimer = timer;
}
- (void)timerChange {
// +
[LSTTimerM().timerMdic enumerateKeysAndObjectsUsingBlock:^(NSString *key, LSTPopViewTimerModel *obj, BOOL *stop) {
if (!obj.isPause) {
obj.time = obj.time-10.0;
if (obj.unit>-1) {
obj.unit = obj.unit-10.0;
}
if (obj.time<0) {//
obj.time = 0;
obj.isPause = YES;
}
NSInteger totalSeconds = obj.time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(obj.time))%1000/10;
NSString *ms = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ms.integerValue < 10) {
ms = [NSString stringWithFormat:@"0%@", ms];
}
if (obj.unit<=-1) {
if (obj.handleBlock) {obj.handleBlock(days,hours,minute,second,ms);}
if (obj.NFType == LSTTimerSecondChangeNFTypeMS) {
//
[[NSNotificationCenter defaultCenter] postNotificationName:obj.NFName object:nil userInfo:nil];
}
}else if (obj.unit == 0) {
if (obj.handleBlock) {obj.handleBlock(days,hours,minute,second,ms);}
obj.unit = 1000;
if (obj.NFType == LSTTimerSecondChangeNFTypeSecond) {
//
[[NSNotificationCenter defaultCenter] postNotificationName:obj.NFName object:nil userInfo:nil];
}
}
if (obj.isDisk) {
[LSTTimer savaForTimerModel:obj];
}
if (obj.time<=0) {//
if (obj.finishBlock) { obj.finishBlock(obj.identifier); }
[LSTTimerM().timerMdic removeObjectForKey:obj.identifier];
[LSTTimer deleteForIdentifier:obj.identifier];
}
}
}];
}
- (NSMutableDictionary<NSString *,LSTPopViewTimerModel *> *)timerMdic {
if(_timerMdic) return _timerMdic;
_timerMdic = [NSMutableDictionary dictionary];
return _timerMdic;
}
#pragma mark - ***** other *****
+ (BOOL)timerIsExistInDiskForIdentifier:(NSString *)identifier {
NSString *filePath = LSTPopViewTimerPath(identifier);
BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
return isExist;
}
/** */
+ (void)formatDateForTime:(NSTimeInterval)time handle:(LSTTimerChangeBlock)handle {
if (handle) {
NSInteger totalSeconds = time/1000.0;
NSString *days = [NSString stringWithFormat:@"%zd", totalSeconds/60/60/24];
NSString *hours = [NSString stringWithFormat:@"%zd", totalSeconds/60/60%24];
NSString *minute = [NSString stringWithFormat:@"%zd", (totalSeconds/60)%60];
NSString *second = [NSString stringWithFormat:@"%zd", totalSeconds%60];
CGFloat sss = ((NSInteger)(time))%1000/10;
NSString *ms = [NSString stringWithFormat:@"%.lf", sss];
if (hours.integerValue < 10) {
hours = [NSString stringWithFormat:@"0%@", hours];
}
if (minute.integerValue < 10) {
minute = [NSString stringWithFormat:@"0%@", minute];
}
if (second.integerValue < 10) {
second = [NSString stringWithFormat:@"0%@", second];
}
if (ms.integerValue < 10) {
ms = [NSString stringWithFormat:@"0%@", ms];
}
handle(days,hours,minute,second,ms);
}
}
+ (BOOL)savaForTimerModel:(LSTPopViewTimerModel *)model {
NSString *filePath = LSTPopViewTimerPath(model.identifier);
return [NSKeyedArchiver archiveRootObject:model toFile:filePath];
}
+ (LSTPopViewTimerModel *)loadTimerForIdentifier:(NSString *)identifier{
NSString *filePath = LSTPopViewTimerPath(identifier);
return [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}
+ (BOOL)deleteForIdentifier:(NSString *)identifier {
NSString *filePath = LSTPopViewTimerPath(identifier);
NSFileManager* fileManager = [NSFileManager defaultManager];
BOOL isExist = [fileManager fileExistsAtPath:filePath];
if (isExist) {
return [fileManager removeItemAtPath:filePath error:nil];
}
return NO;
}
+ (LSTPopViewTimerModel *)getTimerModelForIdentifier:(NSString *)identifier {
if (identifier.length<=0) {
return nil;
}
LSTPopViewTimerModel *model = [LSTTimer loadTimerForIdentifier:identifier];
return model;
}
@end

72
Pods/LSTTimer/README.md generated Normal file
View File

@@ -0,0 +1,72 @@
# LSTTimer 性能和精度兼得的iOS计时器组件
[![Platform](https://img.shields.io/badge/platform-iOS-red.svg)](https://developer.apple.com/iphone/index.action) [![Language](http://img.shields.io/badge/language-OC-yellow.svg?style=flat )](https://en.wikipedia.org/wiki/Objective-C) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](http://mit-license.org) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/LSTPopView.svg)](https://img.shields.io/cocoapods/v/LSTTimer.svg)
## 前言
- 在项目开发中,计时器任务的需求很多, LSTTimer的出现就是为了更好统一管理项目中的计时器任务.
- 欢迎coder们发现问题或者提供更好的idea,一起努力完善
## 博客地址
- github: [https://github.com/LoSenTrad/LSTTimer](https://github.com/LoSenTrad/LSTTimer)
- 简书: [https://www.jianshu.com/p/4f05c7e26bb1](https://www.jianshu.com/p/4f05c7e26bb1)
## 实现思路
LSTTimer单例设计, 内部持有一个NSTimer和计时任务池, 所有的计时任务都被添加到任务池里面; NSTimer每100ms(毫秒)执行一次遍历计时任务池, 每个计时任务会进行的时间差运算.
## 特性
- 提供丰富的api,简单入手使用
- 单例设计,安全且占用内存少,统一管理app所有计时任务
- 单计时器任务池设计,一个NSTimer完成多个计时任务
- 计时任务精确度:100ms(100毫秒)
- 支持计时格式--> 天:时:分:秒:毫秒
- 支持硬盘持久化计时任务
- 支持列表计时任务和各种花里胡哨的计时任务
## 版本更新历史[点我](https://github.com/LoSenTrad/LSTTimer/blob/master/UPDATE_HISTORY.md)
## 安装
- CocoaPods安装: 在podfile文件中添加以下描述,然后 `pod install` 或者 `pod update`
```ruby
pod 'LSTTimer'
```
- Carthage安装:(暂时未适配)
## 效果演示(gif图比较大,请耐心等待~)
- 应用市场常用的示例场景
- 支持 天:时:分:秒:毫秒
- 列表计时方案:只需一个计时任务
|常用示例场景<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTTimer/%E5%B8%B8%E7%94%A8%E8%AE%A1%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%A4%BA%E4%BE%8B.gif" width = "200" height = "424" alt="图片名称" align=center />|列表倒计时<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTTimer/%E5%88%97%E8%A1%A8%E5%80%92%E8%AE%A1%E6%97%B6.gif" width = "200" height = "424" alt="图片名称" align=center />|
|---|---|
- 内存计时任务
(当前页面添加计时任务,退出当前页面,计时任务不会停止,而是存在于app的整个生命周期内.当然了,也可以手动移除)
|内存计时任务<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTTimer/%E5%86%85%E5%AD%98%E8%AE%A1%E6%97%B6%E4%BB%BB%E5%8A%A1.gif" width = "200" height = "424" alt="图片名称" align=center />|
|---|
- 硬盘计时任务
(当前页面添加硬盘计时任务,退出app,计时任务保存在硬盘,再次打开进入app,如果计时任务没有结束,继续该计时任务)
|自动规避键盘遮挡<br><img src="https://raw.githubusercontent.com/5208171/LSTBlog/master/LSTTimer/%E7%A1%AC%E7%9B%98%E8%AE%A1%E6%97%B6%E4%BB%BB%E5%8A%A1.gif" width = "200" height = "424" alt="图片名称" align=center />|
|---|
## 作者
490790096@qq.com, LoSenTrad@163.com
## 版权
尊重劳动成果, 人人有责.

13
Pods/Manifest.lock generated
View File

@@ -21,6 +21,12 @@ PODS:
- LookinServer (1.2.8):
- LookinServer/Core (= 1.2.8)
- LookinServer/Core (1.2.8)
- LSTPopView (0.3.10):
- LSTPopView/Code (= 0.3.10)
- LSTTimer
- LSTPopView/Code (0.3.10):
- LSTTimer
- LSTTimer (0.2.10)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.4.2)
@@ -36,6 +42,7 @@ DEPENDENCIES:
- FLAnimatedImage (~> 1.0.17)
- HWPanModal (~> 0.9.9)
- LookinServer
- LSTPopView (~> 0.3.10)
- Masonry (= 1.1.0)
- MBProgressHUD (= 1.2.0)
- MJExtension (= 3.4.2)
@@ -50,6 +57,8 @@ SPEC REPOS:
- FLAnimatedImage
- HWPanModal
- LookinServer
- LSTPopView
- LSTTimer
- Masonry
- MBProgressHUD
- MJExtension
@@ -63,12 +72,14 @@ SPEC CHECKSUMS:
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2
LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80
LSTPopView: 9379f00f6ce7d1fc620b50ab00ed3ef97b2d4d52
LSTTimer: caf8f02ff366ca175cf4c1778d26c166183c1b6f
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: f29024626962457f3470184232766516dee8dfea
PODFILE CHECKSUM: c407e365492f78edcfea5c78b0fb36d8bf0e447d
PODFILE CHECKSUM: c50284c86c4e30cee59c186e48767667019dcb61
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 = "8B7D23DD98E41BAE91418E9E85F191D6"
BuildableName = "LSTPopView.framework"
BlueprintName = "LSTPopView"
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,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 = "5A2609DB0612F95A3450D2E02CA850A0"
BuildableName = "LSTTimer.framework"
BlueprintName = "LSTTimer"
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>0.3.10</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_LSTPopView : NSObject
@end
@implementation PodsDummy_LSTPopView
@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,19 @@
#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 "LSTPopView.h"
#import "LSTPopViewProtocol.h"
#import "UIView+LSTPV.h"
FOUNDATION_EXPORT double LSTPopViewVersionNumber;
FOUNDATION_EXPORT const unsigned char LSTPopViewVersionString[];

View File

@@ -0,0 +1,14 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -framework "LSTTimer" -framework "UIKit"
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}/LSTPopView
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 LSTPopView {
umbrella header "LSTPopView-umbrella.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,14 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LSTPopView
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -framework "LSTTimer" -framework "UIKit"
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}/LSTPopView
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,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>0.2.10</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_LSTTimer : NSObject
@end
@implementation PodsDummy_LSTTimer
@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,17 @@
#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 "LSTTimer.h"
FOUNDATION_EXPORT double LSTTimerVersionNumber;
FOUNDATION_EXPORT const unsigned char LSTTimerVersionString[];

View File

@@ -0,0 +1,12 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LSTTimer
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}/LSTTimer
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 LSTTimer {
umbrella header "LSTTimer-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}/LSTTimer
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}/LSTTimer
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

@@ -87,6 +87,52 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
## LSTPopView
Copyright (c) 2020 490790096@qq.com <LoSenTrad@163.com>
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.
## LSTTimer
Copyright (c) 2020 490790096@qq.com <LoSenTrad@163.com>
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

@@ -122,6 +122,64 @@ SOFTWARE.
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2020 490790096@qq.com &lt;LoSenTrad@163.com&gt;
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>LSTPopView</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2020 490790096@qq.com &lt;LoSenTrad@163.com&gt;
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>LSTTimer</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>MIT License

View File

@@ -3,6 +3,8 @@ ${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework
${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework
${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework
${BUILT_PRODUCTS_DIR}/HWPanModal/HWPanModal.framework
${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework
${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.framework
${BUILT_PRODUCTS_DIR}/LookinServer/LookinServer.framework
${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework

View File

@@ -2,6 +2,8 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HWPanModal.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTPopView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTTimer.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

@@ -3,6 +3,8 @@ ${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework
${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework
${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework
${BUILT_PRODUCTS_DIR}/HWPanModal/HWPanModal.framework
${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework
${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.framework
${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework

View File

@@ -2,6 +2,8 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HWPanModal.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTPopView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LSTTimer.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

@@ -180,6 +180,8 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
install_framework "${BUILT_PRODUCTS_DIR}/HWPanModal/HWPanModal.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.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"
@@ -192,6 +194,8 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
install_framework "${BUILT_PRODUCTS_DIR}/HWPanModal/HWPanModal.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTPopView/LSTPopView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/LSTTimer/LSTTimer.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}/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}/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"
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}/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}/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"
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 "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}/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 "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}/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"
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}/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}/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"
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}/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}/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"
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 "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}/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 "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}/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"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.

View File

@@ -14,6 +14,8 @@
0477BD952EBAFF4E0055D639 /* KBURLOpenBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BD932EBAFF4E0055D639 /* KBURLOpenBridge.m */; };
0477BDF02EBB76E30055D639 /* HomeSheetVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BDEF2EBB76E30055D639 /* HomeSheetVC.m */; };
0477BDF32EBB7B850055D639 /* KBDirectionIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BDF22EBB7B850055D639 /* KBDirectionIndicatorView.m */; };
0477BDF72EBC63A80055D639 /* KBTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BDF62EBC63A80055D639 /* KBTestVC.m */; };
0477BDFA2EBC66340055D639 /* HomeHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BDF92EBC66340055D639 /* HomeHeadView.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 */; };
@@ -103,6 +105,10 @@
0477BDEF2EBB76E30055D639 /* HomeSheetVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeSheetVC.m; sourceTree = "<group>"; };
0477BDF12EBB7B850055D639 /* KBDirectionIndicatorView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBDirectionIndicatorView.h; sourceTree = "<group>"; };
0477BDF22EBB7B850055D639 /* KBDirectionIndicatorView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBDirectionIndicatorView.m; sourceTree = "<group>"; };
0477BDF52EBC63A80055D639 /* KBTestVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBTestVC.h; sourceTree = "<group>"; };
0477BDF62EBC63A80055D639 /* KBTestVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBTestVC.m; sourceTree = "<group>"; };
0477BDF82EBC66340055D639 /* HomeHeadView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeHeadView.h; sourceTree = "<group>"; };
0477BDF92EBC66340055D639 /* HomeHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeHeadView.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>"; };
@@ -346,6 +352,8 @@
children = (
0477BDF12EBB7B850055D639 /* KBDirectionIndicatorView.h */,
0477BDF22EBB7B850055D639 /* KBDirectionIndicatorView.m */,
0477BDF82EBC66340055D639 /* HomeHeadView.h */,
0477BDF92EBC66340055D639 /* HomeHeadView.m */,
);
path = V;
sourceTree = "<group>";
@@ -361,6 +369,8 @@
0459D1B32EBA284C00F2D189 /* KBSkinCenterVC.m */,
0477BDEE2EBB76E30055D639 /* HomeSheetVC.h */,
0477BDEF2EBB76E30055D639 /* HomeSheetVC.m */,
0477BDF52EBC63A80055D639 /* KBTestVC.h */,
0477BDF62EBC63A80055D639 /* KBTestVC.m */,
);
path = VC;
sourceTree = "<group>";
@@ -804,10 +814,14 @@
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";
@@ -880,11 +894,13 @@
04FC95D72EB1EA16007BD342 /* BaseTableView.m in Sources */,
0477BDF32EBB7B850055D639 /* KBDirectionIndicatorView.m in Sources */,
04FC95D82EB1EA16007BD342 /* BaseCell.m in Sources */,
0477BDF72EBC63A80055D639 /* KBTestVC.m in Sources */,
04FC95C92EB1E4C9007BD342 /* BaseNavigationController.m in Sources */,
04FC95DD2EB202A3007BD342 /* KBGuideVC.m in Sources */,
04FC95E52EB220B5007BD342 /* UIColor+Extension.m in Sources */,
0477BDF02EBB76E30055D639 /* HomeSheetVC.m in Sources */,
04FC97002EB30A00007BD342 /* KBGuideTopCell.m in Sources */,
0477BDFA2EBC66340055D639 /* HomeHeadView.m in Sources */,
04FC97032EB30A00007BD342 /* KBGuideKFCell.m in Sources */,
04FC97062EB30A00007BD342 /* KBGuideUserCell.m in Sources */,
04FC97092EB31B14007BD342 /* KBHUD.m in Sources */,

View File

@@ -0,0 +1,16 @@
//
// HomeHeadView.h
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface HomeHeadView : UIView
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,20 @@
//
// HomeHeadView.m
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import "HomeHeadView.h"
@implementation HomeHeadView
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end

View File

@@ -3,7 +3,7 @@
// keyBoard
//
// Created by Mac on 2025/11/5.
//
// HomeSheetVC 三角指示器
#import <UIKit/UIKit.h>
#import <HWPanModal/HWPanModalPresentable.h>

View File

@@ -18,6 +18,10 @@
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
HWBackgroundConfig *config = [HWBackgroundConfig configWithBehavior:HWBackgroundBehaviorDefault];
config = [HWBackgroundConfig configWithBehavior:HWBackgroundBehaviorDefault];
config.backgroundAlpha = 0.01;
[self.hw_dimmedView reloadConfig:config];
}
- (UIView<HWPanModalIndicatorProtocol> *)customIndicatorView {
@@ -55,6 +59,10 @@
return NO; // short
}
- (BOOL)allowsTouchEventsPassingThroughTransitionView {
return YES;
}
//
- (BOOL)allowsDragToDismiss {
return NO;

View File

@@ -6,14 +6,12 @@
//
#import "HomeVC.h"
#import "KBGuideVC.h"
#import "KBLangTestVC.h"
#import "HomeHeadView.h"
#import "HomeSheetVC.h"
@interface HomeVC () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITextView *textView; //
@property (nonatomic, strong) BaseTableView *tableView; //
@property (nonatomic, copy) NSArray<NSString *> *items; //
@interface HomeVC ()
@property (nonatomic, strong) HomeHeadView *headView;
@end
@implementation HomeVC
@@ -21,91 +19,34 @@
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// CGFloat width = [UIScreen mainScreen].bounds.size.width;
// UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, 220)];
// CGRect frame = CGRectMake(16, 16, width - 32, 188);
// self.textView = [[UITextView alloc] initWithFrame:frame];
// self.textView.text = KBLocalized(@"home_input_placeholder");
// self.textView.layer.borderColor = [UIColor blackColor].CGColor;
// self.textView.layer.borderWidth = 0.5;
// [header addSubview:self.textView];
//
// //
// self.tableView = [[BaseTableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleInsetGrouped];
// self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// self.tableView.delegate = self;
// self.tableView.dataSource = self;
// self.tableView.tableHeaderView = header;
// [self.view addSubview:self.tableView];
//
// self.items = @[ KBLocalized(@"home_item_lang_test"), KBLocalized(@"home_item_keyboard_permission"), @"皮肤中心" ];
//
// dispatch_async(dispatch_get_main_queue(), ^{ [self.textView becomeFirstResponder]; });
//
// [[KBNetworkManager shared] GET:@"app/config" parameters:nil headers:nil completion:^(id _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// NSLog(@"====");
// }];
[self.view addSubview:self.headView];
// sheetVC
HomeSheetVC *vc = [HomeSheetVC new];
vc.minHeight = 300;
vc.topInset = 100;
[self presentPanModal:vc];
}
- (void)setupMas{
[self.headView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view);
make.top.equalTo(self.view);
}];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// self.title = KBLocalized(@"home_title");
// self.items = @[ KBLocalized(@"home_item_lang_test"), KBLocalized(@"home_item_keyboard_permission"), @"皮肤中心" ];
// [self.tableView reloadData];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// KBGuideVC *vc = [[KBGuideVC alloc] init];
// [self.navigationController pushViewController:vc animated:true];
// [KBHUD showInfo:@"加载中..."];
// [KBHUD show];
// [KBHUD showAllowTapToDismiss:true];
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.items.count; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"home.cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; }
cell.textLabel.text = self.items[indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row == 0) {
//
KBLangTestVC *vc = [KBLangTestVC new];
[self.navigationController pushViewController:vc animated:YES];
} else if (indexPath.row == 1) {
//
KBGuideVC *vc = [KBGuideVC new];
[self.navigationController pushViewController:vc animated:YES];
} else if (indexPath.row == 2) {
//
UIViewController *vc = [NSClassFromString(@"KBSkinCenterVC") new];
if (vc) { [self.navigationController pushViewController:vc animated:YES]; }
#pragma mark - lazy
- (HomeHeadView *)headView{
if (!_headView) {
_headView = [[HomeHeadView alloc] init];
}
return _headView;
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end

View File

@@ -0,0 +1,16 @@
//
// KBTestVC.h
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface KBTestVC : UIViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,94 @@
//
// KBTestVC.m
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import "KBTestVC.h"
#import "KBGuideVC.h"
#import "KBLangTestVC.h"
@interface KBTestVC ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITextView *textView; //
@property (nonatomic, strong) BaseTableView *tableView; //
@property (nonatomic, copy) NSArray<NSString *> *items; //
@end
@implementation KBTestVC
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
CGFloat width = [UIScreen mainScreen].bounds.size.width;
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, 220)];
CGRect frame = CGRectMake(16, 16, width - 32, 188);
self.textView = [[UITextView alloc] initWithFrame:frame];
self.textView.text = KBLocalized(@"home_input_placeholder");
self.textView.layer.borderColor = [UIColor blackColor].CGColor;
self.textView.layer.borderWidth = 0.5;
[header addSubview:self.textView];
//
self.tableView = [[BaseTableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleInsetGrouped];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.tableHeaderView = header;
[self.view addSubview:self.tableView];
self.items = @[ KBLocalized(@"home_item_lang_test"), KBLocalized(@"home_item_keyboard_permission"), @"皮肤中心" ];
dispatch_async(dispatch_get_main_queue(), ^{ [self.textView becomeFirstResponder]; });
[[KBNetworkManager shared] GET:@"app/config" parameters:nil headers:nil completion:^(id _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"====");
}];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.title = KBLocalized(@"home_title");
self.items = @[ KBLocalized(@"home_item_lang_test"), KBLocalized(@"home_item_keyboard_permission"), @"皮肤中心" ];
[self.tableView reloadData];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// KBGuideVC *vc = [[KBGuideVC alloc] init];
// [self.navigationController pushViewController:vc animated:true];
// [KBHUD showInfo:@"加载中..."];
// [KBHUD show];
// [KBHUD showAllowTapToDismiss:true];
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.items.count; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"home.cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; }
cell.textLabel.text = self.items[indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row == 0) {
//
KBLangTestVC *vc = [KBLangTestVC new];
[self.navigationController pushViewController:vc animated:YES];
} else if (indexPath.row == 1) {
//
KBGuideVC *vc = [KBGuideVC new];
[self.navigationController pushViewController:vc animated:YES];
} else if (indexPath.row == 2) {
//
UIViewController *vc = [NSClassFromString(@"KBSkinCenterVC") new];
if (vc) { [self.navigationController pushViewController:vc animated:YES]; }
}
}
@end