2014-12-29 9 views
8

Ho un UITableViewController con molte celle, ogni cella contiene quattro campi di testo verticali l'uno sull'altro, un pop-over è presentato toccando qualsiasi campo di testo, tuttavia, questo pop-up contiene un campo di testo quando viene toccata la tastiera e molto probabilmente il popover verrà spostato verso l'alto per impedire alla tastiera di nascondere il suo campo di testo (questo è il comportamento predefinito del pOP su), ma sullo sfondo (la vista in grigio), il tableViewController perde il suo comportamento lo scorrimento corretto per tenere pop over presentando-textField in pista, mentre la tastiera è visibile ..Scorri la vista tabella nel campo di testo pop-over quando la tastiera si accende da un campo di testo all'interno del pop over

un progetto di esempio can be downloaded here.

Come si può spostare la vista tabella per mantenere il pop over presentation-textField sullo schermo mentre la tastiera è visibile in questo caso?

Ho provato la nota libreria TPKeyboardAvoiding ma non ha risolto il problema.

p.s. tableViewController funziona bene per i primi 3 o 4 colpi di tastiera, ma perde lo scorrimento preciso nei tentativi successivi.

Schermata (il campo di testo verde è il campo di testo che ha presentato la comparsa sopra, ma tableViewController scorre al campo di testo errato indicato in rosso): enter image description here

qualsiasi aiuto sarebbe molto apprezzato.

EDIT: questa domanda non è un duplicato di: Making a UITableView scroll when text field is selected perché il campo di testo che ho bisogno della vista tabella per scorrere fino è quello che spara un pop sopra non una tastiera, e scrollToRowAtIndexPath non funziona con precisione in questo caso perché ogni cella contiene 4 campi di testo.

+0

https: //github.com/michaeltyson/TPKeyboardAvoiding – Astoria

+0

@Astoria TPKeyboardAvoiding non ha risolto il problema e ho postato questa domanda anche nella pagina dei problemi di github. – JAHelia

+0

Regola manualmente forse – Andy

risposta

0

Modifica l'intera dimensione del riquadro di visualizzazione.

Ad esempio, keyboard height is 100 quindi,

CGRect frame = self.view.frame; 
self.view.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height - keyboardHeight); 

quindi chiamare didSelectRowAtIndexPath metodo nuovo per lo stesso indexPath, così sarà ricaricare la popover.

Questa è solo un'idea di base, potrebbero esserci alcune modifiche necessarie per ottenere un comportamento esatto.

Spero che questo ti possa aiutare.

1

Ecco la mia soluzione: Cambio in TableViewController.m

1. registrazione per le notifiche della tastiera (UIKeyboardWillShowNotification, UIKeyboardWillHideNotification)

2. creare le variabili locali:

CGSize _currentPopoverContentSize; //if you want to have custom size for popover 

UIView *_currentPopoverSender; //to remember from wich view you will present popover 

BOOL _keyboardIsShown; //enable in keyboardWillShow, and disable in keyboardWillHide 

3. Nel mio metodo presentPopover:

- (void)presentPopoverControllerWithSize:(CGSize)size fromView:(UIView *)sender{ 

MyController *controller = [[[MyController alloc] init] autorelease]; 

if (self.popover) 
{ 
    [_popover release]; 
    _popover = nil; 
} 

_popover = [[UIPopoverController alloc] initWithContentViewController:controller]; 
_popover.popoverContentSize = size; 
_popover.delegate = self; 

//checking if keyboard is shown - if NO, than present popover, if YES - just `resignFirstResponder` for your _`activeTextField`(you can set it in -textFieldDidBeginEditing: and nullify in -textFieldDidEndEditing:) 
if (!_keyboardIsShown) 
{ 
    [_popover presentPopoverFromRect:[sender bounds] 
           inView:sender 
      permittedArrowDirections:UIPopoverArrowDirectionUp 
          animated:YES]; 
    _popOver.popoverContentSize = CGSizeMake(320, 700); 

} 
else 
{ 
    [_activeTextField resignFirstResponder]; 
} 

_currentPopoverContentSize = size; 
_currentPopoverSender = sender; 
} 

4. Than:

- (void)keyboardWillBeHidden:(NSNotification*)aNotification{ 

[UIView animateWithDuration:0.3 
       animations:^{ 
        //do some stuff 
        _popOver.popoverContentSize = CGSizeMake(320, 700); 

       } completion:^(BOOL finished) { 

        if (_popover && _currentPopoverSender) 
        { 
         [_popover presentPopoverFromRect:[_currentPopoverSender bounds] 
                inView:_currentPopoverSender 
           permittedArrowDirections:UIPopoverArrowDirectionUp 
               animated:YES]; 
        } 

       }]; 

_keyboardIsShown = NO; 
} 

5.:

-(void)textFieldDidBeginEditing:(UITextField *)textField{ 

    [textField resignFirstResponder]; 
    [self presentPopoverControllerWithSize:textField.frame.size fromView:_activeText]; 

//  self.vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"ProductSourcePopOver"]; 
// 
// if(_popOver == nil){ //make sure popover isn't displayed more than once in the view 
//  _popOver = [[UIPopoverController alloc]initWithContentViewController:self.vc]; 
// } 
// _popOver.popoverContentSize = CGSizeMake(320, 700); 
// 
// [_popOver presentPopoverFromRect:_activeText.frame inView:_activeText permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 
// _popOver.delegate = self; 

} 

Questo potrebbe voi :) aiuta

+0

questo è già implementato nel mio progetto, leggi attentamente la domanda – JAHelia

+0

Ciao @JAHelia, ho letto attentamente la domanda, ho cercato di usare questa soluzione per risolvere il tuo problema :) Grazie. – Yuyutsu

+0

dammi un esempio di progetto di lavoro o rifletto sul progetto allegato – JAHelia

0

Come su aggiungi il tag (00 0 1 02 03, 10 11 12 13 ... ecc.) Per ogni UITextfield nella cella, da decine di cifre si può sapere quale cella, da una sola cifra si conosce quale campo di testo.

+0

ho provato qualcosa del genere ma il problema non è come raggiungere il campo di testo ma come compensare la vista tabella per abbinare il campo di testo – JAHelia

0

Registrati UIKeyboardWillShowNotification e quando il selettore viene attivato, chiamare il pop nel corso Codice:

[self presentPopoverControllerWithSize:textField.frame.size fromView:_activeText]; 

La ragione di questo è che l'iOS gestisce presentandosi il popover di spedizione è cornice. Quindi è generalmente una buona pratica presentare il pop dopo che la tastiera è stata mostrata.

Spero che questo aiuti ..

2

uso (CGRect) convertRect: (CGRect) rect toview: (UIView *) Vista per ottenere la posizione delle cellule su tableviews superview e di conseguenza gestire la Tableview compensato

Problemi correlati