步骤:
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. 解析界面的实例
@property (nonatomic, strong) SkinParser* skinParser;
2.3.2. 解析准备
//通过指定文件名创建一个 SkinParser, 我们这里直接使用了当前类名
_skinParser = [SkinParser getParserByName:NSStringFromClass([self class])]; //eventTarget 是指定在解析 UIButton 或者说 UIControl 时,
// addTarget: eventTarget forState:xxx
//viewController里只实现通过json里指定的方法就可以了,不需要用代码绑定
_skinParser.eventTarget = self;
设置布局文件目录,如果不设置,则刷新也没有反应
在AppDelegate中设置一次就好了:
__FILE__是获取当前文件的路径,所以,还不能在多个地方重复设置。
#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中的对象到属性中
-(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时刷新界面
#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. 定时刷新
该布局模块的配套刷新,没有封装到模块里面,可以自己封装进入:
//
// 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
//
// 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
使用示例:
#if DEBUG
refresh = [EALayoutRefresh shareInstance];
refresh.delegate = self;
#endif
这样,就可以在编码的时候,随时看到效果。
3. 修改framework
3.1. 添加属性“propertyName”
用于关联到对象
m_imageLeft = (UIImageView*)[_skinParser getViewByName:@"leftImage"];