在更多的UIButton上增加单元格高度的问题

时间:2019-03-31 19:56:45

标签: ios swift xcode uitableview nslayoutconstraint

也许我的问题重复了。但是,没有一个答案没有帮助。

现在我有 UITableViewController ,其中带有静态单元格,并且每个静态单元格中的rowHeight不同。

我有 UIButton ,他应该帮助我在 UILabel 中显示全文。

  • 第一行具有工具 collectionView 和height == 490.0
  • 第二行的 UILabel 中有文本,当我单击 UIButton 时,我想全文显示,默认高度为150.0,但是如果有文本,则需要更高的高度会有很多文字
  • 第三行具有工具 collectionView 和height == 150.0
  • 第四行具有工具 collectionView 和height == 150.0
  • 第五行具有 UILabel 和高度== 50.0

我的屏幕显示我在说什么。

我的代码:

class DetailTableViewController: UITableViewController {

    @IBOutlet weak var imagesCollectionView: UICollectionView!
    @IBOutlet weak var conveniencesCollectionView: UICollectionView! 
    @IBOutlet weak var equipmentAndOtherCollectionView: UICollectionView! 

    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var readMoreButton: UIButton!

    var hall: Halls?

    let eq = ["Без проходной", "Циклорама", "Дневной свет", "Условия для семинаров", "Трехфазная нагрузка", "Генераторный свет", "Моноблоки", "Системы крепления"]
    let con = ["Wi-Fi", "Платная парковка", "Кофе-машина", "Душ", "Организация мероприятий"] // [""]

    var readMore: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
        tableView.estimatedRowHeight = 50
        tableView.rowHeight = UITableViewAutomaticDimension
        descriptionLabel.text = hall.description
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch section {
        case 0: return 1
        case 1: return 1
        case 2: if eq.isEmpty || eq == [""] { return 0 } else { return 1 }
        case 3: if con.isEmpty || con == [""] { return 0 } else { return 1 } 
        default: return 1
        }
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.tableView.deselectRow(at: indexPath, animated: true)
    }

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0
    }

    @IBAction func readMoreButtonPressed(_ sender: UIButton) {
        readMore = true
        readMoreButton.isHidden = true
        //... code for reveal text
    }
}

hall.description 有文字Пространство рассчитано на различные виды съёмок. Также возможно проведение различных мастер-классов, семинаров, встреч и мероприятий. Профессиональное оборудование Profoto D1 500 Air (4 источника) и крепкими стойками Manfrotto. Великолепная акустика. Крепкая белоснежная циклорама с регулируемым подогревом пола.2 больших окна, дающие великолепный дневной жесткий и мягкий свет (солнечная сторона). Аудиосистема с USB и AUX. Уникальные декорации в LOFT стиле. Бесплатное гримерное место перед съемкой.Бесплатный wi-fi.

enter image description here

2 个答案:

答案 0 :(得分:1)

@ДмитрийДеникаев。

我找到了解决方案。您可以检查我的工作演示项目here.

1)您需要设置UILabel属性setNumberOfLines = 0

enter image description here

2)创建两个@IBOutlet约束以增加和减少视图,并设置其priority。例如priority = 750priority = 250反之亦然)。

  • 标签固定的第一个限制因素,在故事板上的优先级为750。

    enter image description here

  • 第二次将标签底部限制为其超级视图,并且在故事板中的优先级为250。

    enter image description here

**查看以下代码**

ViewTableViewCell.swift

  import UIKit

class ViewTableViewCell: UITableViewCell {


    @IBOutlet var fixedHeightCon : NSLayoutConstraint!
    @IBOutlet var graterHeightCon : NSLayoutConstraint!
    @IBOutlet weak var lblText : UILabel!
    @IBOutlet weak var btnMore: UIButton!
    override func awakeFromNib() {
        super.awakeFromNib()

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

ViewController.swift

 import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return  arrData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell : ViewTableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewTableViewCell
        cell.btnMore.tag = indexPath.row
        cell.lblText.text  = arrData[indexPath.row]
        cell.layoutSubviews()
        return cell

    }

    @IBOutlet weak var tblView: UITableView!
    var arrData = ["This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.This is long description.","This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123.This is long description123."]
    override func viewDidLoad() {
        super.viewDidLoad()
        tblView.tableFooterView = UIView()
        tblView.rowHeight = UITableView.automaticDimension
        tblView.estimatedRowHeight = 77
        tblView.delegate = self
        tblView.dataSource = self
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func changelabelHeight(sender:UIButton){
        let indexpath = NSIndexPath(row: sender.tag, section: 0)
        let cell = self.tblView!.cellForRow(at: indexpath as IndexPath) as? ViewTableViewCell

        if(cell!.fixedHeightCon.priority == UILayoutPriority(rawValue: 750)){
            cell!.btnMore.setTitle("Show Less", for: UIControl.State.normal)
            cell!.fixedHeightCon.priority = UILayoutPriority(rawValue: 250)
            cell!.graterHeightCon.priority = UILayoutPriority(rawValue: 750)



        }else{
            cell!.btnMore.setTitle("Read More", for: UIControl.State.normal)
            cell!.fixedHeightCon.priority = UILayoutPriority(rawValue: 750)
            cell!.graterHeightCon.priority = UILayoutPriority(rawValue: 250)

        }
        tblView.reloadData()

    }
}

我希望这个答案对您有所帮助。快乐编码:)

答案 1 :(得分:0)

如果将.amountOfLines上的UILabel属性设置为5,将自动截断字符串以适合5行。然后,当用户点击“阅读更多”按钮时,将其更改为0,以允许UILabel包含无限行以显示整个文本。如果您取消了放置在单元格上的高度限制并正确设置了自动布局,它将自动缩放。

此外,如果您希望对UILabel进行扩展动画处理,可以在以下位置找到该解决方案:https://stackoverflow.com/a/34284563/5544222