代码之家  ›  专栏  ›  技术社区  ›  TechChain

第一次在uitableview中tableview单元格xib的高度不正确?

  •  0
  • TechChain  · 技术社区  · 6 年前

    我很难解决一个问题。我有一个表格视图,里面有很多原型单元。其中一个我正在使用标记视图来显示多个选定的标记。因此,我使用了一个xib文件,它有一个tagview作为它的子视图&我在tableview单元格中使用了这个xib。现在,当我第一次加载tableview并向下滚动时,单元格的高度很大,但是当我向下滚动和向上滚动时,它适合标记的大小。我已经尝试了下面的解决方案,但没有成功。

    我试过解决办法:

    1.返回单元格前需要cell.layoutifn。

    2.单元格布局子视图

    3.需要cell.tagview.layoutifneeded

    4.单元格.setNeedsLayout()

    5.视图中的reload tableview出现

    6.在TagViewCellXb中,在awakeforNib方法中添加了self.layoutifNeeded。

    7.在TagViewCellXb中,override didMoveToParent()&added 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
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Torongo    6 年前

    重写 layoutSubviews 在你 TagViewCell 类贝娄

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

    并打电话 cell.layoutIfNeeded 回牢房的时候。如果你仍然有任何问题,请评论。我们是来帮助你的。