前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS小技能: 网络加载中处理、接口暂无数据处理、全局监听用户点击事件

iOS小技能: 网络加载中处理、接口暂无数据处理、全局监听用户点击事件

作者头像
公众号iOS逆向
发布于 2022-08-22 04:38:02
发布于 2022-08-22 04:38:02
79200
代码可运行
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
运行总次数:0
代码可运行

引言

在日常开发中经常涉及数据列表的查询,处理服务侧无数据返回的情况或者网络异常的手段是iOS必备小技能。

如果是iOS新手,可以先看第三章节的预备知识。

I 网络加载中处理

本文以SVProgressHUD框架为例子进行讲解

1.1 UIWindowLevel

UIWindowLevel级别的高低顺序从小到大为Normal < StatusBar < Alert,Level高的将排在所有Level比他低的层级的前面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar API_UNAVAILABLE(tvos);

SVProgressHUD 相关方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [SVProgressHUD setMaxSupportedWindowLevel:UIWindowLevelStatusBar];

1.2 图层样式

默认图层样式显示的时候,允许用户交互适合大部分场景。但是像注册、登录、切换账号的场景建议使用不允许交互样式。

请求包含这些关键字的API时,建议不允许交互 :CreateAddUpdateDeleteBindSubmitSaveLoginChangeSetEditModifyCancelSendCheckAudit

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) {
    SVProgressHUDMaskTypeNone = 1,  // default mask type, allow user interactions while HUD is displayed
    SVProgressHUDMaskTypeClear,     // don't allow user interactions with background objects
    SVProgressHUDMaskTypeBlack,     // don't allow user interactions with background objects and dim the UI in the back of the HUD (as seen in iOS 7 and above)
    SVProgressHUDMaskTypeGradient,  // don't allow user interactions with background objects and dim the UI with a a-la UIAlertView background gradient (as seen in iOS 6)
    SVProgressHUDMaskTypeCustom     // don't allow user interactions with background objects and dim the UI in the back of the HUD with a custom color
};

  1. 加载框展示自定义图片:setInfoImage:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置加载信息
    NSString *path = [[NSBundle mainBundle] pathForResource:@"加载" ofType:@"gif"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    UIImage *image = [UIImage sd_imageWithGIFData:data];
    [SVProgressHUD setInfoImage:image];
    [SVProgressHUD setImageViewSize:CGSizeMake(60, 60)];
    [SVProgressHUD showInfoWithStatus:@""];
  1. 使用默认样式展示相关文字信息:showWithStatus
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [SVProgressHUD setBackgroundColor: [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.30]];
    [SVProgressHUD setForegroundColor: UIColor.whiteColor];
    [SVProgressHUD setMaximumDismissTimeInterval:0.5];//
    [SVProgressHUD showWithStatus:@"加载中..."];

1.3 灵活控制是否允许交互

思路:通过请求方法入口进行控制是否允许交互 实现步骤:

  1. 配置不允许交互的URL
  2. 展示加载框时,判断URL是否允许交互,即在调用showLoadingDataGif时判断
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
//  ERPLoading.m
//  retail
//
//  Created by mac on 2022/8/10.
//  Copyright © 2022 QCT. All rights reserved.
//

#import "ERPLoading.h"

@interface ERPLoading ()

/**
 不允许交互的URL
 */
@property (strong, nonatomic) NSMutableArray *urls4no_allow_user_interactions;

@end

@implementation ERPLoading
HSSingletonM(ERPLoading);
//配置不允许交互的URL
- (NSMutableArray *)urls4no_allow_user_interactions{
    
    if(_urls4no_allow_user_interactions == nil){
        
        _urls4no_allow_user_interactions = [NSMutableArray array];
        //登录 /api/xxx/xxx
        [_urls4no_allow_user_interactions addObject:URL_Login];
        //切换门店
        [_urls4no_allow_user_interactions addObject:k_API_Users_ChangeStore];
        
    }
    
    return _urls4no_allow_user_interactions;
}

/**
 判断是否允许交互:
 URL参数是绝对路径,urls4no_allow_user_interactions数组中的元素是相对路径 因此先对URL去除域名部分,只留相对路径再进行内容的比较。

 */
+(BOOL)isAllow_user_interactions:(NSString*)url{
    NSString *separate =@"/api/";// 由于API格式统一是 /api/xxx/xxx,因此可以简单的采用字符串分割即可。
    url = [url componentsSeparatedByString:separate].lastObject;
    url= FMSTR(@"%@%@",separate,url);// 这里可以拼接上分隔符之后直接调用数组的containsObject方法进行比较,也可以采用谓词技术进行匹配https://blog.csdn.net/z929118967/article/details/74066170
    NSLog(@"relativeString:%@",url);
    
    if([[ERPLoading shareERPLoading].urls4no_allow_user_interactions containsObject:url])
        
    {
        [self no_allow_user_interactions];
        return NO;
    }
    [self allow_user_interactions];
    return YES;
}

//allow user interactions
+(void)allow_user_interactions{
    [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeNone];
}
//don't allow user interactions
+(void)no_allow_user_interactions{
    [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeCustom];
}
// 加载的gif
+ (void)showLoadingDataGifWith:(NSString*)url{
    //1. 判断是否允许交互
    [self isAllow_user_interactions:url];
// 2. 设置加载信息
    NSString *path = [[NSBundle mainBundle] pathForResource:@"加载" ofType:@"gif"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    UIImage *image = [UIImage sd_imageWithGIFData:data];
    [SVProgressHUD setInfoImage:image];
    [SVProgressHUD setImageViewSize:CGSizeMake(60, 60)];
    [SVProgressHUD setBackgroundColor:[UIColor clearColor]];
//    [SVProgressHUD setBackgroundColor: [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.30]];
//    [SVProgressHUD setForegroundColor: UIColor.whiteColor];

    // 设置最小显示时长。default is 0 seconds
//    [SVProgressHUD setMinimumDismissTimeInterval:0.4];
    [SVProgressHUD setBackgroundLayerColor:STModalWindowDefaultBackgroundColor];
    [SVProgressHUD showInfoWithStatus:@""];
}
// 隐藏gif
+ (void)hiddenLoadingDataGif{
    [SVProgressHUD dismiss];
}
@end

1.4 点击空白处隐藏提示框

实现思路: 自定义应用对象UIApplication来全局监听用户点击事件

实现步骤:

  1. 自定义应用,并重写sendEvent:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@implementation ERPApplication

- (void)sendEvent:(UIEvent *)event
{
    //如果调用了[super touches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者。
    [super sendEvent:event];//这里一定不能漏掉
    ///点击空白处隐藏提示框:
    [ERPLoading setupTouch4hiddenLoadingDataGif:event];
    
}


  1. 在main方法创建应用对象的传递自定义的应用对象类型。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 int UIApplicationMain(int argc, char * _Nullable *argv, NSString *principalClassName, NSString *delegateClassName);
// Creates the application object and the application delegate and sets up the event cycle.
  1. 点击空白处隐藏提示框:监听点击事件,如果是允许交互的样式SVProgressHUDMaskTypeNone则调用dismiss。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+ (void)setupTouch4hiddenLoadingDataGif:(UIEvent *)event{
    

    //当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象;一根手指对应一个UItouch对象。
    //UItouch保存着跟手指相关的信息,比如触摸的位置、时间、阶段。
    //根据touches中UITouch的个数可以判断出是单点触摸还是多点触
    NSSet *allTouches = [event allTouches];

    if ([allTouches count] <= 0)

    {
        return ;
        
    }
    
    UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;

    if (phase != UITouchPhaseBegan){
        
        return ;
    }

    
//点击空白处隐藏提示框:点击空白处隐藏提示框: 监听点击事件,如果是允许交互的样式SVProgressHUDMaskTypeNone则调用dismiss。
    SVProgressHUD *sharedView =[self sharedView];
    
    NSLog(@"%@:defaultMaskType: %lu send event",UIApplication.sharedApplication,(unsigned long)sharedView.defaultMaskType);
    
    
    if(sharedView.defaultMaskType == SVProgressHUDMaskTypeNone ){
        [self hiddenLoadingDataGif];
    }


}

+(SVProgressHUD*)sharedView{
    
    return  [SVProgressHUD performSelector:@selector(sharedView)];
    
    
}

II 暂无数据处理

网络请求失败,业务逻辑错误,返回数据为空都是需要处理界面的显示,推荐使用暂无数据进行提示。

在这里插入图片描述

2.1 用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        if (weakSelf.viewModel.listDataArray.count == 0) {
            [weakSelf.viewModel.ShowNoviewSubject sendNext:QCTLocal(CRM_nodata_Info)];
            
        }else{
            [weakSelf.viewModel.hidenNoviewSubject sendNext:nil];
            
        }

2.2 核心实现

V层初始化暂无数据视图:将视图添加到tableView,这样可以不影响下拉刷新和上拉加载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (CRMNoDatatView *)NoView{
    
    if (nil == _NoView) {
        
        CRMNoDatatView *tmpView = [[CRMNoDatatView alloc]init];
        
        _NoView = tmpView;
        [self.tableView addSubview:_NoView];
        
        __weak __typeof__(self) weakSelf = self;
        
        
        [_NoView mas_makeConstraints:^(MASConstraintMaker *make) {
            
            
            make.centerY.equalTo(weakSelf.tableView.mas_centerY).offset(kAdjustRatio(k_noteViewH));
            make.width.equalTo(weakSelf);
            
            
            
            make.left.right.bottom.equalTo(weakSelf.tableView);//tableView


            
        }];
        
        
        
    }
    return _NoView;
}



- (void)ShowNoview:(NSString *)title img:(NSString*)imgName
{

    
    self.NoView.title = title;
    
    self.NoView.imgName = imgName;
    
    [self.tableView bringSubviewToFront:self.NoView];
    
}

V层监听C层的事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [self.viewModel.hidenNoviewSubject subscribeNext:^(id  _Nullable x) {
        weakSelf.NoView.hidden = YES;
    }];
    
    [self.viewModel.ShowNoviewSubject subscribeNext:^(id  _Nullable x) {
        weakSelf.NoView.hidden = NO;
        
        [weakSelf ShowNoview:x img:@"img_kongbai_zanwu"];

        
        
    }];

暂无数据视图的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 显示暂无数据图片
- (UIImageView *)imageV{
    if (nil == _imageV) {
        UIImageView *tmpView = [[UIImageView alloc]init];
        _imageV = tmpView;
        
        _imageV.contentMode = UIViewContentModeScaleAspectFit;

        _imageV.image = [UIImage imageNamed:@"icon_wushuju"];

        [self addSubview:_imageV];
        __weak __typeof__(self) weakSelf = self;

        
        [_imageV mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.equalTo(weakSelf);
            make.centerY.equalTo(weakSelf).offset(-kAdjustRatio(35));

            make.left.equalTo(weakSelf).offset(kAdjustRatio(33));
            
            make.right.equalTo(weakSelf).offset(kAdjustRatio(-33));
            
            

        }];
    }
    return _imageV;
}


//显示暂无数据文本
- (UILabel *)label{
    if (nil == _label) {
        UILabel *tmpView = [[UILabel alloc]init];
        _label = tmpView;
        [self addSubview:_label];
        __weak __typeof__(self) weakSelf = self;

        
        [_label mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.centerX.equalTo(weakSelf);
            make.top.equalTo(weakSelf.imageV.mas_bottom).offset(kAdjustRatio(22));
            
        
        _label.textAlignment = NSTextAlignmentCenter;

        
        _label.font = kPingFangFont(15);
        _label.textColor = rgb(51,51,51);

    }
    return _label;
}




// 更新图片数据
-(void)setImgName:(NSString *)imgName{
    _imgName = imgName;
    
    
    if (imgName.length<=0) {
        return;
    }
    [self.imageV setImage:[UIImage imageNamed:imgName]];
    
    
        self.reloadbtnView.hidden = !self.isShowReloadBtn;
//    }
}

- (void)setTitle:(NSString *)title{
    _title = title;
    
    self.label.text = title;
}

III 预备储备:Target-Action设计模式的运用

Target-Action指当某个事件发生的时候,调用特定对象的特定方法。https://blog.csdn.net/z929118967/article/details/108011011

3.1 响应者链

在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称之为“响应者对象”。UIApplication、UIViewController、UIView都继承于UIResponder。

UIResponder内部提供了以下方法来处理事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//一根或者多根手指开始触摸view,系统会自动调用view的下面方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//一根或者多根手指离开view,系统会自动调用view的下面方法
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view的下面方法[可选]
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;


响应者链的事件传递过程

Responder Chain(响应者链)【上篇】:https://kunnan.blog.csdn.net/article/details/122809496

Responder Chain(响应者链)【下篇】:https://kunnan.blog.csdn.net/article/details/122811653

3.2 限制按钮的点击频率

在项目开发中,会对数据库数据进行更新操作的接口请求,不仅服务器侧需要控制请求频率以及保证数据的唯一性和一致性,app侧也需要进行限制来避免产生垃圾数据。

常用的方案有:

  1. 限制按钮的点击频率: 针对注册类接口的时间间隔timeInterval可设置长些,推荐0.5s
  2. 新增标志对单个接口进行请求频率的控制

3.2 右滑返回

原理:利用系统的返回手势interactivePopGestureRecognizer进行实现

使用场景:返回按钮有点小,不好触发返回时,可借助右滑返回来提升用户体验

https://blog.csdn.net/z929118967/article/details/118798618

3.3 应用程序初识

https://blog.csdn.net/z929118967/article/details/123184534每一个应用都有自己的UIApplication对象,而且是单例的;[UIApplication sharedApplication]

  1. 一个iOS程序启动后创建的第一个对象,就是UIApplication对象
  2. 利用UIApplication对象可以进行一些应用级的操作: 状态栏管理、事件处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(int argc, char * argv[]) {
    @autoreleasepool {
        //principalClassName:        The name of the UIApplication class or subclass. If you specify nil, UIApplication is assumed.
//ERPApplication
        
        return UIApplicationMain(argc, argv, @"ERPApplication", NSStringFromClass([AppDelegate class]));
        
    }
}

  1. 在app受到干挠(来电、锁屏)时,会产生些系统事件,让delegate处理这些系统事件
  • 应用程序的生命周期(程序启动、关闭): 处理苹果服务器推送的消息。
  • 系统事件(来电)
  • 内存警告
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS-UITouch事件处理详解1. iOS中的事件基本介绍2.UITouch3.UIEvent4. 事件的产生和传递5. 通过UITouch方法监听View的触摸事件的缺点
1. iOS中的事件基本介绍 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象” UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 1.1 事件可以分为三大类型,并且UIResponder内部提供了相应方法来处理事件 1. 触摸事件 //一根或者多根手指开始触摸view时自动调用view的下面方法 - (void)touchesBegan
xx_Cc
2018/05/10
1.7K0
iOS 小技能: Responder Chain(响应者链)【上篇】
在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称之为“响应者对象”。
公众号iOS逆向
2022/08/22
1.2K0
iOS 小技能: Responder Chain(响应者链)【上篇】
史上最详细的iOS之事件的传递和响应机制-原理篇
按照时间顺序,事件的生命周期是这样的:   事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view、寻找最合适的view的底层实现、拦截事件的处理)->找到最合适的view后事件的处理(touches方法的重写,也就是事件的响应)
VV木公子
2018/06/05
11.5K0
史上最详细的iOS之事件的传递和响应机制-原理篇
iOS 小技能: Responder Chain(响应者链)【下篇】
4个触摸事件处理方法中,都有NSSet *touches和UIEvent *event两个参数。
公众号iOS逆向
2022/08/22
1K0
iOS 小技能: Responder Chain(响应者链)【下篇】
iOS-控件响应用户控制事件之事件处理
事件处理 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象” UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 UIResponder内部提供了以下方法来处理事件 这些类可以覆盖下列几个方法处理不同的触摸事件 ```objc //触摸事件 (void)touchesBegan:(NSSet )touches with
用户1941540
2018/05/11
1K0
UI篇-UIResponder之事件传递和响应精析
这篇文章只讨论触摸事件。对于触摸事件UIResponder内部提供了以下方法来处理事件:
進无尽
2018/09/12
2.6K0
UI篇-UIResponder之事件传递和响应精析
touchesBegan 触摸事件
1、在用户使用App过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型:
全栈程序员站长
2022/09/15
8820
iOS14开发-触摸与手势识别
用于描述触摸的窗口、位置、运动和力度。一个手指触摸屏幕,就会生成一个 UITouch 对象,如果多个手指同时触摸,就会生成多个 UITouch 对象。
YungFan
2021/05/10
2.4K0
iOS 中的事件响应
iOS 中的事件响应者主要分为两类,分别为UIResponder及UIGestureRecognizer,其中UIControl是一种比较特殊的UIResponder,所以本文将事件响应者分为以下三种类型进行讨论。
CoderStar
2022/08/24
2.9K0
iOS 中的事件响应
iOS视图滚动的时候控制导航条标题及公告视图的alpha(显示与隐藏)
应用场景:比如设计给我们的是一张黑色的返回箭头图.我们某个页面需要弄成白色的话.又不想重新设计一下新的图片
公众号iOS逆向
2021/07/29
1.7K0
touchesBegan 触摸事件一、概念介绍二、方法介绍三、参数介绍:touches四、参数介绍:event
一、概念介绍 在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: 事件类型.png 响应者对象UIResponder 在iOS中不是任何
用户2141756
2018/05/18
2.7K0
iOS中手势的应用1. 四类事件的主要方法2. 响应者链3. 手势识别功能(Gesture Recognizer)4. 手势的使用
iOS设备现如今大受欢迎的最重要原因之一就在于其开创了触控操作的潮流。发展到现在,无论是Android还是iPhone,现在APP与用户进行交互,基本上都是依赖于各种各样的触控事件。例如用户对屏幕进行了侧滑,APP就需要对这个手势进行相应的处理,给用户一个反馈。这些相应的事件就都是在UIResponder中定义的。 广告插播的措不及防:如果您要是觉得这篇文章让您有点收获,随手点个赞会让俺兴奋好久吶。 UIResponder大体有四类事件:触摸、加速计、远程控制、按压(iOS9.0以后出来的,3DTou
stanbai
2018/06/28
2.4K0
iOS小技能: 限制按钮的点击频率(Target-Action设计模式的运用)
在项目开发中,会对数据库数据进行更新操作的接口请求,不仅服务器侧需要控制请求频率以及保证数据的唯一性和一致性,app侧也需要进行限制来避免产生垃圾数据
公众号iOS逆向
2022/08/22
8930
iOS小技能: 限制按钮的点击频率(Target-Action设计模式的运用)
iOS开发实战-上架AppStore 通过内购和广告获得收益写在前面效果分析代码部分补充Demo地址
忽然发现手头上也没什么独立App,那就随便写个放到AppStore上吧,凑个数吧。哈哈哈。
gwk_iOS
2018/08/23
1.3K0
iOS开发实战-上架AppStore 通过内购和广告获得收益写在前面效果分析代码部分补充Demo地址
iOS_系统自带地图圆形区域选择范围
5.聚集操作:删除原理的大头针,在新经纬度添加大头针,并将地图移动到新的经纬度(反地理编码获得位置信息)
mikimo
2022/07/20
2.3K0
iOS_系统自带地图圆形区域选择范围
iOS开发之地图
在iOS开发中,地图也是很多App都需要使用的功能。本文主要对iOS中的地图知识点进行介绍。需要说明的是地图看似很复杂,其实它仅仅是一个控件,就和UIButton、UITableView等一样。本文代码环境为:Xcode 10.2。
YungFan
2019/05/10
1.2K0
iOS开发之地图
iOS 小技能:响应者链的事件传递过程、手势识别器的使用步骤、抽屉效果的实现
为了完成手势识别,必须借助于手势识别器UIGestureRecognizer。利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势。
公众号iOS逆向
2022/08/22
9170
iOS 小技能:响应者链的事件传递过程、手势识别器的使用步骤、抽屉效果的实现
iOS开发-RAC+MVVM练手项目 图床App写在前面准备工作界面设计首页历史关于后记
前段时间闲着无聊和盆友就搞了个图床站Chevereto-Free,忽然发现居然有API提供,而且很简单,只需要一个KEY就可以
gwk_iOS
2018/08/23
1K0
iOS开发-RAC+MVVM练手项目 图床App写在前面准备工作界面设计首页历史关于后记
【IOS开发进阶系列】手势专题
        iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:
江中散人_Jun
2023/10/16
5510
【IOS开发进阶系列】手势专题
一份走心的iOS开发规范
说是前言,其实也是本文诞生的目的。随着公司业务的不断增加,功能的快速迭代,app的业务线越来越多,代码体积变得越来越庞大。同时,app投入的开发者也也越来越多,不同的开发者的code风格千差万别。加之公司开发者人员变动,为了保证app稳定性,保证开发效率,统一开发风格。于是,这篇iOS开发规范应运而生。 因笔者现在所就职公司的开发规范主导编写,目前公司业务的迭代都在按照这个规范在有条不紊的进行。综合之前编写规范的经验,历时一个月的时间,断断续续重新梳理了一份比较全面、比较完整的iOS开发者规范,希望这些条条框框能够给正在阅读的你提供一些参考的价值。也希望越来越多的iOS开发者能够养成优秀的编码习惯。如果你觉得个别地方不妥或者有需要补充的规范,请留言或者私信,我会第一时间响应。
VV木公子
2018/06/05
12.1K0
推荐阅读
相关推荐
iOS-UITouch事件处理详解1. iOS中的事件基本介绍2.UITouch3.UIEvent4. 事件的产生和传递5. 通过UITouch方法监听View的触摸事件的缺点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档