iOS json解析生成view

iOS中通過代碼生成view,不過是通過調(diào)用set方法對(duì)相關(guān)屬性進(jìn)行配置,由此可以考慮通過后臺(tái)傳遞相關(guān)數(shù)據(jù)進(jìn)行解析。

設(shè)計(jì)思路同RN、Weex原理類似,前者通過js進(jìn)行解析生成配置,我們這里通過對(duì)json解析進(jìn)行配置,盡管這種方式操作復(fù)雜,但是相對(duì)于前者性能更高優(yōu)(主要是不經(jīng)過js線程~~?。?。

目標(biāo)功能

可以實(shí)現(xiàn)在某個(gè)畫布(view)上進(jìn)行任意的生成特定ui樣式
可實(shí)現(xiàn)的界面.png

實(shí)現(xiàn)原理

string-》類型配置

很多屬性都是非string類型,那么為了實(shí)現(xiàn)支持string轉(zhuǎn)到配置,需要我們寫出相關(guān)方法,博主采用的是繼承的方案

@interface RuntimeLabel : UILabel
@property (nonatomic,copy) NSString *alignment_string;
@property (nonatomic,copy) NSString *font_color_string;
@property (nonatomic,copy) NSString *font_size_string;
@property (nonatomic,copy) NSString *line_breakmode_string;
@end
利用runtime方法解析

相信大家都不愿意每個(gè)方法都去走switch或者if然后進(jìn)行方法分發(fā),由此引出runtime去調(diào)用set方法即可

        NSString *setterName = v_key;
        NSString *firstLetter = [NSString stringWithFormat:@"%c", [setterName characterAtIndex:0]];
        setterName = [setterName substringFromIndex:1];
        setterName = [NSString stringWithFormat:@"%@%@", firstLetter.uppercaseString, setterName];
        setterName = [NSString stringWithFormat:@"set%@:", setterName];
        SEL setter = NSSelectorFromString(setterName);
        if ([subView respondsToSelector:setter]) {
            ((void (*)(id, SEL, id))objc_msgSend)(subView, setter,  [viewDict objectForKey:v_key]);
        }
專門解析view的類

有了上述準(zhǔn)備接下來就是對(duì)json文件的解析了,json文件是是對(duì)布局信息與view相關(guān)信息的描述

data_layoutArray json:[
  {
    "layout_style" : "horizontal_layout",
    "frame_string" : "{{0,70},{200,100}}",
    "bgcolor_hex_string" : "#00FF00",
    "layout_views" : [
      {
        "layout_margin" : "{10,10}",
        "layout_width_height" : "{30,30}",
        "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
        "view_class" : "RuntimeUIImageView"
      },
      {
        "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
        "frame_string" : "{{50,10},{30,30}}",
        "view_class" : "RuntimeUIImageView"
      },
      {
        "layout_margin" : "{10,10}",
        "layout_width_height" : "{30,30}",
        "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
        "view_class" : "RuntimeUIImageView"
      },
      {
        "layout_style" : "horizontal_layout",
        "frame_string" : "{{0,50},{100,50}}",
        "bgcolor_hex_string" : "#FF0000",
        "layout_views" : [
          {
            "layout_margin" : "{10,10}",
            "layout_width_height" : "{30,30}",
            "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
            "view_class" : "RuntimeUIImageView"
          }
        ]
      }
    ]
  },
  {
    "layout_style" : "vertical_layout",
    "frame_string" : "{{0,180},{300,420}}",
    "bgcolor_hex_string" : "#0000FF",
    "layout_views" : [
      {
        "layout_margin" : "{10,10}",
        "layout_width_height" : "{200,200}",
        "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
        "childs" : [
          {
            "layout_style" : "vertical_layout",
            "frame_string" : "{{10,10},{180,180}}",
            "bgcolor_hex_string" : "#FF0000",
            "layout_views" : [
              {
                "layout_margin" : "{60,20}",
                "layout_width_height" : "{60,60}",
                "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
                "view_class" : "RuntimeUIImageView"
              },
              {
                "layout_margin" : "{60,20}",
                "layout_width_height" : "{60,60}",
                "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
                "view_class" : "RuntimeUIImageView"
              }
            ]
          }
        ],
        "view_class" : "RuntimeUIImageView"
      },
      {
        "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
        "frame_string" : "{{10,220},{90,90}}",
        "view_class" : "RuntimeUIImageView"
      },
      {
        "layout_margin" : "{10,10}",
        "layout_width_height" : "{90,90}",
        "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
        "view_class" : "RuntimeUIImageView"
      }
    ]
  },
  {
    "layout_margin" : "{300,80}",
    "layout_width_height" : "{30,30}",
    "image_url" : "https:\/\/ss3.bdstatic.com\/70cFv8Sh_Q1YnxGkpoWK1HF6hhy\/it\/u=2515044163,2570565162&fm=27&gp=0.jpg",
    "view_class" : "RuntimeUIImageView"
  }
]

博主通過對(duì)此信息的描述構(gòu)造了基本的view(UIButton、UILabel支持富文本、UIImageVIew、UIView)以及水平垂直布局進(jìn)行了解析,解析后的效果如下:


水平處置布局json解析后效果.png

對(duì)于view與label多種樣式實(shí)現(xiàn)效果如下:


自定義ui解析后的效果.png

結(jié)論

1.用作展示view是可以滿足的
2.具有同類型的操作的功能是可以滿足的(如點(diǎn)擊圖片進(jìn)行瀏覽)
3.打點(diǎn)功能是可以滿足的(打點(diǎn)信息需要后臺(tái)傳入)
不能滿足的是手勢(shì)交互(單個(gè)view移動(dòng)、手勢(shì)滑動(dòng)),同上如果是同類型的操作可以引入通過后臺(tái)控制是否開啟

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,593評(píng)論 19 139
  • 元寶 不知道從什么時(shí)候起已經(jīng)會(huì)坐了,好像周日那天去超市就可以坐了,能坐挺長(zhǎng)時(shí)間的,并且不會(huì)東倒西歪! 元寶 從這周...
    FlyingMood閱讀 151評(píng)論 0 0
  • 再過幾天就是11月10號(hào)了,這一天將是《東方快車謀殺案》這部電影第一次出現(xiàn)在中國(guó)的大銀幕上和中國(guó)觀眾見面。不出意外...
    4e6cad5247ee閱讀 393評(píng)論 0 0

友情鏈接更多精彩內(nèi)容