我有一个带有节标题的集合视图,该节显示用户信息。标头可以包括来自用户的简历。如果简介很长,我无法调整标题的大小。标签将不会显示整个生物,因为标题保持在固定的高度。
我通过情节提要创建了集合视图,但是我以编程方式添加了约束。
这是生物限制因素,我认为将高度和线条设置为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(这是我想要的高度)
答案 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的视图。 希望对您有帮助