Francesco
Francesco

Reputation: 229

Center text vertically in UItextView in iOS 9

Since iOS 9 update the following code does not work anymore for me.

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    UITextView *tv = object;
    CGFloat topCorrect = ([tv bounds].size.height - [tv     contentSize].height * [tv zoomScale])/2.0;
    topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
    tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:NO];
    [questionTextView addObserver:self forKeyPath:@"contentSize"    options:(NSKeyValueObservingOptionNew) context:NULL];

}

Is there a workaround to center text vertically for iOS 9?

Upvotes: 3

Views: 1789

Answers (1)

s.ka
s.ka

Reputation: 498

Instead of setting the contentOffset, you can set the contentInset instead (Just change the last line of code in the observeValueForKeyPath method):

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    UITextView *tv = object;
    CGFloat topCorrect = ([tv bounds].size.height - [tv     contentSize].height * [tv zoomScale])/2.0;
    topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
    [tv setContentInset:UIEdgeInsetsMake(topCorrect,0,0,0)];
}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:NO];
    [questionTextView addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
}

I used 0,0, and 0 for the left,bottom and right edge insets respectively. Make sure to calculate those as well for your use case.

Note: The code you posted is still logically correct. However, If you KVO the contentOffset, iOS 9 sets it to 0 at the last moment, overriding your changes to contentOffset.

Upvotes: 5

Related Questions