I have a UITextView in my app. I need to change it's content offset dynamically every time a new string is appended. The code bellow works fine on iOS 6 and earlier versions, but not on iOS 7.
CGPoint offset = CGPointMake(0, self.textView.contentSize.height - self.textView.frame.size.height);
[self.textView setContentOffset:bottomOffset animated:YES];
Do you have any ideas why?
Than you.
UPDATE
The UITextView doesn't set its contentOffset as it should, or something else mess it up. The result is not as expected (how it is on iOS 6 or earlier versions).
I've also tried setting the new property "textContainerInset" but still no results...
self.textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)
UPDATE
As I can see in the didScroll delegate method, when I pass a positive value for content offset, it scrolls to (0,0). For example, I set the content offset to (0,35) and it scrolls to (0,0)...
The solution I've found is not elegant at all, but it works:
I set the UITextView's contentOffset to (0,0) before setting it to the desired offset. I don't know why this works, but for now is the best solution I've found.
I've had to resort to
but the BIG problem with it is that it starts from the top of the text and scrolls to the end each time you append to the text. Mihai's solution also does that.
I just noticed that today. In my case the issue is apparently related to the Text View being the first control in the view. I moved it to second place in the document outline (after a UILabel for example) and the offset is gone.
Most probably this is done on purpose because of the navigation bar new behaviour in iOS7.
None of previous answers worked for me, because I had
[textView setScrollEnabled:NO]
. So, I ended up with this:Ok, based on my research and other answers, the problem was the
UITextView
's content height and not the scrolling to a specific offset. Here is a solution that works the way it should work for iOS 7:First, you need to recreate the
UITextView
like this:Then, use this method to get the
UITextView
content height:Now you can set the content offset:
UPDATE
I've read this in the Apple Documentation for
NSAttributedString
: "The default font for NSAttributedString objects is Helvetica 12-point, which may differ from the default system font for the platform."In conclusion, if you use different fonts of different sizes, you have to set those to the
NSAttributeString
instance as well. Otherwise, the returned height won't correspond to your expectations. You may want to use something like this:@vidonism's answer works but this is even better.
See also top comment of accepted answer on this question. This likely explains the behavior of a UIScrollView being the first subView of a ViewController's main view.
I can't quite discren if this is expected behavior or a bug.