我有一个包含UITextView的collectionView。我想动态设置TextView的字体大小。经过调查,我发现以下代码。它适用于UITextView动态字体大小。如果文本较长,则代码会根据UITextView框架高度来排列最合适的字体大小。
但是我的问题是,当ViewController确实加载时,UICollectionViewCell中的UITextView字体大小没有正确更改。但是当我滑动到另一个单元格时,字体大小会正确更改。然后我再次滑动到第一个单元格,字体大小设置正确的字体大小。
因此,当ViewController加载后,UICollectionViewCell(称为QuoteCell)中的UITextView字体大小为20pt,但必须为36pt。但是如果不滑动到另一个单元格并向后滑动,就无法设置此大小。
我试图在awakeFromNib和willDisplayCell或cellForRowAtIndexPath方法中设置字体。我也尝试使用setNeedDisplay,但没有用。
出什么问题了?我忽略了什么?
// This codes adjust font size according to UITextView size.
extension UITextView {
func updateTextFont() {
if (self.text.isEmpty || self.bounds.size.equalTo(CGSize.zero)) {
print("Text Empty")
}
let textViewSize = self.frame.size
let fixedWidth = textViewSize.width
let expectSize = self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT)))
var expectFont = self.font
if (expectSize.height > textViewSize.height) {
while (self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height > textViewSize.height) {
expectFont = self.font!.withSize(self.font!.pointSize - 1)
self.font = expectFont
}
}
else {
while (self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height < textViewSize.height) {
expectFont = self.font!.withSize(self.font!.pointSize + 1)
self.font = expectFont
}
}
}
}
然后在willDisplayCell方法中设置txtQuote文本大小。(我在cellForRowAtIndexPath和awakeFromNib方法中尝试了此方法。)
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
let quoteCell = cell as! QuoteCell
quoteCell.layer.masksToBounds = false
quoteCell.txtQuote.updateTextFont()
}