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. 解析界面的实例

@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"];
原文地址:https://www.cnblogs.com/SimonGao/p/5472705.html