开发者社区> 问答> 正文

重用的自定义CollectionViewCells保留旧的大小属性

问题 我有过UICollectionView,实现方法。sizeForItemAt...我希望单元格具有分配给sizeForItemAt方法,但在重用单元格时,Size属性将保持不变。

所以我想知道是否有办法强迫可重复使用的细胞改变它们的高度?

截图 以下是链接:https://i.stack.imgur.com/33Fyf.png

代码: CellForItemat:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: answerLetterCell, for: indexPath) as! AnswerLetterCell

    cell.answerLetterButton.setTitleColor(Colors.answerLetterButtonColor, for: .normal)
    cell.letter = letters[indexPath.item]

    return cell
  }

sizeForItemAt:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let answerCellHeightMultiplier: CGFloat = answer.count > 18 ? 0.28 : 0.37
    return CGSize(width: (self.frame.width / cellCount) - cellSpacing, height: self.frame.height * answerCellHeightMultiplier)
}

自定义UICollectionViewCell:

class AnswerLetterCell: UICollectionViewCell {

  var letter: String? {
    didSet {
      guard let letter = letter else { return }

      if letter != " " {
        answerLetterButton.setTitle(letter, for: .normal)
        answerLetterButton.isHidden = false
      } else {
        answerLetterButton.isHidden = true
      }
    }
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
  }

  func setup() {
    addSubview(answerLetterButton)

    let resizedLetterButton = Helpers.resizeImageSize(uiView: self, ratio: 42/48, multiplier: 1)

    /* Letter Button Constraints */
    answerLetterButton.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    answerLetterButton.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    answerLetterButton.widthAnchor.constraint(equalToConstant: resizedLetterButton.width).isActive = true
    answerLetterButton.heightAnchor.constraint(equalToConstant: resizedLetterButton.height).isActive = true
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  /* Views */

  let answerLetterButton: UIButton = {
    let uiButton = UIButton()
    uiButton.translatesAutoresizingMaskIntoConstraints = false
    uiButton.setBackgroundImage(#imageLiteral(resourceName: "answer_letter_base.pdf"), for: .normal)
    uiButton.titleLabel?.font = Fonts.letterButtonFont
    uiButton.isUserInteractionEnabled = false
    return uiButton
  }()
}

展开
收起
游客5akardh5cojhg 2019-12-09 13:29:17 460 0
1 条回答
写回答
取消 提交回答
  • UICollectionViewDelegateFlowLayout有功能collectionView(_:layout:sizeForItemAt:)对集合视图中的每个可见单元格调用。 您的实现返回一个固定的宽度和一个带有值的动态高度。self.frame.height * answerCellHeightMultiplier,在哪里answerCellHeightMultiplier是answer.count > 18 ? 0.28 : 0.37,取决于属性answer. 因此,如果单元格应该具有动态高度,则取决于属性。answer, answer在显示集合视图时必须更改,这是不可能的。 我的建议是用在sizeForItemAt而不是answer对每个单元格具有正确高度值的数组。

    2019-12-09 13:29:37
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
对象的生命期管理 立即下载
继承与功能组合 立即下载
《用管控策略设定多账号组织全局访问边界》 立即下载