UICollectionview动态地适合一行

时间:2017-05-19 09:20:16

标签: ios swift uicollectionview uicollectionviewcell

我有来自服务器的文字,动态地我设置了集合视图,每个单元格显示一个字母。

但如果这个词太长,那么一切都会缩小。

enter image description here enter image description here

我希望每个字母都适合集合视图,这个单词应该只适合一行,所以我使用了:

CommonModule

3 个答案:

答案 0 :(得分:0)

选择UILabel并转到属性检查器

Attribute Inspector Snap

然后从自动收缩选项中选择最小字体大小最小字体比例,最后设置所需的最小值。

希望这有效。

答案 1 :(得分:0)

我认为您需要的是保持细胞左对齐,固定细胞宽度和细胞之间的填充。字母很少时不是动态填充。你不希望“a b c”成为“a ........ b ........ c”。解决方案是在单元格之间设置最大填充,遗憾的是,没有使用默认集合视图布局的此类设置。你需要定义一个:

class MaxSpacingCollectionViewFlowLayout : UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let attributes = super.layoutAttributesForElements(in: rect) else {
            return nil
        }

        if attributes.count <= 0 { return attributes }

        let firstCellOriginX = attributes[0].frame.origin.x

        for i in 1..<attributes.count {
            let currentLayoutAttributes = attributes[i];
            if currentLayoutAttributes.frame.origin.x == firstCellOriginX {
                continue //first cell of a new row
            }

            let prevLayoutAttributes = attributes[i - 1]
            let prevOriginMaxX = prevLayoutAttributes.frame.maxX
            if currentLayoutAttributes.frame.origin.x - prevOriginMaxX > 8 { // 8 here is the max padding
                var frame = currentLayoutAttributes.frame
                frame.origin.x = prevOriginMaxX + 8
                currentLayoutAttributes.frame = frame
            }
        }

        return attributes
    }
}

然后替换默认布局:

  let collectionView = UICollectionView()
  //......
  collectionView.collectionViewLayout = MaxSpacingCollectionViewFlowLayout()

最后,委托方法sizeForItemAt可以简单地返回固定宽度:

  return CGSize(width : 35, height : 35)

答案 2 :(得分:0)

试试这个:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

let size: CGSize = self.letters[indexPath.row].size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 18.0)])//18.0 replace it with your label font size.

let height = collectionView.frame.size.height / 2

return CGSize(width: size.width+2 , height: height)

}