How to create horizontally dynamic UICollectionView cells? Swift

后端 未结 2 1835
忘掉有多难
忘掉有多难 2021-01-22 00:03

Hey I\'m trying display a set of \"tags\" in a view controller using collection view cells but I\'m having trouble finding a way to make them be able to dynamically resizable de

相关标签:
2条回答
  • 2021-01-22 00:26

    You need unambiguous constraints between your label and the cell (e.g. leading, trailing, top, and bottom constraints):

    Then you can use UICollectionViewFlowLayoutAutomaticSize for the itemSize of your collectionViewLayout. Don't forget to set estimatedItemSize, too, which enables automatically resizing cells:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let layout = collectionView?.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = UICollectionViewFlowLayoutAutomaticSize
        layout.estimatedItemSize = CGSize(width: 100, height: 40)
    }
    

    That yields:

    0 讨论(0)
  • 2021-01-22 00:37

    You can calculate the lengths of the texts ahead of time, feed them into an array accessible by your collectionView and use them them to construct the size of the cell.

    //Create vars
    NSArray * texts = @[@"Short",@"Something Long",@"Something Really Long"];
    NSMutableArray * lengths = [NSMutableArray new];
    float padding = 30.0f;
    
    //Create dummy label
    UILabel * label = [UILabel new];
    label.frame = CGRectZero;
    label.font = [UIFont systemFontOfSize:20.0f weight:UIFontWeightBold];
    
    //loop through the texts
    for (NSString * string in texts){
    
        //set text
        label.text = string;
    
        //calculate length + add padding
        float length = [label.text boundingRectWithSize:label.frame.size
                                                options:NSStringDrawingUsesLineFragmentOrigin
                                             attributes:@{NSFontAttributeName:label.font}
                                                context:nil].size.width + padding;
        //save value into array as NSNumber
        [lengths addObject:@(length)];
    }
    
    //drop label
    label = nil;
    

    Create the size of the cell using some code like this:

    return CGSizeMake(lengths[indexPath.row], 100.0f); 
    
    0 讨论(0)
提交回复
热议问题