Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>UITableView flackern beim verändern der Größe

UITableView flackern beim verändern der Größe

4D616321.10.1115:28
Hi,

ich hab folgendes Problem, und ich find als keine Lösung dafür. Ich hab mir eine TableView gebastelt mit Customcells in denen ein TextField vorhanden ist, wo man Text rein schreiben kann.
Wenn das TextField der FirstResponder wird, wird ein Delegate (- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField ) aufgerufen, was die Größe von dem TableView verändert, und außerdem das TextField in die Mitte ([tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionMiddle animated:YES]) von dem verkleinerten View bewegt.

Der Code mit dem ich die Größe von dem View verändere:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:.3];
tableView.frame = CGRectMake(0, 0, 320, 200);
[UIView commitAnimations];

Das Problem ist jetzt, wenn sich der Content in der TableView NICHT bewegt flackert nichts und es sieht alles schön aus, allerdings sobald sich der Content in der TableView bewegt, und dabei die Größe verändert wird fängt der Inhalt der TableView in dem Bereich an zu flackern wo er ausgeblendet, bzw wo nachher die Tastatur drüber liegt.
Sprich man könnte den Eindruck bekommen, die Animation von dem View wird sobald sich der Content in der Tableview verändert einfach ignoriert, bzw. der Resize erfolgt ohne Animation. Das sieht natürlich unschön aus, und ich würde mir wünschen, das man das irgendwie ohne flackern hin bekommt.

mfg
0

Kommentare

ExMacRabbitPro21.10.1115:45
Was meinst Du denn mit "Content in der TableView bewegt"? Was passiert da genau? Was bewegt sich da? Zeichnest Du etwas selbst?
0
4D616321.10.1116:25
Zeichnen tu ich nichts. Mit bewegen mein ich, das die TableView eben zu der oben genanten Position scrollt während die Größe von dem TableView verändert wird. Und dabei tritt das Phänomen auf, das praktisch die Animation von dem View wirkt, als sei sich abgebrochen, und und der Frame von der TableView gleich auf den Wert gesetzt wird.
Das ist schwierig zu beschreiben ohne ein Video, aber man kann sich das Programmtechnisch so vorstellen:

Wenn diese Methode
[tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionMiddle animated:YES]
eine Animation erzeugt wird praktisch nur noch der Code ausgeführt:
tableView.frame = CGRectMake(0, 0, 320, 200);
Wenn aber
[tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionMiddle animated:YES]
keine Animation erzeugt wird der Code
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:.3];
tableView.frame = CGRectMake(0, 0, 320, 200);
[UIView commitAnimations];
ausgeführt.

Letzterer Codeblock soll eigentlich immer ausgeführt werden, unabhängig davon, ob
[tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionMiddle animated:YES]
eine Animation erzeugt oder nicht.
0
ExMacRabbitPro21.10.1116:40
Ich denke dass Problem hier ist, dass zwei Animationen gleichzeitig ablaufen - wobei die eine (Größenänderung des TabelViews) sich auf Parameter der zweiten Animation (Positionierung einer Zelle im sichtbaren Tabellenbereich) direkt auswirkt. Mache es doch in zwei Schritten:

1. Verkleinerung des TableView
2. Scrollen der Zelle

Du kannst dich ja problemlos benachrichtigen lassen, wenn die resize Animation fertig ist und dann die Zelle positionieren.
0
4D616321.10.1117:00
Das ist eine Möglichkeit, allerdings finde ich diese auch nicht zufrieden stellen. Man nehme das Beispiel, die TableView Zelle mit dem TextField ist an der untersten Position der TableView, jetzt will ich dort Text rein schreiben, dann muss ich erst warten bis die Tastatur hoch gefahren ist, und muss dann nochmal dadrauf warten bis das Textfeld wieder erscheint. Das das auch irgendwie anders geht sieht man an einigen Programmen.
Nehmen wir z.B. das integrierte Telefonbuch, dort wird die Zelle auch in die Mitte des Bildschirms gescrollt, während die Tastatur einfährt, ohne das dort was verdeckt wird.
0
ExMacRabbitPro21.10.1118:19
4D6163
Das ist eine Möglichkeit, allerdings finde ich diese auch nicht zufrieden stellen. Man nehme das Beispiel, die TableView Zelle mit dem TextField ist an der untersten Position der TableView, jetzt will ich dort Text rein schreiben, dann muss ich erst warten bis die Tastatur hoch gefahren ist, und muss dann nochmal dadrauf warten bis das Textfeld wieder erscheint. Das das auch irgendwie anders geht sieht man an einigen Programmen.
Nehmen wir z.B. das integrierte Telefonbuch, dort wird die Zelle auch in die Mitte des Bildschirms gescrollt, während die Tastatur einfährt, ohne das dort was verdeckt wird.

Ja da hast Du recht - zufrieden wäre ich auch nicht. Ein paar andere Fragen/Optionen:
Was passiert wenn du animated:NO setzt?
Was passiert, wenn Du das Verschieben der Zelle mit in die

[UIView beginAnimations...

[UIView commitAnimations]

Klammer packst? Jeweils mit animated:YES/NO ?
0
4D616321.10.1118:46
Danke für die Hilfestellung, aber ich habe jetzt eine zufrieden stellende Lösung gefunden die ich euch nicht vorenthalten will: Und zwar man kann mit insets arbeiten.

Ich hab nun folgende Methode geschrieben:
-(void)hideKeyboard:(BOOL)value {
    switch (value) {
        case YES:
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationBeginsFromCurrentState:YES];
            [UIView setAnimationDuration:.3];
            tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 0, 0);
            tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
            [UIView commitAnimations];
            break;
        case NO:
            tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 216, 0);
            tableView.contentInset = UIEdgeInsetsMake(0, 0, 216, 0);
            break;
        default:
            break;
    }
}

Ich füge an die TableView praktisch jetzt ein Offset an der von der Tastatur sowieso verdeckt wird, und verschiebe die Scrollbars über die Tastatur drüber.
Die Animationen sind nu Smooth und nichts flackert mehr.
0
bmc desgin21.10.1119:05
Ich frage mich gerade, warum du die tableview in der grösse änderst???

Du brauchst doch eigentlich nur an die stelle springen plus den Versatz der Tastatur....

Falls du beides brauchst, Versuch mal Block Animationen und lass bei Ende erst die Tastatur ausfahren...


Cheers
„Ask your questions...“
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.