iOS笔记6

来源:互联网 发布:java 微信h5开发教程 编辑:程序博客网 时间:2024/04/29 10:53

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