1
This commit is contained in:
9
Podfile
9
Podfile
@@ -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
|
||||
|
||||
13
Podfile.lock
13
Podfile.lock
@@ -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
19
Pods/LSTPopView/LICENSE
generated
Normal 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.
|
||||
231
Pods/LSTPopView/LSTPopView/Classes/Code/LSTPopView.h
generated
Normal file
231
Pods/LSTPopView/LSTPopView/Classes/Code/LSTPopView.h
generated
Normal 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
|
||||
1775
Pods/LSTPopView/LSTPopView/Classes/Code/LSTPopView.m
generated
Normal file
1775
Pods/LSTPopView/LSTPopView/Classes/Code/LSTPopView.m
generated
Normal file
File diff suppressed because it is too large
Load Diff
143
Pods/LSTPopView/LSTPopView/Classes/Code/LSTPopViewProtocol.h
generated
Normal file
143
Pods/LSTPopView/LSTPopView/Classes/Code/LSTPopViewProtocol.h
generated
Normal 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
|
||||
49
Pods/LSTPopView/LSTPopView/Classes/Code/UIView+LSTPV.h
generated
Normal file
49
Pods/LSTPopView/LSTPopView/Classes/Code/UIView+LSTPV.h
generated
Normal 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
|
||||
148
Pods/LSTPopView/LSTPopView/Classes/Code/UIView+LSTPV.m
generated
Normal file
148
Pods/LSTPopView/LSTPopView/Classes/Code/UIView+LSTPV.m
generated
Normal 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
178
Pods/LSTPopView/README.md
generated
Normal file
@@ -0,0 +1,178 @@
|
||||
# LSTPopView iOS万能弹窗
|
||||
|
||||
[](https://developer.apple.com/iphone/index.action) [](https://en.wikipedia.org/wiki/Objective-C) [](http://mit-license.org) [](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
19
Pods/LSTTimer/LICENSE
generated
Normal 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
165
Pods/LSTTimer/LSTTimer/Classes/LSTTimer.h
generated
Normal 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
790
Pods/LSTTimer/LSTTimer/Classes/LSTTimer.m
generated
Normal 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
72
Pods/LSTTimer/README.md
generated
Normal file
@@ -0,0 +1,72 @@
|
||||
# LSTTimer 性能和精度兼得的iOS计时器组件
|
||||
|
||||
[](https://developer.apple.com/iphone/index.action) [](https://en.wikipedia.org/wiki/Objective-C) [](http://mit-license.org) [](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
13
Pods/Manifest.lock
generated
@@ -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
|
||||
|
||||
5012
Pods/Pods.xcodeproj/project.pbxproj
generated
5012
Pods/Pods.xcodeproj/project.pbxproj
generated
File diff suppressed because it is too large
Load Diff
58
Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LSTPopView.xcscheme
generated
Normal file
58
Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LSTPopView.xcscheme
generated
Normal 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>
|
||||
58
Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LSTTimer.xcscheme
generated
Normal file
58
Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LSTTimer.xcscheme
generated
Normal 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>
|
||||
26
Pods/Target Support Files/LSTPopView/LSTPopView-Info.plist
generated
Normal file
26
Pods/Target Support Files/LSTPopView/LSTPopView-Info.plist
generated
Normal 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>
|
||||
5
Pods/Target Support Files/LSTPopView/LSTPopView-dummy.m
generated
Normal file
5
Pods/Target Support Files/LSTPopView/LSTPopView-dummy.m
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
@interface PodsDummy_LSTPopView : NSObject
|
||||
@end
|
||||
@implementation PodsDummy_LSTPopView
|
||||
@end
|
||||
12
Pods/Target Support Files/LSTPopView/LSTPopView-prefix.pch
generated
Normal file
12
Pods/Target Support Files/LSTPopView/LSTPopView-prefix.pch
generated
Normal 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
|
||||
|
||||
19
Pods/Target Support Files/LSTPopView/LSTPopView-umbrella.h
generated
Normal file
19
Pods/Target Support Files/LSTPopView/LSTPopView-umbrella.h
generated
Normal 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[];
|
||||
|
||||
14
Pods/Target Support Files/LSTPopView/LSTPopView.debug.xcconfig
generated
Normal file
14
Pods/Target Support Files/LSTPopView/LSTPopView.debug.xcconfig
generated
Normal 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
|
||||
6
Pods/Target Support Files/LSTPopView/LSTPopView.modulemap
generated
Normal file
6
Pods/Target Support Files/LSTPopView/LSTPopView.modulemap
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
framework module LSTPopView {
|
||||
umbrella header "LSTPopView-umbrella.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
14
Pods/Target Support Files/LSTPopView/LSTPopView.release.xcconfig
generated
Normal file
14
Pods/Target Support Files/LSTPopView/LSTPopView.release.xcconfig
generated
Normal 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
|
||||
26
Pods/Target Support Files/LSTTimer/LSTTimer-Info.plist
generated
Normal file
26
Pods/Target Support Files/LSTTimer/LSTTimer-Info.plist
generated
Normal 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>
|
||||
5
Pods/Target Support Files/LSTTimer/LSTTimer-dummy.m
generated
Normal file
5
Pods/Target Support Files/LSTTimer/LSTTimer-dummy.m
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
@interface PodsDummy_LSTTimer : NSObject
|
||||
@end
|
||||
@implementation PodsDummy_LSTTimer
|
||||
@end
|
||||
12
Pods/Target Support Files/LSTTimer/LSTTimer-prefix.pch
generated
Normal file
12
Pods/Target Support Files/LSTTimer/LSTTimer-prefix.pch
generated
Normal 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
|
||||
|
||||
17
Pods/Target Support Files/LSTTimer/LSTTimer-umbrella.h
generated
Normal file
17
Pods/Target Support Files/LSTTimer/LSTTimer-umbrella.h
generated
Normal 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[];
|
||||
|
||||
12
Pods/Target Support Files/LSTTimer/LSTTimer.debug.xcconfig
generated
Normal file
12
Pods/Target Support Files/LSTTimer/LSTTimer.debug.xcconfig
generated
Normal 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
|
||||
6
Pods/Target Support Files/LSTTimer/LSTTimer.modulemap
generated
Normal file
6
Pods/Target Support Files/LSTTimer/LSTTimer.modulemap
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
framework module LSTTimer {
|
||||
umbrella header "LSTTimer-umbrella.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
12
Pods/Target Support Files/LSTTimer/LSTTimer.release.xcconfig
generated
Normal file
12
Pods/Target Support Files/LSTTimer/LSTTimer.release.xcconfig
generated
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -122,6 +122,64 @@ SOFTWARE.
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>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.
|
||||
</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 <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.
|
||||
</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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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}/.
|
||||
|
||||
@@ -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}/.
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
16
keyBoard/Class/Home/V/HomeHeadView.h
Normal file
16
keyBoard/Class/Home/V/HomeHeadView.h
Normal 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
|
||||
20
keyBoard/Class/Home/V/HomeHeadView.m
Normal file
20
keyBoard/Class/Home/V/HomeHeadView.m
Normal 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
|
||||
@@ -3,7 +3,7 @@
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/5.
|
||||
//
|
||||
// HomeSheetVC 三角指示器
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <HWPanModal/HWPanModalPresentable.h>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
16
keyBoard/Class/Home/VC/KBTestVC.h
Normal file
16
keyBoard/Class/Home/VC/KBTestVC.h
Normal 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
|
||||
94
keyBoard/Class/Home/VC/KBTestVC.m
Normal file
94
keyBoard/Class/Home/VC/KBTestVC.m
Normal 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
|
||||
Reference in New Issue
Block a user