iOS笔记6

1
//oc知识补充: == 和 isEqualToString(自己)
== 表示两个对象是同一个对象,也就是使用同一块内存
isEqualToString 表示字符串内容相等
(1)
NSString *str1 = @”123”
NSString *str2 = @”123”
str1 == str2 他们使用的内存是一样的,所以可以认为是同一个对象

(2)
    NSString *str1 = @"123";
    NSString *str2 = @"456";
    //此时的两个内存地址不一样
    str2 = @"123";
    此时的str1 和 str2的内存地址又是一样的了

(3)
    NSMutableString *str1 = [NSMutableString stringWithFormat:@"123"];
    NSMutableString *str2 = [NSMutableString stringWithFormat:@"123"];
    NSLog(@"str1:%p   str2:%p",str1,str2);//打印出来的内存地址不一样
    if ([str2 isEqualToString:str2]) {
        //可以执行if里面的代码,因为他们的字符串内容一样
    }

2
//不等高cell的设置会造成死循环的一种情况
为cell增加属性cellH @property (nonatomic, assign) CGFloat cellH; /*< cell高度 /

在cell的layoutSubviews方法中赋值

objc // 根据cell最底部控件的最大y值+margin来确定cell的高度 CGFloat CellH = (self.status.picture)? CGRectGetMaxY(self.picture_Ima.frame) + margin: CGRectGetMaxY(self.text_Lab.frame) + margin; self.cellH = CellH; NSLog(@”cellH = %.f”, CellH);

在代理方法中返回cell.cellH
objc - (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath { XMGStatusCell cell = [XMGStatusCell cellWithTableView:tableView]; return cell.cellH; } - 总结:直接死循环崩溃 - 崩溃原因探究: 1.当tableView加载的时候,在cell显示到屏幕上之前(cell创建之前),tableView会先拿到所有的cell的高度,来确定contentSize,以估算右边索引条的高度 * 2.在创建cell(cellForRowAtIndexPath)的时候,又会调用代理heightForRowAtIndexPath方法,询问对应indexPath的cell的高度 * 3.当cell要显示到屏幕上时候,才统一调度cell们的layoutSubViews方法,来布局cell内部子控件 * 4.cell.cellH是在最后(layoutSubViews)才得到值

3
//nib注册
+ (instancetype)cellWithTableView:(UITableView *)tableView
{
// 0.确定重用标示(规范的写法)
static NSString *ID = nil;
if (ID == nil) {
ID = [NSString stringWithFormat:@”%@ID”, NSStringFromClass(self)];
// NSLog(@”%s, line = %d”, FUNCTION,LINE);
// 按照编码习惯,xib自定义cell的时候,通常是通过注册来完成创建
[tableView registerNib:[UINib nibWithNibName:NSStringFromClass(self) bundle:nil] forCellReuseIdentifier:ID];
}

// 1.缓存池
// 这里应该是XMGCarCell *cell,写成id 的原因是为了拖个代码块
id cell = [tableView dequeueReusableCellWithIdentifier:ID];

return cell;

}

5
//不等高cell 返回高度要注意一些方法的调用顺序
控制器中的heightForRowAtIndexPath —–> cell里面的layoutSubViews(可以说明控件有frame之后才会调用layoutSubViews)

heightForRowAtIndexPath –> cellForRowAtIndexPath—>layoutSubViews

6
//基本上所有的控件只要设置高度为0,就看不见控件了,label就不一定

7
//在viewDidLoad中先设置估计高度,可以很大程度上减少 heightForRowAtIndexPath的调用

8
//根据文字的内容和字体大小等文字属性来得到 frame的size
// 计算文字所占据的尺寸
(1)NSDictionary *nameAttrs = @{NSFontAttributeName : XMGNameFont};
CGSize nameSize = [self.status.name sizeWithAttributes:nameAttrs];
self.nameLabel.frame = (CGRect){{nameX, nameY}, nameSize};

(2)
CGFloat textX = iconX;
CGFloat textY = CGRectGetMaxY(self.iconImageView.frame) + margin;
- 2 * textX;
CGSize textMaxSize = CGSizeMake(textW, MAXFLOAT);
NSDictionary *textAttrs = @{NSFontAttributeName : XMGTextFont};
CGFloat textH = [self.status.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttrs context:nil].size.height;
self.text_label.frame = CGRectMake(textX, textY, textW, textH);

9
//不等高cell微博(代码创建)思路
(1).创建status模型(模型里包含了属性 和类型为CGRect的cell子控件的frame属性) 创建一个继承UITableViewCell的一个cell类 FFTableViewCell
(2).在模型的- (CGFloat)cellHeight 里面进行frame的计算并且复制给self.nameFrame……最后得到cellHeight
(3).在FFTableViewCell.m文件中
(1).+ cellWithTableView方法中创建cell(用注册) 并且返回cell
(2).- initWithStyle 创建子控件 并且进行相应的属性的设置(字体等),然后cell添加这些子控件 最后进行子控件的相关联self.nameLabel = nameLabel
(3).- layoutSubViews 进行子控件frame的设置 status里面有各个控件的frame,无需再次计算

10
//自动计算cell的高度
// 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)
self.tableView.rowHeight = UITableViewAutomaticDimension;
// 告诉tableView所有cell的估算高度
self.tableView.estimatedRowHeight = 44;

11
//通过注册的方法获得的是默认的style样式的cell

12
//preferredMaxLayoutWidth
- (void)awakeFromNib
{
// 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame)
self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值