美文网首页
1.2 UI基础-九宫格、封装、懒加载

1.2 UI基础-九宫格、封装、懒加载

作者: 大黄恋上猫 | 来源:发表于2016-08-18 09:55 被阅读0次

    知识点

    • init方法内部会自动调用initWithFrame:方法

      - (instancetype)initWithFrame:(CGRect)frame
      
    • layoutSubviews

      • 1.这个方法专门用来布局子控件,一般在这里设置子控件的frame
      • 2.当控件本身的尺寸发送改变的时候,系统会自动调用这个方
          - (void)layoutSubviews{
              // 一定要调用super的layoutSubviews
              [super layoutSubviews];
          }
      

    九宫格案例

    • 1.定义模型VHShop

      • 创建属性
      • 创建字典转模型方法
        • 类方法
        • 对象方法
          - (instancetype)initWithDict:(NSDictionary *)dict
          {
              if (self = [super init]) {
                  self.name = dict[@"name"];
                  self.icon = dict[@"icon"];
              }
              return self;
          }
      
          + (instancetype)shopWithDict:(NSDictionary *)dict
          {
              return [[self alloc] initWithDict:dict];
          }
      
    • 2.自定义View VHShopView

      • 创建VHShop模型
      • 创建开始初始化类方法 shopView
      • 创建子控件,懒加载
      • layoutSubviews设置子控件位置大小
      • 重写VHShop模型的set方法,用于设置子控件的值
    • 3.加载数据模型

      // 加载plist数据(比较大)
      // 懒加载:用到时再去加载,而且也只加载一次
      - (NSArray *)shops
      {
          if (_shops == nil) {
              // 1、加载一个字典数组
              NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]];
              //2、字典数组转模型数组
              NSMutableArray *shopArray = [NSMutableArray array];
              for (NSDictionary *dict in dictArray) {
                  XMGShop *shop = [XMGShop shopWithDict:dict];
                  [shopArray addObject:shop];
              }
              //3.赋值
              _shops = shopArray;
          }
          return _shops;
      }
      
    • 4.动态新增添加按钮删除按钮

    • 5.创建商品添加方法删除方法

      • 利用控件的索引index计算出控件所在的行号和列号
      • 利用列号计算控件的x值
      • 用用行号计算控件的y值
      • 九宫格核心排列代码
        // 商品的索引
        NSUInteger index = self.shopsView.subviews.count;
        // 给商品控件传递商品模型
        shopView.shop = self.shops[index];
        
        // 商品的x值
        NSUInteger col = index % cols;
        CGFloat shopX = col * (shopW + colMargin);
        
        // 商品的y值
        NSUInteger row = index / cols;
        CGFloat shopY = row * (shopH + rowMargin);
        
      • 移除子控件
        [[self.shopsView.subviews lastObject] removeFromSuperview];
        
    • 6.检查状态(按钮状态、HUD状态)

      • 设置定时任务

        • 方法一:perfoemSelector
        // 1.5s后自动调用self的hideHUD方法
        

    [self performSelector:@selector(hideHUD) withObject:nil afterDelay:1.5];
    ```
    - 方法二:GCD

        ```objc
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 1.5s后自动执行这个block里面的代码
    self.hud.alpha = 0.0;
    

    });
    ```
    - 方法三 :NSTimer

        ```objc
        // 1.5s后自动调用self的hideHUD方法
    

    [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(hideHUD) userInfo:nil repeats:NO];
    // repeats如果为YES,意味着每隔1.5s都会调用一次self的hidHUD方法
    ```

    一个控件看不见有哪些可能?

    • 宽度或者高度其实为0
    • 位置不对(比如是个负数或者超大的数,已经超出屏幕)
    • hidden == YES
    • alpha <= 0.01
    • 没有设置背景色、没有设置内容
    • 可能是文字颜色和背景色一样

    错误

    今天写了加载图片,默认图片写的是[UIImage imageNamed:@""],之后就报下面的错误

     DemoShopView[5776:482951] CUICatalog: Invalid asset name supplied: (null)
    

    这个提示的意思是说你用了这个方法

    [UIImage imageNamed:name];但是这个name却是空的,所以就报了这个错了。
    解决方法,在项目中搜索UIImage imageNamed:,然后打印看看所谓的name是否为空。找到后替换。

    相关文章

      网友评论

          本文标题:1.2 UI基础-九宫格、封装、懒加载

          本文链接:https://www.haomeiwen.com/subject/qqpojttx.html