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

 

posted on   大木哥  阅读(433)  评论(0编辑  收藏  举报

< 2025年2月 >
26 27 28 29 30 31 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 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示