我使用此功能使UITextView在键入时自动适合文本内容。当TextView是水平的时,它可以正常工作,但是当TextView旋转时,它不能正常工作。任何想法如何解决?
func textViewDidChange(_ textView: UITextView) {
let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}
答案 0 :(得分:0)
根据docs:
如果此属性的值不是恒等变换,则
frame
属性中的值是未定义的,应忽略。
我认为这可能是您的代码无法正常工作的原因-应用转换后frame
未定义。
尝试在设置框架之前将转换设置回身份:
let transform = textView.transform
textView.transform = .identity
let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
textView.transform = transform
答案 1 :(得分:0)
我已经看到UITextView有时不能很好地用于转换。 将您的UITextView包裹在UIView中。将UITextView的顶部,顶部,底部和尾部内容设置为UIView。在UIView上执行所有转换。你应该很好。
答案 2 :(得分:0)
我有同样的问题,我看到了这个问题,然后我就这样解决了;
extension UITextView {
func calculateSize() {
let currentTransform = transform
transform = .identity
let currentCenter = center
let fixedWidth: CGFloat = font == nil ? 300 : text.widthOfString(usingFont: font!) + 16 // 300 for the worst case scenario and 16 is for leading and trailing spaces for content
sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
let newSize = sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
var newFrame = frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
frame = newFrame
center = currentCenter
transform = currentTransform
layoutIfNeeded()
}
}