我正在将iOS5项目更新为storybaord并兼容与iOS6 / iOS7一起运行。我的表视图有4个部分,每个部分都有不同长度的数据,可能会也可能不会显示为单行。
旧代码是这样的,我收到了声明
的警告CGSize size = [productToShow.pDesc sizeWithFont:self.lblHidden.font constrainedToSize:self.lblHidden.frame.size lineBreakMode:NSLineBreakByWordWrapping];
警告
sizeWithFont:constrainedToSize:lineBreakMode:is first deprecated in iOS7
所以我尝试按照编译器的建议使用 boundingRectWithSize:options:attributes:context:
。
但代码似乎更复杂:苹果不会让简单的事情变得困难。如果有人可以看到我的代码并提出最好的方法或更好更简单的方法,那将对我和社区有所帮助。
带有XIB的iOS5代码
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
NSString *tempPointStr = [self.shortDescArray objectAtIndex:indexPath.row];
self.lblHidden.frame = CGRectMake(58, 0, 945, 9999);
self.lblHidden.text = tempPointStr;
CGSize size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];
if (size.height < 50.0f)
{
return 50.0f;
}
else
{
return size.height;
}
}
elseif(indexPath.section == 1)
{
...
}
else
{
...
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
static NSString *tempPoint = @"ProductPointsCell";
ProductPointsCell *cell = (ProductPointsCell*)[tableView dequeueReusableCellWithIdentifier:tempPoint];
if (cell == nil)
{
NSArray* nib = [[NSBundle mainBundle] loadNibNamed:@"ProductPointsCell_iPad" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell.showsReorderControl = NO;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.backgroundColor=[UIColor clearColor];
cell.lblPoint.font = [UIFont fontWithName:@"Arial-BoldMT" size:18.0f];
}
NSString *tempPointStr = [self.shortDescArray objectAtIndex:indexPath.row];
cell.lblPoint.text = tempPointStr;
self.lblHidden.frame = CGRectMake(58, 0, 945, 9999);
self.lblHidden.text = tempPointStr;
CGSize size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];
if (size.height < 50.0f)
{
cell.lblPoint.frame = CGRectMake(58, 0, 945, 50.0f);
}
else
{
cell.lblPoint.frame = CGRectMake(58, 0, 945, size.height);
}
return cell;
}
elseif(indexPath.section == 1)
{
...
}
else
{
...
}
}
其中的代码如下:
iOS6 / 7代码与storybaord
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
NSString *tempPointStr = (self.shortDescArray)[indexPath.row];
self.lblHidden.frame = CGRectMake(58, 0, 945, 9999);
self.lblHidden.text = tempPointStr;
CGSize constraint = CGSizeMake(945, 9999.0f);
NSDictionary * attributes = [NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:14.0f] forKey:NSFontAttributeName];
NSAttributedString *attributedText = [[NSAttributedString alloc]initWithString:self.lblHidden.text attributes:attributes];
CGRect rect = [attributedText boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin context:nil];
CGSize size = rect.size;
if (size.height < 50.0f)
{
return 50.0f;
}
else
{
return size.height;
}
}
elseif(indexPath.section == 1)
{
...
}
else
{
...
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
static NSString *tempPoint = @"ProductPointsCell";
ProductPointsCell *cell = (ProductPointsCell*)[tableView dequeueReusableCellWithIdentifier:tempPoint];
cell.showsReorderControl = NO;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.backgroundColor=[UIColor clearColor];
cell.pointLbl.font = [UIFont fontWithName:@"Arial-BoldMT" size:18.0f];
[cell.pointLbl setLineBreakMode:NSLineBreakByWordWrapping];
[cell.pointLbl setNumberOfLines:0];
NSString *tempPointStr = (self.shortDescArray)[indexPath.row];
cell.pointLbl.text = tempPointStr;
CGSize constraint = CGSizeMake(945,9999.0f);
NSAttributedString *attributedText = [[NSAttributedString alloc]initWithString:cell.pointLbl.text attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
CGRect rect = [attributedText boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin context:nil];
CGSize size = rect.size;
if (size.height < 50.0f)
{
cell.pointLbl.frame = CGRectMake(58, 0, 945, 50.0f);
}
else
{
cell.pointLbl.frame = CGRectMake(58, 0, 945, size.height);
}
return cell;
}
elseif(indexPath.section == 1)
{
...
}
else
{
...
}
}
这些代码的目的是使数据在单行中显示时显示在单行中,当不调整单元格高度时,数据显示为多行单元格。
如果我应该打开或关闭自动布局,还要纠正我,并且我应该在转换时在故事板中设置任何参数。
如果有人可以建议更好/更快更容易的方法,请使用示例。
答案 0 :(得分:3)
尝试不使用NSAttributedString ...这对我有用:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSManagedObject *obj = [results objectAtIndex:indexPath.row];
NSString *text = [obj valueForKey:@"name"];
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:FONT_SIZE], NSFontAttributeName, nil];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
CGFloat height = MAX(size.height, 45.0f);
return height ;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
TVCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[TVCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSManagedObject *obj = [results objectAtIndex:indexPath.row];
NSString *text = [obj valueForKey:@"name"];
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:FONT_SIZE], NSFontAttributeName, nil];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
[cell.cellText setText:text];
[cell.cellText setFrame:CGRectMake(CELL_CONTENT_MARGIN, 0.0, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 45.0f))];
return cell;
}
在TVCell.m中:
self.cellText = [[UILabel alloc] initWithFrame:CGRectZero];
[self.cellText setLineBreakMode:NSLineBreakByWordWrapping];
[self.cellText setMinimumScaleFactor:FONT_SIZE];
[self.cellText setNumberOfLines:0];
[self.cellText setFont:[UIFont systemFontOfSize:FONT_SIZE]];
self.cellText.textColor = [UIColor colorWithRed:64/255.0 green:59/255.0 blue:59/255.0 alpha:1.0];
[self.contentView addSubview:self.cellText];