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

知识点

  • 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基础-九宫格、封装、懒加载)