iOS 7 UITextView vertical alignment iOS 7 UITextView vertical alignment ios ios

iOS 7 UITextView vertical alignment

Try to call -sizeToFit after passing the text. This answer could be useful to Vertically align text within a UILabel.
I update this answer o make it more readable.
The issue is that from iOS7, container view controllers such as UINavigationController or UITabbarController can change the content insets of scroll views (or views that inherit from it), to avoid content overlapping. This happens only if the scrollview is the main view or the first subviews. To avoid that you should disable this behavior by setting automaticallyAdjustsScrollViewInsets to NO, or overriding this method to return NO.

I got through the same kind of issue.

Solved it by disabling the automatic scrollView insets adjustement :

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){    self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?)}

This is a fairly common problem, so I would create a simple UITextView subclass, so that you can re-use it and use it in IB.

I would used the contentInset instead, making sure to gracefully handle the case where the contentSize is larger than the bounds of the textView

@interface BSVerticallyCenteredTextView : UITextView@end@implementation BSVerticallyCenteredTextView- (id)initWithFrame:(CGRect)frame{    if (self = [super initWithFrame:frame])    {        [self addObserver:self forKeyPath:@"contentSize" options:  (NSKeyValueObservingOptionNew) context:NULL];    }    return self;}- (id)initWithCoder:(NSCoder *)aDecoder{    if (self = [super initWithCoder:aDecoder])    {        [self addObserver:self forKeyPath:@"contentSize" options:  (NSKeyValueObservingOptionNew) context:NULL];    }    return self;}-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if ([keyPath isEqualToString:@"contentSize"])    {        UITextView *tv = object;        CGFloat deadSpace = ([tv bounds].size.height - [tv contentSize].height);        CGFloat inset = MAX(0, deadSpace/2.0);        tv.contentInset = UIEdgeInsetsMake(inset, tv.contentInset.left, inset, tv.contentInset.right);    }  }- (void)dealloc{    [self removeObserver:self forKeyPath:@"contentSize"];}@end