在UILabel上调用sizeToFit()并不总是在自定义tableview单元

时间:2016-01-10 16:22:06

标签: ios swift uitableview

我有一个自定义的tableview单元格当前,我有一个UILabel正在填充多行长的文本。但是,我不想改变自定义单元格的大小,所以我希望UILabel能够适应给定的大小。这是我的问题:

  1. 首次加载表时,UILabel将无法反映正确的高度,并且不会显示前3个或4个单元格的自动换行

  2. 一旦我开始滚动,新单元格会反映正确的高度,向后滚动会使旧单元格反映出正确的高度。

  3. 如果我来回滚动,标签会缩小它们的宽度并变得压扁。

  4. 我也在使用自动布局。以下是格式化标签的代码:

    private func assignBusAndRouteTextForIndex(card: ETACard, index: Int) {
            card.busNumberLabel.text = jsonValueForIndexAndSubscript(index, string: "rd")
    
            var route = jsonValueForIndexAndSubscript(index, string: "fd")
            route = route.stringByReplacingOccurrencesOfString("&", withString: "&")
            print(route)
    
            card.routeLabel.text = route
            card.routeLabel.adjustsFontSizeToFitWidth = true
            card.routeLabel.sizeToFit()
        }
    
        private func jsonValueForIndexAndSubscript(index: Int, string: String) -> String {
            return self.items.arrayValue[index][string].description;
        }
    

    这是我的自动布局限制: AutoLayout constraints of UILabel

    最后,我的自定义tableview单元类看起来像这样:

    import Foundation
    import UIKit
    
    //Dependancies
    import AnimationsFramework
    
    class ETACard: UITableViewCell {
        @IBOutlet weak var card: UIView!
        @IBOutlet weak var busNumberLabel: UILabel!   // Contains 'Bus:'
        @IBOutlet weak var routeLabel: UILabel! // Contains 'Via:'
        @IBOutlet weak var circleView: UIView!  // Contains the timing circle
        @IBOutlet weak var timeLabel: UILabel!  // Contains the arrival time
    
        override func layoutSubviews() {
            cardSetup()
            self.addSubview(card)
        }
    
        func cardSetup() {
            self.card.alpha = 1
            self.card.layer.masksToBounds = false
            self.card.layer.cornerRadius = 1
            self.card.layer.shadowOffset = CGSizeMake(-0.2, 0.2)
            self.card.layer.shadowRadius = 1
    
            let path = UIBezierPath(rect: self.card.bounds)
            self.card.layer.shadowPath = path.CGPath
    
            self.card.layer.shadowOpacity = 0.2
        }
    
        func renderCircleForBusTime(busTime: Int) {
            ShapeRenderer.renderCircleForBusTime(circleView, busTime: busTime)
        }
    
        func removeCircleFromCard(view: UIView) {
            ShapeRenderer.removeRenderedCircle(view);
        }
    }
    

    编辑:

    以下是我所谈论的一些渐进式截图。每个屏幕截图之间是滚动到列表底部,然后备份。 No Scrolls

    One scroll

    Two scrolls

    And so on...

    请注意文字如何逐渐缩小并开始削减。

1 个答案:

答案 0 :(得分:0)

经过多次搜索后,我在主题上找到了这个主题: UILabel sizeToFit doesn't work with autolayout ios6

事实证明,使用AutoLayout,sizeToFit不是一个选项。所以我查看了自动布局设置,看到我的底部设置为equal 30px,应该是less than or equal to 30px,以便可以展开文本框下方的空间。只要您的边有约束或者您有宽度约束,并且您将高度<=设置为某种尺寸,自动布局就应该处理它。