2017-01-19 75 views
7

我有一個UITableView單元格包含UILabel。 UILabel有一個自定義的UIEdgeInset。我劃分子類的UILabel和這樣設置UIEdgeInsets:UILabel與自定義UIEdgeInsets截斷UITableViewCell

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

override var intrinsicContentSize: CGSize { 
    var contentSize = super.intrinsicContentSize 
    contentSize.width += leftInset + rightInset 
    contentSize.height += topInset + bottomInset 
    return contentSize 
} 

但標籤被截斷,有時當我在的UILabel多行。 我已經將行高配置爲UITableViewAutomaticDimension並設置了估計的行高。約束也很好。 這個問題似乎是當我設置UIEdgeInsets,因爲它工作正常,如果我不定製它。

也許我應該告訴細胞在設置插入之後更新約束,但是我目前無法做到這一點。

在故事板中添加的約束。 BottomTopLeadingTrailing與superview(UITableViewCell)有關。所有常數設置爲0。

cellForRowAtIndexPath的代碼如下:

let cell = tableView.dequeueReusableCell(withIdentifier: "AnswersCell", for: indexPath) as! AnswerCell 
cell.answerLabel.text = alternatives[indexPath.row] 
return cell 
+0

盧卡斯,你說的標籤只能被截斷當您在標籤多行?截斷我假設你的意思是細胞分隔器水平切斷 - 即單元格沒有正確擴展以容納標籤中的額外行。那是對的嗎? –

+0

您的標籤子類對於自我尺寸表格視圖單元格的行爲正確,因此您可能希望共享您用於設置表格視圖單元格和子視圖的代碼。 – jamesk

+0

@thecloud_of_unknowing是的,字符串不適合視圖。當我有多條線時,它不會一直髮生。它似乎沒有考慮我設置的新UIEdgeInsets。所以在某些情況下它可以很好地適用,但其他的可能會被截斷,因爲它預計會留下更多的寬度空間。 –

回答

-1

我我的子類的標籤是這樣的:

class PaddingLabel: UILabel { 

    var topInset: CGFloat = 0 
    var bottomInset: CGFloat = 0 
    var leftInset: CGFloat = 0 
    var rightInset: CGFloat = 0 

    override func drawText(in rect: CGRect) { 
     let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) 
     super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) 
    } 

    override var intrinsicContentSize: CGSize { 
     get { 
      var contentSize = super.intrinsicContentSize 
      contentSize.height += topInset + bottomInset 
      contentSize.width += leftInset + rightInset 
      return contentSize 
     } 
    } 
} 

也許這是缺少了get

+0

其實並非如此。當你有一個只讀的計算屬性時,你可以通過刪除'get'關鍵字及其大括號來簡化它。 –

+0

嗯,這個標籤對我來說工作的很好。我需要做的就是設置變量(頂部,底部,左側,右側的插圖),這很好去 – Quaggie

1

在一個多標籤的自動佈局的UILabel不使用其intrinsicContentSize酒店所提供的寬度計算它的高度,而是使用preferredMaxLayoutWidth,它一直沒有調整考慮到您的內容插圖的。

爲的UILabel頭文件提供了用於preferredMaxLayoutWidth以下評論:確定-intrinsicContentSize用於多線標籤

在你的情況下,所期望的值時

//如果爲非零,這是用來對於preferredMaxLayoutWidth是標籤的自動佈局寬度(即表格視圖單元格的寬度)減去任何左側和右側內容插頁。設置該屬性的最實用方法是在表格視圖單元格子類中,因爲這是在自動佈局過程中訪問表格視圖單元格寬度的最直接的地方。

當爲自調整表格視圖單元格執行自動佈局時,UITableView在每個單元格上調用systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority)。 (請參閱WWDC 2014 Session 226。)傳遞給該方法的配件尺寸爲高度爲零的表視圖的寬度,水平配件優先級爲UILayoutPriorityRequired

所以,重寫這個方法,併爲preferredMaxLayoutWidth所需的值:

// AnswerCell.swift 

@IBOutlet weak var answerLabel: AnswerLabel! 

override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize { 
    answerLabel.preferredMaxLayoutWidth = targetSize.width - answerLabel.insets.left - answerLabel.insets.right 
    return super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority) 
} 

的效果是,在汽車設計過程中計算它的高度,的UILabel使用已經調整了內容的preferredMaxLayoutWidth值insets,它確保UITableView爲其單元格接收正確的高度。

附錄

另一方面,不是所有的上述情況,你可以簡單地改變限制你的標籤上的插圖整個標籤,可直接在表格視圖單元格的內容視圖或將其嵌入到在內容視圖的另一個子視圖中。

+0

你的(1)是廢話,當圖形水平插入文本時,那麼'intrinsicContentSize'必須考慮到預留足夠的空間。 (2)儘管如此。 –

+0

@ChristianSchnorr繪製文本時不使用「intrinsicContentSize」的值。通過插入傳遞給'drawText(in:)'的矩形來保留水平空間。儘管'intrinsicContentSize'對OP的問題不負責,但仍然不正確 - 它返回的寬度大於標籤超級視圖的寬度。請保持民事。 – jamesk

+0

'intrinsicContentSize'確定視圖的對齊大小,即除非'alignmentRectInsets'非零,視圖的邊界大小。當視圖在繪製之前插入邊界時,「intrinsicContentSize」需要考慮這一點。 –

1

設置UILable的這兩個屬性從故事板

  1. 線的屬性檢查節0
  2. 斷行字包裹

,或者您也可以設置從代碼這些屬性。

self.answerLabel.numberOfLines = 0 
self.answerLabel.lineBreakMode = .byWordWrapping 

,並在您UILable的子類

class CustomLabel: UILabel { 

@IBInspectable var topInset: CGFloat = 5.0 
@IBInspectable var bottomInset: CGFloat = 5.0 
@IBInspectable var leftInset: CGFloat = 20.0 
@IBInspectable var rightInset: CGFloat = 5.0 

override func drawText(in rect: CGRect) { 
    let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) 
    super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) 
} 

override var intrinsicContentSize: CGSize { 
    get { 
     var contentSize = super.intrinsicContentSize 
     contentSize.height += topInset + bottomInset 
     contentSize.width += leftInset + rightInset 
     return contentSize 
    } 
} 

}

把下面的代碼試試這個。

希望它會爲你工作..

+0

爲了'intrinsicContentSize'在標籤上有用,你需要告訴它們你想讓它們破壞的地方:'preferredMaxLayoutWidth' –