如何为集合视图节标题提供动态高度

时间:2019-09-19 04:58:29

标签: ios swift uicollectionview

我有一个带有节标题的集合视图,该节显示用户信息。标头可以包括来自用户的简历。如果简介很长,我无法调整标题的大小。标签将不会显示整个生物,因为标题保持在固定的高度。

我通过情节提要创建了集合视图,但是我以编程方式添加了约束。

这是生物限制因素,我认为将高度和线条设置为0会没事的,

      addSubview(bioLabel)
        bioLabel.anchor(top: editProfileButton.bottomAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 12, paddingLeft: 12, paddingBottom: 0, paddingRight: 12, width: 0, height: 0)

我还认为我可以通过以下方式覆盖情节提要


    // Trying to override storyboard header height so the header can strech depending on the bio height
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

        //TODO change height to be bounds.height of bioLabel?
        return .init(width: view.frame.width, height: 300)

    }

但是即使我尝试通过代码更改大小,它也会保持故事板高度225(这是我想要的高度)

5 个答案:

答案 0 :(得分:2)

到目前为止,给出的答案中没有一个是好的做法,因为手动计算大小或通过在屏幕外渲染标签既效率低下,又违反了唯一的真相原则。

UICollectionReusableView的实例具有preferredLayoutAttributesFitting()方法。当显示单元格时,将调用此方法。在这种方法中,如果使用“自动布局”,则需要向整个单元格询问其systemLayoutSizeFitting(),然后修改属性。然后,版式将负责通过版式无效来应用它们。

答案 1 :(得分:0)

使用UICollectionReusableView的实例作为标题。 并使用此方法计算标头的实际大小

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { }

确保标头也准备好动态高度。祝你好运。

答案 2 :(得分:0)

此功能将完成工作。只需传递标签文字

func estimatedLabelHeight(text: String) -> CGFloat {

        let size = CGSize(width: view.frame.width - 16, height: 1000)

        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)

        let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 10)]

        let rectangleHeight = String(text).boundingRect(with: size, options: options, attributes: attributes, context: nil).height

        return rectangleHeight
    }

并像使用它

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

        //TODO change height to be bounds.height of bioLabel?
        return .init(width: view.frame.width, height: estimatedLabelHeight(text: "Text that your label is gonna show"))

    }

答案 3 :(得分:0)

您可以使用以下功能获取标签高度

func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {

  let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
  label.numberOfLines = 0
  label.lineBreakMode = NSLineBreakMode.byWordWrapping
  label.font = font
  label.text = text
  label.sizeToFit()

  return label.frame.height
}

集合标题方法

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

    let height = self.heightForLabel(text: 'your text', font: 'font which you in label' , width: 'your label width')
    return .init(width: view.frame.width, height: height+10) //10 is extra height if you want or you can remove it.
}

答案 4 :(得分:0)

您需要在方法中计算像元高度的大小

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

 var size = CGSize()
            let cell = YourUICollectionViewCell()
            cell.textLabel?.text = data?[indexPath.row].text
            let fitting = CGSize(width: cell.frame.size.width, height: 1)
            size = cell.contentView.systemLayoutSizeFitting(fitting,
                                                            withHorizontalFittingPriority: .required,
                                                            verticalFittingPriority: UILayoutPriority(1))
            return size.height //or just return size 

}

如果UILabel是自定义的,则需要设置底部的UILabel约束以查看优先级低于1000的视图。 希望对您有帮助