根据文本调整单元格宽度 - UICollectionView - iOS

Posted

技术标签:

【中文标题】根据文本调整单元格宽度 - UICollectionView - iOS【英文标题】:Adjust cell width based on text - UICollectionView - iOS 【发布时间】:2016-01-01 23:20:15 【问题描述】:

我有一个带有 UICollectionViewios 应用程序,它水平显示单元格。在每个单元格中,我添加了一个简单的标签(现在)。这些标签显示名称,有时名称很短,这很好......但是....有时名称很长,因此被切断,因为它们不能正确地适合集合视图单元格的宽度。

有没有办法动态调整单元格/标签的宽度,以便正确显示名称文本?

我正在尝试使用这种方法:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
    return CGSizeMake(106.f, 60.f);

但是我上面的方法有两个主要问题:

    如何通过这种方法访问单元格标签? (这样我就可以得到它的高度)。 我如何实际确定单元格/标签的宽度需要是多少?

感谢您的宝贵时间,

【问题讨论】:

试试这个链接***.com/questions/23134986/… 【参考方案1】:

您无法访问标签,但可以访问用于填充它的数据。有了它,您可以获得标签的高度和宽度:

CGRect labelRect = [text
                boundingRectWithSize:CGSizeMake(MAX WIDTH OF YOUR LABEL, CGFLOAT_MAX)
                options:NSStringDrawingUsesLineFragmentOrigin
                attributes:@
                 NSFontAttributeName : [FONT OF YOUR LABEL]
                
                context:nil];

【讨论】:

这对我不起作用,它只会崩溃。同样对于 [FONT OF YOUR LABEL] 是否期待 UIFont 对象? 实际上这对我现在有用。但我仍然在努力让它一直工作。有时它提供的宽度有点太大了。【参考方案2】:

我在TableView 做了同样的事情 - 希望你可以将这个逻辑用于collectionView

celllabelWidth - width of the Cell, you can get it from cellForItemAtIndexPath
celllabelWidth = cell.lblEvent.frame.size.width;

- (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font 
        CGSize size = CGSizeZero;
        if (text) 
            //iOS 7
            CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@ NSFontAttributeName:font  context:nil];
            size = CGSizeMake(frame.size.width, frame.size.height);
        
        return size.height;
    

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    CGFloat heightOfRow = 86.0;
    NSString *yourBlog = [[self.arrevents objectAtIndex:indexPath.row ] valueForKey:@"info"];
    heightOfBlog = [self findHeightForText:yourBlog havingWidth:celllabelWidth andFont:[UIFont fontWithName:@"HelveticaNeue" size:14.0]];
    heightOfRow += heightOfBlog + 10;
(long)indexPath.row,heightOfRow);
    return heightOfRow;

希望最好的:)

【讨论】:

【参考方案3】:

我在集合视图中使用以下代码做了同样的事情:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 

    CGSize size1 = CGSizeMake(MAX_WIDTH_OF_STRING, [self height:YOUR_STRING];
    return size1;


-(float)height :(NSString*)string
    
        UIFont *newFont = [[Util sharedUtil] fontOfType:FONT_HELVETICA_LT bold:NO size:INTERFACE_IS_PHONE?12:FONT_SIZE_LARGE_CELL];

        NSDictionary *arialdict = [NSDictionary dictionaryWithObject:newFont forKey:NSFontAttributeName];

        NSMutableAttributedString *message = [[NSMutableAttributedString alloc] initWithString:string attributes:arialdict];

        NSAttributedString *attributedText = message;
        CGRect rect = [attributedText boundingRectWithSize:(CGSize)     
                       INTERFACE_IS_PHONE?135:220, MAXFLOAT
                       options:NSStringDrawingUsesLineFragmentOrigin
                        context:nil];
            //you need to specify the some width, height will be calculated
            CGSize requiredSize = rect.size;
        return MAX(requiredSize.height,INTERFACE_IS_PHONE?20:30);
    

希望对你有所帮助。

【讨论】:

【参考方案4】:

感谢大家的发帖,最终对我有用的解决方案是您所有的解决方案和一些额外的“修补”的混合:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 

    // Get the user name and profile name strings.
    NSString *user_label = [NSString stringWithFormat:@"%@", [user_data[indexPath.row] objectAtIndex:0]];
    NSString *name_label = [NSString stringWithFormat:@"%@", [user_data[indexPath.row] objectAtIndex:1]];

    // Calculate the contact text widths.
    NSDictionary *attributes = @NSFontAttributeName:[UIFont fontWithName:@"SFUIDisplay-Thin" size:20.0f];
    CGRect rect = [user_label boundingRectWithSize:CGSizeMake(MAXFLOAT, 60) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];
    CGRect rect_two = [name_label boundingRectWithSize:CGSizeMake(MAXFLOAT, 60) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

    // Add the other cell objects width to
    // the biggest calculated text width.
    CGFloat row_width = 0;

    if (rect.size.width > rect_two.size.width) 
        row_width = (rect.size.width + 55);
    

    else 
        row_width = (rect_two.size.width + 55);
    

    // Only return the generated width if
    // it is bigger than the original width.

    if (row_width > 106) 
        return CGSizeMake(row_width, 60.f);
    

    else 
        return CGSizeMake(106, 60.f);
    

【讨论】:

以上是关于根据文本调整单元格宽度 - UICollectionView - iOS的主要内容,如果未能解决你的问题,请参考以下文章

Excel表怎么让单元格自动调整宽度?

集合视图单元格宽度不正确

根据标题调整 UIButton 的宽度

根据 UILabel 文本和图像自动调整单元格大小,例如聊天

如何根据内容设置collectionview单元格宽度?

怎样根据内容自动调整excel表格的行高列宽?