简体   繁体   中英

Single line text takes two lines in UILabel

在此输入图像描述

As you can see in the picture the middle cell has a UILabel that consumes two lines, but the text is actually a single line. It seems that if the text needs only few characters to create a new line, iOS assumes that it already has 2 lines. This is odd.

This is how I create the label:

self.titleLabel.lineBreakMode = .ByTruncatingTail
self.titleLabel.numberOfLines = 0
self.titleLabel.textAlignment = .Left

The constraints are set once:

self.titleLabel.autoPinEdgeToSuperviewEdge(.Top)
self.titleLabel.autoPinEdgeToSuperviewEdge(.Leading)
self.titleLabel.autoPinEdgeToSuperviewEdge(.Trailing)
self.titleLabel.autoPinEdgeToSuperviewEdge(.Bottom)

The weird thing is, when the table is scrolled so that the odd cell disappears and scrolled back again it has its normal height. After scroll:

在此输入图像描述

Any ideas whats wrong? I am using swift, xcode6.1 and iOS8.1

TableViewController:

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.registerClass(CityTableViewCell.self, forCellReuseIdentifier:"cell")
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 52
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if let cell: CityTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as? CityTableViewCell {
        // Configure the cell for this indexPath
        cell.updateFonts()
        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        if indexPath.row == 1 {
            cell.titleLabel.text = "Welcome to city 17, Mr. Gordon F."
        } else {
            cell.titleLabel.text = "Lamar!!!"
        }
        // Make sure the constraints have been added to this cell, since it may have just been created from scratch
        cell.setNeedsUpdateConstraints()
        cell.updateConstraintsIfNeeded()

        return cell
    }
    return UITableViewCell();
}

I think you met this bug: http://openradar.appspot.com/17799811 . The label does not set the preferredMaxLayoutWidth correctly.

The workaround I chose was to subclass UITableViewCell with the following class:

class VFTableViewCell : UITableViewCell {

    @IBOutlet weak var testoLbl: UILabel!

    //MARK: codice temporaneo per bug http://openradar.appspot.com/17799811

    func maxWidth() -> CGFloat {

        var appMax = CGRectGetWidth(UIApplication.sharedApplication().keyWindow.frame)

        appMax -= 12 + 12    // borders, this is up to you (and should not be hardcoded here)

        return appMax
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        // MARK: Required for self-sizing cells.
        self.testoLbl.preferredMaxLayoutWidth = maxWidth()
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        // MARK: Required for self-sizing cells
        self.testoLbl.preferredMaxLayoutWidth = maxWidth()
    }
}

OP-Note:

It seems that auto layout does not calculate the width of the UILabel layout correctly. Setting the preferred width to the parents width in my UITableViewCell subclass solves my problem:

self.titleLabel.preferredMaxLayoutWidth = self.frame.width

Found on SO: https://stackoverflow.com/a/19777242/401025

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM