我有一个列表视图,有时会有长文本。当文本是几段时,它往往会在某些时候被切断。部分奇怪的行为是,它并不总是被同一个角色切断,而是随机的。
以下是我用来填充列表的代码:
// CREATING EACH CELL IN THE LIST
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//static const NSInteger kLabelTag = 1;
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault)
reuseIdentifier:@"business"];
NSString *comment = [[items_array objectAtIndex:[indexPath row]] objectForKey:(@"comment")];
NSString *first_name = [[items_array objectAtIndex:[indexPath row]] objectForKey:(@"first_name")];
//Boolean *is_private = [[items_array objectAtIndex:[indexPath row]] objectForKey:(@"is_private")];
// Creating a constraint size for the label you are making
CGSize constraint = CGSizeMake(320 - (10 * 2), 20000.0f);
// Determining the size that you will need for the label based on the comment
// length and the contraint size
CGSize size = [comment sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
// Creating the label and initializing it with the frame that you have
// determined by your size calculations above
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, MAX(size.height, 44.0f) + 20.0f)];
// setting up the label properties
label.numberOfLines = 0;
label.lineBreakMode = UILineBreakModeWordWrap;
standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *is_private = [standardUserDefaults objectForKey:@"is_private"];
if ( is_private == nil )
{
label.text = [first_name stringByAppendingString:[@": " stringByAppendingString:comment]]; // comment;
}
else
if ( [is_private isEqualToString:@"0"])
{
label.text = [first_name stringByAppendingString:[@": " stringByAppendingString:comment]]; // comment;
}
else
{
label.text = comment;
}
// adding the label view to the cell that you have created
[cell.contentView addSubview:label];
// CLOSE THE SPINNER
[spinner stopAnimating];
// return the cell for the table view
return cell;
}
//This method will determine how tall each row needs to be. Cell size for word wrapping.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSString *comment = [[items_array objectAtIndex:[indexPath row]] objectForKey:(@"comment")];
// Again you are getting the constraints because you are going to us this size
// to constrain the height of the cell just like you determined the size for the label.
CGSize constraint = CGSizeMake(320 - (10 * 2), 20000.0f);
// Again, determining the size that we will need for the label, because it will drive
// the height of the cell
CGSize size = [comment sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
// Finally, we can determine the height for the cell!
CGFloat height = MAX(size.height, 44.0f);
// return the height, which is the height of the label plus some extra space to make
// it look good.
return height + (10 * 2);
}
此代码是否有任何特别不正确的代码?或者问题是否可能根植于其他地方?
谢谢!
答案 0 :(得分:1)
创建标签时,请将其交给最大高度
MAX(size.height, 44.0f)
这意味着标签永远不会高于44分。 如果文本(被包装以适合标签的宽度)高于标签,则在其下方休闲的行仍将在标签中,但不可见。
您的选择:
- 使标签字体自动调整大小
- 更改高度,或切换到标签的动态高度
每次更新时都会出现这样的情况:
myLabel.text = @"some text";
CGRect rect = myLabel.frame;
rect.size.height = textView.contentSize.height;// Adding.size Since height is not a member of CGRect
textView.frame = rect; //your label is now as high as its contents (the text)
- 修改进入标签的文本,使其永远不会超过标签的高度。
答案 1 :(得分:1)
除非绝对必要,否则我将摆脱拥有自己的UILabel,并根据字符串大小动态调整单元格的高度。看看下面的例子:
在加载tableview之前创建字符串
-(void)createStrings{
newArray = [NSMutableArray array];
for(NSDictionary *dictionary in items_array){
NSString *comment = [dictionary objectForKey:(@"comment")];
NSString *first_name = [dictionary objectForKey:(@"first_name")];
NSString *combinedString = [first_name stringByAppendingString:[@": " stringByAppendingString:comment]];
[newArray addObject:combinedString];
}
}
#pragma mark - Table View Data Source
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = nil;
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17];
}
cell.textLabel.text = [newArray objectAtIndex:indexPath.row];
return cell;
}
#pragma mark - Table View Delegate
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17];
CGSize constraintSize = CGSizeMake(self.tableView.frame.size.width, MAXFLOAT);
CGSize labelSize = [[newArray objectAtIndex:indexPath.row] sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height + 30;
}