代码风格篇
- 常量
1.宏以小写k开头+模块前缀+具体描述
#define kLQWeakSelf __weak typeof(self) weakSelf = self
2.全局变量以小写k开头+模块前缀+具体描述,如果是需要供外界模块调用,则在.h文件以extern
或者UIKIT_EXTERN
声明
/// .h
UIKIT_EXTERN NSString *const kAOrgInfoKey;
/// .m
NSString *const kAOrgInfoKey = @"A_orgInfoKey";
3.property声明中同一类属性放在一块,不同类类换行写,如果可读不可改,则必须使用readonly
@interface LQMineViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UIView *headView;
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, copy) NSArray<LQMineData *> *cellDatas;
@end
4.合理使用static,一般使用在单例或者滚动控件cell复用,其命名规范和常量一样
static NSString *kAMineCellIdentifier = @"A_mineCellIdentifier";
5.通知以小写k开头+模块前缀+Noti+具体描述
#define kANotiCompanyChanged @"A_notiCompanyChanged"
6.自定义block,以模块前缀+描述+block
typedef void (^DServiceViewBlock)(NSString *selectedTitle);
-
方法编写规范
1.前括号提至方法后
2.同一模块功能代码写在一起
3.不同模块功能换行写
4.系统的方法重写不写具体细节,细节实现以自定义方法加载
- (void)viewDidLoad {
[super viewDidLoad];
[self setupHeadView];
[self setupTableView];
[self getCellDatas];
}
- 方法归类
#pragma mark --- life cycle
///code ...
///上空一行
///下空一行
#pragma mark --- event
///code ...
///上空一行
///下空一行
#pragma mark --- request
///code ...
///上空一行
///下空一行
#pragma mark --- xxxDelegate
///code ...
///上空一行
///下空一行
#pragma mark --- lazy
- UIViewController方法分类
#pragma mark --- life cycle
- (instancetype)init
- (instancetype)initWithCoder:(NSCoder *)coder
- (void)loadView
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews
- (void)delloc
以上是属于life cycle的,子控件在`viewDidLoad `写入,frame更新在`viewWillLayoutSubviews`中完成
#pragma mark --- lazy
主要完成子控件的创建、属性的设置
- (ExtendClickButton *)backBtn {
if (!_backBtn) {
_backBtn = [[ExtendClickButton alloc] init];
[_backBtn setImage:kLQImageNamed(@"LR_ArrowLeftBlack") forState:UIControlStateNormal];
_backBtn.leftX = (_backBtn.rightX = 10);
_backBtn.top = (_backBtn.bottom = 10);
_backBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[_backBtn addTarget:self action:@selector(p_clickBackButton:) forControlEvents:UIControlEventTouchUpInside];
}
return _backBtn;
}
不在懒加载里实现加入类似 `[self.view addSubview: _backBtn]`
-
类声明
注明类的用途,属性和方法的注释,同类一块,非同类换行分离;少用#import,多用@class,@protocol
#import "LQBaseViewController.h"
///新账号登录
@interface LRNewAccountController : LQBaseViewController
///验证码验证成功回调
@property (nonatomic, copy) dispatch_block_t codeSuccessBlock;
///成功登录回调,如果为空则默认切换为主入口
@property (nonatomic, copy) dispatch_block_t logSuccessBlock;
///默认手机号,非必传
@property (nonatomic, copy) NSString* phone;
@end
模块层级划分
以下为模块内部的架构图
image.gif
- 主模块由公共部分和私有部分组成
- 公共部分由Header、Home Controller和Public组成。Public由共享给外部的文件和Mediator分类组成,是其他模块访问该模块的api集合。Header里主要放置的是预编译的.h文件、模块公开的常量/宏、通知等。之所以把Home Controller放在模块最外层暴露,是为了开发人员快速的找到模块入口
- 私有部分,是模块内部业务处理部分,是不允许模块外直接访问修改引用的。主要由Home,Actions和Sub Modules组成
- Home:放置模块首页的功能文件,根据功能的复杂程度可以分为普通模式和子模块模式。如果首页简单,则可直接把view/model等直接放置在一起;若首页比较复杂,可以采取子块分隔的方式组织,每个子块内部根据业务复杂度又可按照整个Module Architecture递归拆解。
-
Actions:模块方法api集合,分为Module-In Api和Module-Out Api。Module-In Api:主要是供内部子模块使用,原则上各个子模块内是单独封闭的,不能直接访问,主要是为了以后维护方便,根据后期发展子模块根据体量大小可单独抽离成一个Main Module。另外Module-In Api的方法定义不能以Action_native开头,用于区别内外之别
Module-Out Api:主要是供模块外使用,按照严格的命名格式定义selector name,以Action_native开头 -
Sub Modules:子模块,根据Main Module包含的业务板块进行划分,必须很熟悉Main Module的产品功能和未来可能的走向,sub module不在功能多少或复杂度,主要以功能的唯一性、同理性且整体的形成一个完成的功能闭环为拆分标准。这些子模块如何组织业务代码,这里没做任何限制,mvc、mvp、mvvm都可以,那种方式适合就使用那种。子模块拆分合理,以后对于业务扩张分隔非常有用。
image.png
暗黑模式适配
(系统:iOS13及以上)暗黑模式适配就是文字颜色、背景颜色、图片的适配,颜色主要是黑白灰,其他彩色的不变。
-
颜色适配
颜色适配统一更改为设置系统动态颜色值,去除配置color set中的可视化配置,并配合宏可自定义系统动态颜色宏
/// 如果系统版本大于器或者等于13.0,则为设置系统动态颜色,其他则只是设置lightColor
/// @param lightColor 正常模式颜色,hex string
/// @param darkColor 暗黑模式颜色,hex string
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor darkColor:(NSString *_Nonnull)darkColor;
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor lightAlpha:(CGFloat)lightAlpha darkColor:(NSString *_Nonnull)darkColor darkAlpha:(CGFloat)darkAlpha;
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor darkColor:(NSString *_Nonnull)darkColor {
return [self dynamicLightColor:lightColor lightAlpha:1.0 darkColor:darkColor darkAlpha:1.0];
}
+ (UIColor * _Nonnull)dynamicLightColor:(NSString * _Nonnull)lightColor lightAlpha:(CGFloat)lightAlpha darkColor:(NSString *_Nonnull)darkColor darkAlpha:(CGFloat)darkAlpha {
if (@available(iOS 13.0, *)) {
UIColor* color = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
return [[UIColor colorWithHexString:darkColor] colorWithAlphaComponent:darkAlpha];
}else {
return [[UIColor colorWithHexString:lightColor] colorWithAlphaComponent:lightAlpha];;
}
}];
return color;
}else {
return [[UIColor colorWithHexString:lightColor] colorWithAlphaComponent:lightAlpha];;
}
}
///系统宏
#define kLQDynamicColor(light,dark) ([UIColor dynamicLightColor:light darkColor:dark])
#define kLQDynamicColorAlpha(light,alpha1,dark,alpha2) ([UIColor dynamicLightColor:light lightAlpha:alpha1 darkColor:dark darkAlpha:alpha2])
#define kLQAlertBGColor kLQDynamicColor(@"FFFFFF",@"2E2E2E")
#define kLQAlertLineColor kLQDynamicColor(@"E5E5E5",@"414141")
#define kLQAlertSVBGColor kLQDynamicColor(@"E5E5E5",@"232323")
#define kLQBackgroundColor kLQDynamicColor(@"F7F7F7",@"000000")
#define kLQBarIconColor kLQDynamicColorAlpha(@"575757",1.0,@"FFFFFF",0.65)
#define kLQBlackColor kLQDynamicColor(@"000000",@"FFFFFF")
#define kLQCardColor kLQDynamicColor(@"FFFFFF",@"232323")
#define kLQLineColor kLQDynamicColorAlpha(@"000000",0.1,@"FFFFFF",0.2)
#define kLQNaviBGColor kLQDynamicColor(@"FFFFFF",@"121212")
#define kLQSearchBGColor kLQDynamicColor(@"F2F2F2",@"232323")
#define kLQWhiteColor kLQDynamicColor(@"FFFFFF",@"121212")
#define kLQAuxiliaryColor kLQDynamicColorAlpha(@"999999",1.0,@"FFFFFF",0.6)
#define kLQContentColor kLQDynamicColorAlpha(@"575757",1.0,@"FFFFFF",0.85)
#define kLQDisableColor kLQDynamicColorAlpha(@"CCCCCC",1.0,@"FFFFFF",0.45)
#define kLQPlaceHoldColor kLQDynamicColorAlpha(@"BBBBBB",1.0,@"FFFFFF",0.55)
#define kLQSecondaryColor kLQDynamicColorAlpha(@"7D7D7D",1.0,@"FFFFFF",0.65)
#define kLQTitleColor kLQDynamicColorAlpha(@"0A0A17",1.0,@"FFFFFF",1.0)
-
图片适配
image.png
图片适配统一使用创建image set来设置dark image
-
特殊处理
1.CALayer相关颜色和图片设置设置动态颜色或者图片无效,这时需根据控件的UITraitEnvironment
协议里的方法去手动处理
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange: previousTraitCollection];
self.layer.backgroundColor = kLQWhiteColor;
self.layer.image .....
}
网友评论