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

时间:2018-05-23 02:57:58

标签: ios swift uitableview autolayout

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

我尝试了解决方案:

返回单元格之前

1.cell.layoutIfNeeded。

2.cell.layoutSubView

3.cell.tagView.layoutIfNeeded

4.cell.setNeedsLayout()

5.ReDod ViewDidAppear中的tableview

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

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

  1. 我已经估算了行高。
  2. 这是tagViewCell Class

    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
    

0 个答案:

没有答案