zoukankan      html  css  js  c++  java
  • 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"];
    
  • 相关阅读:
    ASP.NET中的Eval与DataBinder.Eval()方法
    数据库三范式
    某一公司的面试题目
    Gridview样式
    截取字符串代码
    C#文件IO操作
    随机生成验证码
    HTTP 错误 401.2 Unauthorized 由于身份验证头无效,您无权查看此页。 IIS7.0解决办法
    危险字符过滤的类
    asp.net面试题新手必备
  • 原文地址:https://www.cnblogs.com/SimonGao/p/5472705.html
Copyright © 2011-2022 走看看