Неправильная высота ячейки табличного представления XIB в UITableView впервые? - PullRequest
0 голосов
/ 23 мая 2018

Мне трудно решить одну проблему.У меня есть таблица, в которой есть много прототипов клеток.Один из них я использую tagview, чтобы показать несколько выбранных тегов.Поэтому я использовал XIB-файл, который имеет TAGVIEW в качестве подпредставления, и я использовал этот XIB в ячейке таблицы.Теперь, когда я впервые загружаю таблицу и прокручиваю ее вниз, высота ячейки велика, но когда я прокручиваю вниз и вверх, это соответствует размеру тегов.Я пробовал ниже решения для, но не из них работали.

Я пробовал решения:

1.cell.layoutIfNeeded перед возвращаемой ячейкой.

2.cell.layoutSubView

3.cell.tagView.layoutIfNeeded

4.cell.setNeedsLayout ()

5.Relaod просмотр таблицы в ViewDidAppear

6.В теге ViewCellXIB, в AwakeForNibдобавлен метод self.layoutIfNeeded.

7. В tagViewCellXIB переопределите didMoveToParent () и добавьте self.layoutIfNeeded.

Я уже указал приблизительную высоту строки.

Вот 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

1 Ответ

0 голосов
/ 23 мая 2018

Переопределите layoutSubviews в вашем TagViewCell классе, как показано ниже

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

и вызовите cell.layoutIfNeeded при возврате ячейки.Если у вас возникли проблемы, пожалуйста, прокомментируйте.Мы здесь, чтобы помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...