Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
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
4D6163
21.10.11
15: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
Hilfreich?
0
Kommentare
ExMacRabbitPro
21.10.11
15:45
Was meinst Du denn mit "Content in der TableView bewegt"? Was passiert da genau? Was bewegt sich da? Zeichnest Du etwas selbst?
Hilfreich?
0
4D6163
21.10.11
16: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.
Hilfreich?
0
ExMacRabbitPro
21.10.11
16: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.
Hilfreich?
0
4D6163
21.10.11
17: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.
Hilfreich?
0
ExMacRabbitPro
21.10.11
18: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 ?
Hilfreich?
0
4D6163
21.10.11
18: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.
Hilfreich?
0
bmc desgin
21.10.11
19: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...“
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.
M4 Mac mini im Effizienztest: Hohe Ersparnis im...
Apple gewährt Einblick in Audio- und Video-Test...
Apple Intelligence: Weiterhin Nonsens-Zusammenf...
Mac mini: Kontroverse Position des Einschalters...
Apple Silicon M4: Die versteckte Innovation der...
iPad Pro M4: Hinweise auf geringere Nachfrage
Interview: Größte private Mac-Sammlung
Apple kauft Pixelmator