【问题标题】:cannot set UILabel padding in tableViewcell无法在 tableViewcell 中设置 UILabel 填充
【发布时间】:2017-11-07 09:46:16
【问题描述】:

我已经使用 StackOverflow 的 popular thread 设置了我的 UILabel 填充以解决自动布局问题。 这个线程基本上是一个 UILabel 扩展。

部分答案是:

class NRLabel : UILabel {

    var textInsets = UIEdgeInsets.zero {
        didSet { invalidateIntrinsicContentSize() }
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        let insetRect = UIEdgeInsetsInsetRect(bounds, textInsets)
        let textRect = super.textRect(forBounds: insetRect, limitedToNumberOfLines: numberOfLines)
        let invertedInsets = UIEdgeInsets(top: -textInsets.top,
                                          left: -textInsets.left,
                                          bottom: -textInsets.bottom,
                                          right: -textInsets.right)
        return UIEdgeInsetsInsetRect(textRect, invertedInsets)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, textInsets))
    }
}

一切正常,已添加填充,但我需要重新加载 tableViewcell 才能看到效果。

我已经像这样为 padding

覆盖了我的 customCell 的 viewWillLayoutSubviews() 函数
 self.chatLabel.textInsets = UIEdgeInsets.init(top: 10, left: 10, bottom: 10, right: 10)

而且效果是这样的。

你看,第一个标签在重新加载单元格后得到了填充。

请建议如何使用上述扩展实现UILabel填充,以便解决此问题。

【问题讨论】:

  • 不清楚您要达到的目标。你想要一个带填充的 UILabel 吗?有什么理由不将标签作为 UIView 的子视图,而只使用自动布局和约束?
  • @elk_cloner 你在你的单元格中使用了 cell.dequeue 吗?
  • 我使用了自定义单元格。我想要带有填充的 ui 标签
  • 我认为问题不在于标签...请检查表格单元格高度...是否相同?...请检查。

标签: ios iphone swift uitableview uilabel


【解决方案1】:

添加 这两个函数进入你的扩展并删除所有其他:

 override func drawText(in rect: CGRect) {
            let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
            super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
        }
        override var intrinsicContentSize : CGSize {
            var intrinsicSuperViewContentSize = super.intrinsicContentSize
            intrinsicSuperViewContentSize.height += topInset + bottomInset
            intrinsicSuperViewContentSize.width += leftInset + rightInset
            return intrinsicSuperViewContentSize
        }

【讨论】:

    【解决方案2】:

    使用您的 NRLabel 课程,这对我来说很好。 theLabel 已添加到 Storyboard TableViewCell 原型中,并设置了约束以允许自动调整行大小。

    class PaddedLabelCell : UITableViewCell {
    
        @IBOutlet weak var theLabel: NRLabel!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            self.setupLabel()
        }
    
        func setupLabel() -> Void {
            theLabel.layer.cornerRadius = 8.0
            theLabel.layer.masksToBounds = true
            theLabel.textInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
            // any other setup stuff can go here....
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      您在 NRLabel 中没有任何内容告诉它在 textInsets 属性更改时重绘。你需要做这样的事情:

      var textInsets = UIEdgeInsets.zero {
          didSet { 
              invalidateIntrinsicContentSize() 
              setNeedsDisplay()
          }
      }
      

      所以现在当 textInsets 属性发生变化时,NRLabel 将使用新的文本插图重新绘制。

      【讨论】:

        【解决方案4】:

        经过长时间的劳累,我找到了我从未尝试过的解决方案,我不知道为什么。 :(

        cellForRowAtIndexPath 中,我只写了 customCell 文件中的行。

        在返回单元格之前调用此行。

        cell.chatLabel.textInsets = UIEdgeInsets.init(top: 10, left: 10, bottom: 10, right: 10)
        

        其背后的原因可能是,Cell 绘制了所有功能,但没有太多刷新它的 UI。 因此,在显示单元格之前调用该行可以解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          • 1970-01-01
          • 2015-04-21
          • 1970-01-01
          相关资源
          最近更新 更多