Monday, May 21, 2012

How to stop UITextView from scrolling up when entering it


I have a UITextView included in a UITableViewCell . The layout is correct when the views are initially displayed, but once I click in the UITextView it automatically scrolls up a bit and the top half of the characters on the first line becomes invisible.



This image is when the UITextView is not active:

UITextView not active



And this one is when I clicked in the UITextView to make it active:

UITextView active



I do not the UITextView to scroll up at all, it should simple stay fixed. How can I achieve this? I already tried several settings in Interface Builder , but no luck so far.



Any suggestions are appreciated.



Gero


Source: Tips4all

4 comments:

  1. This is how UITextView behaves according to Apple's engineer this is intended and UITextView is meant for text that are at least a few lines in height. There is no work around to this, use a UITextField instead or increase your UITextView to at least 3 lines in height.

    ReplyDelete
  2. UITextView is a subclass of UIScrollView, so it has a configurable contentInset property. Unfortunately, if you try to change contentInset on a UITextView instance, the bottom edge inset always gets reset to 32. I've run into this before with short UITextView frames and found this to be an issue. I suspect this is what is causing your problem, but you should check the contentInset of your textview in the debugger to be sure.

    The workaround/solution is simple: subclass UITextView and override the contentInset method so that it always returns UIEdgeInsetZero. Try this:

    //
    // BCTextView
    //
    // UITextView seems to automatically be resetting the contentInset
    // bottom margin to 32.0f, causing strange scroll behavior in our small
    // textView. Maybe there is a setting for this, but it seems like odd behavior.
    // override contentInset to always be zero.
    //
    @interface BCZeroEdgeTextView : UITextView
    @end

    @implementation BCZeroEdgeTextView

    - (UIEdgeInsets) contentInset { return UIEdgeInsetsZero; }

    @end

    ReplyDelete
  3. You can also just do:

    textView.contentInset=UIEdgeInsetsZero;


    in your delegate file.

    ReplyDelete
  4. I was experiencing a similar issue with undesired UITextView scrolling. I finally managed to fix it by resetting the contentSize at the end of my keyboardDidShow:

    - (void)keyboardDidShow:(NSNotification *)notification {
    textView.contentSize = CGSizeZero;
    }


    You also will need to register for the keyboard notification, like so:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];


    In my case I didn't want any scrolling since I was resetting the frame to the height of the textView's contentSize when textViewDidChange (growing textview inside a UIScrollView).

    ReplyDelete