知识点
-
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是否为空。找到后替换。