首页 > 解决方案 > 第一次在 UITableView 中的 tableview 单元格 XIB 的高度不正确?

问题描述

我很难解决一个问题。我有一个包含许多原型单元格的表格视图。其中一个我正在使用标签视图来显示选择的多个标签。所以我使用了一个 XIB 文件,它有一个 TAGVIEW 作为它的子视图,并且我在 tableview 单元格中使用了那个 XIB。现在,当我第一次加载表格视图并向下滚动时,单元格的高度很大,但是当我向下和向上滚动时,它适合标签的大小。我尝试了以下解决方案,但没有一个有效。

我尝试了解决方案:

1.cell.layoutIfNeeded 在返回单元之前。

2.cell.layoutSubView

3.cell.tagView.layoutIfNeeded

4.cell.setNeedsLayout()

5.在ViewDidAppear中重新加载tableview

6.在tagViewCellXIB中,在AwakeForNib方法中添加了self.layoutIfNeeded。

7.在 tagViewCellXIB 中,覆盖 didMoveToParent() 并添加 self.layoutIfNeeded。

  1. 我已经给出了估计的行高。

这是 tagViewCell 类

class TagViewCell: UITableViewCell {

    @IBOutlet weak var tagView: TagListView!
    @IBOutlet weak var textfield: UITextField!
    @IBOutlet weak var titleLbl: UILabel!
    @IBOutlet weak var heightTagViewConstraint : NSLayoutConstraint!
    @IBOutlet weak var lblValidation: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.layoutIfNeeded()
        // Initialization code
    }
    override func didMoveToSuperview() {
        super.didMoveToSuperview()
        self.layoutIfNeeded()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
        self.heightTagViewConstraint.constant = 35
    }


    func configureView(type: TagCellType){

        switch type {

        case .Language:
            setupLanguageCell()

            titleLbl.text = "Language"
            textfield.isHidden = true
            if UserData.userData.language.count == 0{
                tagView.isHidden = true
                textfield.isHidden = false
                textfield.placeholder = "What languages do you speak?"
            }
            break

        default:
            textfield.isHidden = true

            setupTagCell(tagType: type)
            if type == .preferArea {
                seUpPreffredAreaValidation()
                titleLbl.text = "Preferred areas"
                if UserData.userData.preferAreaArr.count == 0{
                    tagView.isHidden = true
                    textfield.isHidden = false
                    textfield.placeholder = "What areas do you prefer?"
                }
            }
            else if type == .City{
                titleLbl.text = "Preferred cities"

                if UserData.userData.cities.count == 0{
                    tagView.isHidden = true
                    textfield.isHidden = false
                    textfield.placeholder = "What city do you prefer? (Optional)"
                }
            }else{
                titleLbl.text = "Preferred countries"

                if UserData.userData.country.count == 0{
                    tagView.isHidden = true
                    textfield.isHidden = false
                    textfield.placeholder = "What country do you prefer? (Optional)"
                }
            }
            break
        }
    }



    /// Set up tag view 
    func setupLanguageCell() {
        tagView.removeAllTags()
        tagView.tag = 1003 // For Language field
        for (index, elememt) in UserData.userData.language.enumerated() {

            print(index)
            if let langDict = elememt as? NSDictionary{
                tagView.isHidden = false

                let languageTagView = tagView.addTag(langDict.value(forKey: "lang_name") as! String)
                languageTagView.tagBackgroundColor = UIColor.clear
                languageTagView.textColor = .black
                languageTagView.textFont = UIFont.systemFont(ofSize: 17)
                languageTagView.paddingX = -1
                languageTagView.isUserInteractionEnabled = false

                let levelTagView = tagView.addTag(Constants.languageLevel[langDict.value(forKey: "level") as! Int])
                levelTagView.frame = CGRect(x: levelTagView.frame.origin.x, y: (languageTagView.frame.height / 2) - (levelTagView.frame.height / 2) + 2, width: levelTagView.frame.width, height: levelTagView.frame.height)
                levelTagView.layoutIfNeeded()
                levelTagView.layoutSubviews()
                levelTagView.tagBackgroundColor = UIColor().textOrange()
                levelTagView.textFont = UIFont.systemFont(ofSize: 10)
                levelTagView.cornerRadius = 6

                print("pading yyyyyy \(String(describing: tagView.rowViews.last?.frame.minY))")
                if UserData.userData.language.count == index+1{
                    if (tagView.rowViews.last?.frame.minY)! == 48{
                        levelTagView.frame.origin.y = (languageTagView.frame.height / 2) - (levelTagView.frame.height / 2) + 8
                    }
                }
            }
        }
        if UserData.userData.language.count == 0 {
            self.lblValidation.isHidden = false
        } else {
            self.lblValidation.isHidden = true
        }
    }

    func seUpPreffredAreaValidation() {
        if UserData.userData.preferAreaArr.count == 0 {
            self.lblValidation.isHidden = false
        } else {
            self.lblValidation.isHidden = true
        }
    }

    /// setup cell for country and cities
    ///
    /// - Parameter tagType: type of cell country or cities
    func setupTagCell(tagType:TagCellType)   {
        tagView.removeAllTags()
        var tagArray:[String] = []
        tagArray = UserData.userData.country
        tagView.tag = 1001 // For countries field

        if tagType == .City {
            tagArray = []
            tagArray = UserData.userData.cities
            tagView.tag = 1002 // For city field
        }

        if tagType == .preferArea {
            tagArray = []
            tagArray = UserData.userData.preferAreaArr
            tagView.tag = 1003
        }

        var tagValue = ""
        for (_, elememt) in tagArray.enumerated() {
            tagView.isHidden = false
            print(elememt)
            if elememt.characters.count > 17 {
                let index = elememt.index(elememt.startIndex, offsetBy: 16)
                tagValue = elememt.substring(to: index) + ".."
            }else{
                tagValue = elememt
            }

            let levelTagView = tagView.addTag(tagValue)
            levelTagView.tagBackgroundColor = UIColor().textOrange()
            tagView.textFont = UIFont.systemFont(ofSize: 17)
            levelTagView.cornerRadius = 8
            levelTagView.enableRemoveButton = false
            levelTagView.paddingX = 6
            levelTagView.paddingY = 3
        }
    }
}

对于 cellForRowAtIndexPath 使用下面的代码

let cell = self.tableView.dequeueReusableCell(withIdentifier: "tagcell", for: indexPath) as! TagViewCell
        cell.configureView(type: .City)
        cell.tagView.delegate = self

        if UserData.userData.cities.count >= 0 && UserData.userData.cities.count <= 3 {
            cell.heightTagViewConstraint.constant = 25.7
        }
        else if let height = cell.tagView.subviews.last?.frame.maxY {
            cell.heightTagViewConstraint.constant = height + 10
        }

        return cell

标签: iosswiftuitableviewautolayout

解决方案


像下面这样覆盖layoutSubviews你的TagViewCell班级

class TagViewCell: UITableViewCell {
    override func layoutSubviews() {
        //Set the frame of tagView here
        //self.tagView.frame = 
    }
}

cell.layoutIfNeeded在返回单元格时调用。如果您仍然有任何问题,请发表评论。我们是来帮助你的。


推荐阅读