2012-06-06 3 views
5

Tengo un UIScrollView que tiene varias vistas dinámicas dentro de él, cada una de las cuales tiene un campo de texto. Cuando empiezo a escribir en uno de los cuadros, quiero que la vista de desplazamiento se desplace para que el campo esté en la parte superior de la pantalla (visible sobre el teclado). Funciona de maravilla; Aquí está el código:Desplazamiento por UIScrollView para mostrar el más bajo de varios campos de texto

(void)didStartTyping:(id)sender { 
    [scrollView setContentOffset:CGPointMake(0, subView.frame.origin.y) animated:YES]; 
    scrollView.scrollEnabled = NO; 
} 

(void)didFinishTyping:(id)sender { 
    scrollView.scrollEnabled = YES; 
} 

Pero, cada vez que el punto de vista de desplazamiento se desplaza hasta la parte más alta y comienzo a escribir en el campo de texto visible más bajo, que no se desplaza hacia abajo lo suficiente (corto en un 40 px) Lo curioso es que funciona si me desplazo hacia abajo solo un píxel desde la parte superior de la vista de desplazamiento, pero cuando me desplazo hacia arriba, se comporta de manera muy diferente.

+1

tienes que entrar los marcos de scollview tanto en el escenario y comprobar qué hay? Lo que puedo pensar es que la compensación de fondos debe aumentarse. – rishi

+0

Bueno, eso hubiera tenido sentido. Pero, por ahora, el desagradable problema fue cambiar el tamaño de las subvistas para que cuando la vista se desplaza hacia arriba, no se pueda ver el campo de texto de la vista inferior. No es óptimo, pero funciona por ahora, y si vuelvo a esto, le contaré cómo funciona. Gracias Rishi. – Gazzini

+1

¿Puede desplazar manualmente la vista de desplazamiento a la posición deseada, es decir, no enfocar el campo de texto, pero arrastre la vista de desplazamiento donde desea que aparezca el teclado? ¿Puedes arrastrarlo a donde lo quieras? La mayoría de las veces, cuando el tamaño del contenido de la vista de desplazamiento adjunta su contenido, no se puede obtener el último elemento en la parte superior. Otra forma de decir esto es, ¿puedes intentar configurar la altura del tamaño del contenido para que sea mucho más grande que el contenido? – danh

Respuesta

2

La mejor manera que he logrado hacer esto es agarrar el marco del teclado, y luego actualizar mis vistas de desplazamiento cuando una vista de texto obtiene textViewDidBeginEditing: llamado. Aquí estoy utilizando una vista de tabla, pero la misma lógica debe aplicarse a una vista de desplazamiento, la principal diferencia es cómo se desplaza. Yo uso scrollToRowAtIndexPath, tendrá que utilizar scrollRectToVisible

//setup keyboard callbacks 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
} 

//this is called from your UITextViewDelegate when textViewDidBeginEditing: is called 
- (void)updateActiveTextScroll:(UITextView*)textView 
{ 
    activeTextView = textView; 
    UIEdgeInsets inset; 
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(UIInterfaceOrientationIsLandscape(orient)) 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.width, 0.0); 
    } 
    else 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0); 
    } 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 

    [myTableView scrollToRowAtIndexPath:activeNSIndexPath 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:YES]; 
} 

//dont forget to reset when the keyboard goes away 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets inset = UIEdgeInsetsZero; 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 
} 
Cuestiones relacionadas