Alineación vertical de iOS 7 UITextView
objective-c ipad (8)
¿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?
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;
}
Compruebe la inserción de contenido superior de textView en -viewDidLoad
:
NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset));
Restablecerlo en el guión gráfico si no es cero
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
Inspirado por Kiattisak, he implementado la alineación vertical como una categoría sobre UITextView
para que pueda controlar la alineación vertical de UITextView
heredado.
Usted puede encontrarlo como una esencia aquí .
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?)
}
Swift version of Tanguy.G''s answer:
if(UIDevice.currentDevice().systemVersion >= "7.0") {
self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?)
}
Tuve el mismo problema con iOS 8.1 y ninguna de estas sugerencias funcionó.
Lo que sí funcionó fue ir al Storyboard y arrastrar mi UITableView
o UITextView
para que ya no fuera la primera subvista de UIView de mi pantalla.
http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView
Parece estar relacionado con tener una UIView
incrustada en un UINavigationController
.
Error ? Error ? ¿Dije "error" ...?
;-)
uso - observerForKeyPath
con contentSize KeyPath
Busca un código en Mi blog (no te centres en el idioma tailandés )
http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html