2017-05-14 84 views
1

我正在使用來自核心數據的文本數據來調整消息容器框架的大小,但是如果這樣做看起來幀的設置速度不夠快。我試圖把代碼放在overrideSubviews和setupViews中無濟於事。NSLayoutConstraints未設置(swift 3)

下面是眼下設置messageContainer框架

if let messageText = cell?.text { 
     let size = CGSize(width: 100, height: 40) 
     let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin) 
     let estimatedFrame = NSString(string: messageText).boundingRect(with: size, options: options, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 12)], context: nil) 



     messageContainer.translatesAutoresizingMaskIntoConstraints = false 
     messageContainer.frame.size.width = estimatedFrame.width 
     messageContainer.frame.size.height = estimatedFrame.height 



     addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .left , relatedBy: .equal, toItem: messageContainer, attribute: .left, multiplier: 1, constant: 5)) 

     addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .width , relatedBy: .lessThanOrEqual, toItem: messageContainer, attribute: .width, multiplier: 1, constant: 0)) 

     addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .height , relatedBy: .lessThanOrEqual, toItem: messageContainer, attribute: .height, multiplier: 1, constant: 0)) 



    } 

代碼中的文本只跑出畫面和不換行。

有什麼建議嗎?

編輯:我已經包含了容器應該看起來像messageLabel後面的屏幕截圖。這個版本與當前的區別是,當前正在使用的自動佈局,我認爲是什麼導致了問題... enter image description here

+0

這是在表格視圖單元格內嗎?你可以在圖片中畫出/展示視圖的結構以及你希望實現的目標嗎? – user1046037

+0

已更新的問題。這也是一個UICollectionView單元格 – Stefan

回答

0

問題:

根據您所設定的自動佈局系統的約束規定:

messageLabel.width < = messageContainer.width

但這可能不是你想要的。

解決方法:

你的真實意圖是什麼強加給權力的制約。

  • 刪除寬度約束。
  • 請勿設置messageContainer的框架,請使用約束條件。
  • 將所有這些設置在單元格的初始化程序中。

messageLabel.right < = messageContainer.right

代碼:

addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .right , relatedBy: . lessThanOrEqual, toItem: messageContainer, attribute: .right, multiplier: 1, constant: -5)) 

注:

請測試它,看它是否符合您的要求。

首選方案:

這將是很好,如果你可以使用以下命令:

0

只見塔您定義的寬度,高度和X位置,但你不定義Y位置。嘗試添加如下約束:

addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .CenterY, relatedBy: .Equal, toItem: messageContainer, attribute: .CenterY, multiplier: 1, constant: 0))