EALayout 实践
步骤:
1. 导入framework
1.0. 下载网址
1.1. 修改Build Setting -> other linker flags,添加 “-ObjC”(连接实现文件)和"-lstdc++"(c++库)
1.2. 将CodeSnippets 内容放在 ~/Library/Developer/Xcode/UserData/CodeSnippets 目录下,起到提示作用。
2. 编码
2.1. 生成文件 .json
2.2. 在要引入布局的页面,添加头文件#import <EALayout/EALayout.h>
2.3. 解析json文件
2.3.1. 解析界面的实例
1 | @property ( nonatomic , strong) SkinParser* skinParser; |
2.3.2. 解析准备
1 2 3 4 5 6 7 | //通过指定文件名创建一个 SkinParser, 我们这里直接使用了当前类名 _skinParser = [SkinParser getParserByName: NSStringFromClass ([ self class ])]; //eventTarget 是指定在解析 UIButton 或者说 UIControl 时, // addTarget: eventTarget forState:xxx //viewController里只实现通过json里指定的方法就可以了,不需要用代码绑定 _skinParser.eventTarget = self ; |
设置布局文件目录,如果不设置,则刷新也没有反应
在AppDelegate中设置一次就好了:
1 | __FILE__是获取当前文件的路径,所以,还不能在多个地方重复设置。 |
1 2 3 4 5 6 7 8 9 10 11 | #pragma mark - EALayout设置解析视图路径路径 - ( void ) skinPathEALayout { #if TARGET_IPHONE_SIMULATOR NSString * absolutePath = [ NSString stringWithUTF8String:__FILE__]; NSString * skinPath = [[absolutePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@ "ViewJson" ]; [SkinMgr sharedInstance].skinPath = skinPath; #endif } |
2.3.3. 解析json中的对象到属性中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -( void )loadView { [ super loadView]; //从json里读取叫 @"selfView" 的一个节点, 将属性解析到 参数 self.view 中 //如果参数 self.view 为 nil , 那在selfView里必须指名 class 属性,以便自动创建,并且返回创建的对象。 //如果 view参数为 nil, 也可以使用 UIView* view = [_skinParser parse:@"aViewName"]; [_skinParser parse:@ "selfView" view: self .view]; } -( void )viewDidLoad { [ super viewDidLoad]; //计算布局 //在代码里对某个控件设置了属性,会影响布局的,就需要调用 spUpdateLayout //如 修改了 UILabel* label; 需要调用 [label.superview spUpdateLayout] //可以在修改多个控件属性后,再找到一个统一上层的父view, 调用一次即可 [ self .view spUpdateLayout]; [ self .view spUpdateLayout]; } |
2.3.4. 修改json时刷新界面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #if DEBUG -( void )freshSkin { //当刷新json时,此函数被调用 //可根据实际情况,自行修改, #if TARGET_IPHONE_SIMULATOR self .view = [[UIView alloc] init]; _skinParser = [SkinParser getParserByName: NSStringFromClass ([ self class ])]; _skinParser.eventTarget = self ; [ self loadView]; [ self viewDidLoad]; #else //真机上调试界面 #endif } #endif |
2.3.5. 定时刷新
该布局模块的配套刷新,没有封装到模块里面,可以自己封装进入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // // EALayoutRefresh.h // EALayout // // 封装刷新界面功能 // // Created by Simon on 16/5/9. // Copyright © 2016年 easylayout. All rights reserved. // #import <Foundation/Foundation.h> @protocol EALayoutRefreshDelegate < NSObject > @optional - ( void ) refreshEALayout; @end @interface EALayoutRefresh : NSObject @property (weak, nonatomic ) id <EALayoutRefreshDelegate> delegate; +( id )shareInstance; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | // // EALayoutRefresh.m // EALayout // // Created by Simon on 16/5/9. // Copyright © 2016年 easylayout. All rights reserved. // #import "EALayoutRefresh.h" @interface EALayoutRefresh (){ NSTimer * m_timer; } @end @implementation EALayoutRefresh static EALayoutRefresh * shareEALayout = nil ; +( id )shareInstance { static dispatch_once_t predicate; dispatch_once(&predicate, ^{ shareEALayout = [[ self alloc] init]; [shareEALayout refresh]; }); return shareEALayout; } - ( void ) refresh { [ self createTimer]; if ([ self .delegate respondsToSelector: @selector (refreshEALayout)]){ [ self .delegate refreshEALayout]; } } - ( void ) createTimer { if (!m_timer) { NSTimeInterval ds = 1; m_timer = [ NSTimer scheduledTimerWithTimeInterval:ds target: self selector: @selector (refresh) userInfo: nil repeats: YES ]; } } @end |
使用示例:
1 2 3 4 | #if DEBUG refresh = [EALayoutRefresh shareInstance]; refresh.delegate = self ; #endif |
这样,就可以在编码的时候,随时看到效果。
3. 修改framework
3.1. 添加属性“propertyName”
用于关联到对象
1 | m_imageLeft = (UIImageView*)[_skinParser getViewByName:@ "leftImage" ]; |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步