【问题标题】:How to create horizontally dynamic UICollectionView cells? Swift如何创建水平动态 UICollectionView 单元格?迅速
【发布时间】:2017-08-07 17:22:58
【问题描述】:

嘿,我正在尝试使用集合视图单元格在视图控制器中显示一组“标签”,但我无法找到一种方法使它们能够根据字符串的长度动态调整大小。

现在各个单元格的大小是静态的,所以每当一个字符串填充单元格的字符超过单元格的大小时,它就会进入第二行。我想要它,以便单元格可以根据字符串的长度改变长度。因此,如果它是标签“#Vegan”,它会自动调整大小,使标签不会那么大。同样,如果它是一个较长的字符串,如“#LaptopFriendly”,它将在水平方向变长以容纳该字符串并且不使用第二行。垂直长度可以保持固定。谢谢!

更新(使用 Rob 的代码遇到错误时的界面构建器设置):

模拟器截图:

【问题讨论】:

  • 你试过任何代码吗?
  • 不,我不确定我应该写什么代码!我是iOS新手,所以任何帮助将不胜感激!我想我会使用 collectionView 函数 cellForItemAt??
  • 看起来您的新屏幕快照在很大程度上调整了大小。但是以#C 开头的那一行是两行。所以,有两个问题: 1. 您的标签是否将lineCount 设置为1?如果设置为零,请尝试将其设置为1。还要确保以#C 开头的值中没有换行符。
  • 顺便说一下,您似乎已经为标签添加了背景颜色。如果您使标签背景颜色清晰并将背景颜色应用于单元格,您可能会获得更好的外观。
  • 我只是设法让它工作。我重新添加了集合视图/单元格/标签,它神奇地起作用了。谢谢!

标签: ios swift uicollectionview uicollectionviewcell


【解决方案1】:

标签和单元格之间需要明确的约束(例如前导、尾随、顶部和底部约束):

然后,您可以使用UICollectionViewFlowLayoutAutomaticSize 作为您的collectionViewLayoutitemSize。不要忘记设置estimatedItemSize,它可以自动调整单元格大小:

override func viewDidLoad() {
    super.viewDidLoad()

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

产生:

【讨论】:

  • 我收到一个错误:“项目高度必须小于 UICollectionView 的高度减去部分插入顶部和底部值,减去内容插入顶部和底部值。”我该怎么做才能解决这个问题?我有一些插图,因此它们不会从边缘开始。
  • 您是否设置了estimatedItemSize?如果您使用itemSizeUICollectionViewFlowLayoutAutomaticSize,但忽略将estimatedItemSize 设置为实际CGSize 值的合理估计值,则会出现该错误。
  • 是的,我做到了,我将宽度设置为 150,但仍然出现错误。我上面的更新显示了其中一个主题标签仍然没有动态调整大小的屏幕截图。该字符串应该是“#Couch”,但它总是在我到达那里之前崩溃并循环错误。我的标签约束有问题吗?
  • hashtag 是单元格的名称吗?如果是这样,我认为您的约束没有任何明显错误。或者它是单元格的子视图(在这种情况下,我们需要查看子视图和单元格的黑白约束)?如果你为你的问题创建一个stand-alone example 可能是最简单的(没有你的其他代码;我们不想涉水而过;只是一个带有集合视图的空白项目,显示了你描述的问题;听起来像麻烦,但只需 10-15 分钟即可完成)。然后上传到某个地方,我们可以看看。
  • 它对我有帮助,但是当我点击单元格时,它会给我动态宽度如果我在我的应用程序运行时想要动态宽度我应该怎么做
【解决方案2】:

您可以提前计算文本的长度,将它们输入到您的 collectionView 可访问的数组中,并使用它们来构造单元格的大小。

//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;

使用如下代码创建单元格的大小:

return CGSizeMake(lengths[indexPath.row], 100.0f); 

【讨论】:

  • 如果你不赞成请解释一下,如果需要我可以改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多