步骤:

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"];

EALayout 实践的更多相关文章

  1. iOS 界面 之 EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具

    http://blog.csdn.net/fatherhui iOS开发,EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具 EALa ...

  2. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

  3. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  4. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  5. Logstash实践: 分布式系统的日志监控

    文/赵杰 2015.11.04 1. 前言 服务端日志你有多重视? 我们没有日志 有日志,但基本不去控制需要输出的内容 经常微调日志,只输出我们想看和有用的 经常监控日志,一方面帮助日志微调,一方面及 ...

  6. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  7. Windows平台分布式架构实践 - 负载均衡

    概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...

  8. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  9. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

随机推荐

  1. Sublime Text 最佳插件列表

    http://blog.jobbole.com/79326/ 推荐!Sublime Text 最佳插件列表 2014/07/25 · 工具与资源 · 26.1K 阅读 · 2 评论 · Sublime ...

  2. MySQL 建表

    SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for ` ...

  3. Django: 之数据库导入、迁移和联用

    Django 数据库导入 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1 ...

  4. Linux通过防火墙禁止IP来防止攻击

    1. iptables -I INPUT -s 211.1.0.0 -j DROP 禁止211.1.0.0这个IP访问服务器 2. iptables -I INPUT -s 211.1.0.0 -j ...

  5. 安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法

    在android4.0源码里面编译出来apk后,用adb install (或adb install -r 重装)安装时,报错[INSTALL_FAILED_DEXOPT]. xu@xu-PC:~$  ...

  6. emacs format

    格式化源码是很常见的需求,emacs有个indent-region函数用于格式化选定的代码,前提是你处在某个非text mode下,如c-mode或者java-mode之类.如果要格式化整个文件,你需 ...

  7. jQuery常用及基础知识总结(二)

    JQuery Effects 方法说明 show( ) 显示隐藏的匹配元素.show( speed, [callback] ) 以优雅的动画显示所有匹配的元素,并在显示完成后可选地触发一个回调函数.h ...

  8. 怎么把一个int数组转化为char型数组??

    /* 234 Press any key to continue */ #include <stdio.h> int main() { ,n; ]; ; num; ++n) { s[n] ...

  9. Java时间操作(一):关于UTC格式时间处理

    Java中获取形如:20160811T122132+08 格式,可以通过如下方法 package com.mc.others; public class UTCTimeTest { @Test pub ...

  10. 转html5语义化标签总结一

    HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...