ios - 第一次 UITableView 中的 tableview cell XIB 高度不正确?

标签 ios swift uitableview autolayout

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

我尝试了解决方案:

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

2.cell.layoutSubView

3.cell.tagView.layoutIfNeeded

4.cell.setNeedsLayout()

5.ViewDidAppear中Relaod tableview

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

7.在tagViewCellXIB中,重写didMoveToParent()并添加self.layoutIfNeeded。

  • 我已经给出了估计的行高。
  • 这是 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
    

    最佳答案

    TagViewCell 类中重写 layoutSubviews,如下所示

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

    并在返回单元格时调用cell.layoutIfNeeded。如果您仍然遇到任何问题,请发表评论。我们随时为您提供帮助。

    关于ios - 第一次 UITableView 中的 tableview cell XIB 高度不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50479163/

    相关文章:

    iphone - 带有 Facebook Connect 的移动 Web 应用程序的空白屏幕

    ios - 为什么 SKEmitterNode 会破坏累积的帧?

    ios - 将iOS应用崩溃报告从库发送到服务器

    json - Swift json 时间值到本地时区

    ios - UITableView重复重复单元格

    ios - 加载图像后调整 UITableViewCell 的大小

    ios - NSNotFound 的可用性如何?

    swift - 如何使用 firebase 重新验证用户

    ios - 转至 Storyboard Reference 后出错

    ios - UITableView 在从 connectionDidFinishLoading 获取数据之前出现