Ширина, которую вы используете, является шириной для вашего UITextView ... но вас не интересует эта ширина, вы беспокоитесь о ширине фактической текстовой области, вложенной в текстовое представление.
UITextViews, по умолчанию, имеют отступы вокруг своих границ, чтобы создать пространство между напечатанным текстом и краем UITextView шириной в несколько пикселей (и длинным для верха) ... не использую
textView.frame.size.width
а точнее,
textView.frame.size.width-(textView.contentInset.left+textView.contentInset.right+textView.textContainerInset.left+textView.textContainerInset.right+textView.textContainer.lineFragmentPadding/*left*/+textView.textContainer.lineFragmentPadding/*right*/)
^, который принимает ширину UITextView и вычитает все отступы, так что вы остаетесь с шириной только текстовой области с возможностью ввода.
То же самое относится и к высоте, за исключением того, что lineFragmentPadding
не имеет дна, поэтому вы вычитаете его только один раз вместо двух.
Окончательный код выглядит примерно так:
CGSize textViewContentSize = CGSizeMake(theTextView.frame.size.width-(theTextView.contentInset.left+theTextView.contentInset.right+theTextView.textContainerInset.left+theTextView.textContainerInset.right+theTextView.textContainer.lineFragmentPadding/*left*/+theTextView.textContainer.lineFragmentPadding/*right*/), theTextView.frame.size.height-(theTextView.contentInset.top+theTextView.contentInset.bottom+theTextView.textContainerInset.top+theTextView.textContainerInset.bottom+theTextView.textContainer.lineFragmentPadding/*top*//*+theTextView.textContainer.lineFragmentPadding*//*there is no bottom padding*/));
CGSize calculatedSize = [theTextView.text sizeWithFont:theTextView.font
constrainedToSize:textViewContentSize
lineBreakMode:NSLineBreakByWordWrapping];
CGSize adjustedSize = CGSizeMake(ceilf(calculatedSize.width), ceilf(calculatedSize.height));