2014-12-29 5 views
8

Ich habe eine UITableViewController mit vielen Zellen, jede Zelle enthält vier Textfelder vertikal aufeinander, ein Pop-Over ist Wenn Sie auf ein beliebiges Textfeld tippen, enthält dieses Pop-Over jedoch ein Textfeld, in dem die Tastatur ausgelöst wird. Wahrscheinlich wird das Pop-Over nach oben verschoben, um zu verhindern, dass die Tastatur das Textfeld verdeckt (dies ist das Standardverhalten des Pop over), aber im Hintergrund (die abgeblendete Ansicht) verliert das tableViewController sein korrektes Scrolling-Verhalten, um den Pop über distributing-textField auf der Spur zu halten, während die Tastatur sichtbar ist.Scrollen Sie die Tabellenansicht in das Pop-Over-Präsentation Textfeld, wenn Tastatur durch ein Textfeld im Pop über

Ein Beispielprojekt can be downloaded here.

Wie kann ich die Tabellenansicht verstellen, um das Popup-Fenster über dem displaying-textField auf dem Bildschirm zu halten, während die Tastatur in diesem Fall sichtbar ist?

Ich versuchte die bekannte TPKeyboardAvoiding Bibliothek, aber es hat das Problem nicht gelöst.

p.s. tableViewController funktioniert gut für die ersten 3 oder 4 Tastaturauslösungen, verliert aber bei späteren Versuchen das präzise Scrollen.

Screenshot (das grüne Textfeld ist das Textfeld, das den Pop über präsentiert, sondern tableViewController blättert zum falschen Textfeld in rot angezeigt): enter image description here

jede Hilfe sehr geschätzt werden würde.

EDIT: diese Frage ist kein Duplikat für: Making a UITableView scroll when text field is selected weil das Textfeld, das ich die Tabellen-Ansicht müssen blättern derjenige ist, der eine Pop über keine Tastatur feuert, und scrollToRowAtIndexPath nicht genau funktioniert in diesem Fall, weil jede Zelle 4 Textfelder enthält.

+0

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

+0

@Astoria TPKeyboardAvoiding das Problem nicht lösen, und ich gepostet diese Frage auch auf ihre github Fragen Seite. Stellen Sie – JAHelia

+0

manuell vielleicht – Andy

Antwort

0

Ändern Sie die gesamte Größe des Ansichtsrahmens.

Zum Beispiel keyboard height is 100 dann

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

rufen Dann didSelectRowAtIndexPath Verfahren wieder für denselben indexPath, so wird es die popover neu zu laden.

Dies ist nur eine Grundidee, es könnten einige Modifikationen erforderlich sein, um genaues Verhalten zu erreichen.

Hoffe, das wird Ihnen helfen.

1

Hier ist meine Lösung: Wechsel in TableViewController.m

1. Register für Tastatur Benachrichtigungen (UIKeyboardWillShowNotification, UIKeyboardWillHideNotification)

2. Erstellen Sie lokale Variablen:

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. In meinem presentPopover Methode:

- (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. als:

- (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; 

} 

Dies könnte hilft Ihnen :)

+0

dies bereits in meinem Projekt umgesetzt wird, lesen Sie die Frage sorgfältig – JAHelia

+0

Hallo @JAHelia, ich die Frage sorgfältig zu lesen, versucht, diese Lösung zu verwenden, um es Ihr Problem :) Danke gelöst würde. – Yuyutsu

+0

geben Sie mir eine Arbeitsbeispielprojekt oder diese auf dem beigefügten Projekt reflektieren – JAHelia

0

Wie wäre es Fügen Sie das Tag hinzu (00 0 1 02 03 10 11 12 13 ... usw.) für jede UITextField in der Zelle, von Zehner Sie die Zelle wissen können, von einzelnen Stellen Sie die Textfeld kennen.

+0

Datei habe ich versucht, so etwas wie dieses, aber nicht das Problem, wie man das Textfeld zu erreichen, aber wie die Tabellenansicht versetzt wird, um dem Textfeld zu entsprechen – JAHelia

0

Register für UIKeyboardWillShowNotification und wenn die Wähler ausgelöst wird, rufen Sie Ihren Pop über Code:

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

Der Grund dafür ist, dass die iOS Griffe selbst die popover präsentiert und Handhabungs es Rahmen ist. Daher ist es in der Regel eine gute Übung, den Pop-Over nach der Anzeige der Tastatur zu präsentieren.

this helps ..

2

Verwendung (CGRect) convertRect: (CGRect) rect toview: (UIView *) Ansicht Zellenposition auf Tableviews Superview zu bekommen und behandeln dementsprechend die Tableview Offset

Verwandte Themen