Alineación vertical de iOS 7 UITextView

¿Cómo es posible que mi UITextView editable (colocado dentro de un UIViewController directo dentro de UISplitView que actúa como delegado para UITextView ) no muestre texto desde el principio sino después de algo así como 6-7 líneas?

Captura de pantalla

No configuré ningún diseño automático especial o algo similar, intentar eliminar texto no ayuda (por lo que no hay chars escondidos o algo así).

Estoy usando iOS 7 en iPad, el guión gráfico se ve bien … El problema es el mismo en el simulador de iOS y en los dispositivos reales. Me estoy enojando: P

Aquí hay un código. Este es ViewController viewDidLoad()

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.itemTextField.delegate = self; self.itemTextField.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); self.itemTextField.textColor = [UIColor lightGrayColor]; //optional } 

Y aquí están las funciones anuladas para el UITextView Estoy usando un código que he encontrado en StackOverflow para simular un marcador de posición para la vista (lo mismo en la versión iPhone del guión gráfico funciona bien) …

 // UITextView placeholder - (void)textViewDidBeginEditing:(UITextView *)textView { if ([textView.text isEqualToString:NSLocalizedString(@"NEWITEMPLACEHOLDER", nil)]) { textView.text = @""; textView.textColor = [UIColor blackColor]; //optional } [textView becomeFirstResponder]; } - (void)textViewDidEndEditing:(UITextView *)textView { if ([textView.text isEqualToString:@""]) { textView.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); textView.textColor = [UIColor lightGrayColor]; //optional } [textView resignFirstResponder]; } -(void)textViewDidChange:(UITextView *)textView { int len = textView.text.length; charCount.text = [NSString stringWithFormat:@"%@: %i", NSLocalizedString(@"CHARCOUNT", nil),len]; } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { return YES; } 

Intenta llamar a -sizeToFit después de pasar el texto. Esta respuesta podría ser útil para alinear verticalmente el texto dentro de un UILabel .
[ACTUALIZAR]
Actualizo esta respuesta o la hago más legible.
El problema es que desde iOS7, los controladores de vista de contenedor como UINavigationController o UITabbarController pueden cambiar las inserciones de contenido de las vistas de desplazamiento (o las vistas que heredan de él), para evitar la superposición de contenido. Esto sucede solo si la vista de desplazamiento es la vista principal o las primeras subvistas. Para evitar esto, debe deshabilitar este comportamiento estableciendo automaticallyAdjustsScrollViewInsets AjustaScrollViewInsets a NO, o anulando este método para devolver NO.

Pasé por el mismo tipo de problema.

Lo resolvió deshabilitando el ajuste automático de las inserciones scrollView:

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

Este es un problema bastante común, por lo que crearía una subclase UITextView simple, para que pueda volver a utilizarla y usarla en IB.

Yo usaría el contentInset en su lugar, asegurándome de manejar con gracia el caso donde el contentSize es más grande que los límites del 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