2016-02-07 12 views
8

Mam widok tabeli poprawnie skonfigurowany mieć dynamiczne wysokość wierszy na podstawie przewodnika Ray Wenderlich znalazł here:UITableViewController: Przewijanie do dołu z dynamicznym wysokość wiersza rozpoczyna animację w niewłaściwym położeniu

skonfigurować ograniczenia mają wyraźny linia więzów od góry do dołu komórki. Ustanowiłem także dostosowywanie zawartości i priorytety dotyczące kompresji zawartości oraz szacowaną wysokość wiersza.

Jest to kod używać do konfiguracji widoku tabeli:

func configureTableView() { 
    // its called on viewDidLoad() 
    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 100.0 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    configureTableView() 

    for i in 1...20 { 
     messages.append([ 
      "title": "foo \(i)", 
      "message": "bla \(i)\nbla\nbla" 
     ]) 
    } 

    // this is because the actual row heights are not available until the next layout cycle or something like that 
    dispatch_async(dispatch_get_main_queue(), {self.scrollToBottom(false)}) 
} 

func scrollToBottom(animated:Bool) { 
    let indexPath = NSIndexPath(forRow: self.messages.count-1, inSection: 0) 

    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: animated) 
} 

I tak dodaję nowe wiersze:

@IBAction func addMore(sender:UIBarButtonItem) { 
    let message = [ 
     "title": "haiooo", 
     "message": "silver"] 

    messages.append(message) 

    let indexPath = NSIndexPath(forRow: messages.count-1, inSection: 0) 

    tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Bottom) 

    scrollToBottom(true) 
} 

Konfiguracja z domyślnymi rzędach są w porządku. Dodaje wiersze i zwoje do spodu zgodnie z oczekiwaniami.

Ale po dodaniu nowych wierszy przewijanie wydaje się zaczynać od ostatniej komórki. W miarę dodawania kolejnych komórek wydaje się, że przesunięcie wzrasta.

Oto gif pokazujący to dzieje: Imgur

to z pewnością związane z animacją przewijania (nie animacji insertRow), ponieważ przewija poprawnie, gdy animacja jest wyłączony.

Zmiana estimatedRowHeight powoduje zmianę przesunięcia przewijania, ale nie udało mi się znaleźć wartości, która je naprawiła.

Próbowałem również opóźniać przewijanie, używając dispatch_async, ale nic to nie zmieniło.

Czy macie jakieś pomysły?

+0

Z filmu nie mogę powiedzieć, co jest nie tak. I nie rozumiem, co znaczy "... przewijanie zaczyna się nad ostatnią komórką". Czy mógłbyś wyjaśnić? Pomocne może być również udostępnienie przykładowego projektu z problemem. –

+0

Dave, zauważ, jak komórki 17 i 18 wyświetlają się u góry na ekranie, gdy zaczyna się przewijanie, kiedy znajdują się poza widocznym obszarem widoku tabeli. Wygląda na to, że ekran przesuwa się w górę przed rozpoczęciem animacji. Kod źródłowy można znaleźć tutaj: https://github.com/marcio0/ios-playground/tree/master/scrolltest –

+0

OK, widzę to teraz w filmie (jeśli go pobiorę i przejdę w tryb klatka po klatce) -rama). Ale nie widzę tego w przykładowym projekcie. Próbowałem różnych modeli telefonów (ale wszystkich 9.2) i próbowałem spowalniać animacje, ale nigdy nie widziałem problemu, który masz. –

Odpowiedz

13

Wow, to było zabawne wyzwanie. Dziękujemy za opublikowanie projektu testowego.

Wygląda na to, że po dodaniu nowego wiersza jest coś, co nie jest zgodne z widokiem tabeli, do którego jest przewijany. Wydaje mi się, że jestem błędem w UIKit. Aby obejść ten problem, dodałem kod do "zresetowania" widoku tabeli przed zastosowaniem animacji.

Oto, co skończyło się z:

@IBAction func addMore(sender:UIBarButtonItem) { 
    let message = [ 
     "title": "haiooo", 
     "message": "silver"] 
    messages.append(message) 

    tableView.reloadData() 

    // To get the animation working as expected, we need to 'reset' the table 
    // view's current offset. Otherwise it gets confused when it starts the animation. 
    let oldLastCellIndexPath = NSIndexPath(forRow: messages.count-2, inSection: 0) 
    self.tableView.scrollToRowAtIndexPath(oldLastCellIndexPath, atScrollPosition: .Bottom, animated: false) 

    // Animate on the next pass through the runloop. 
    dispatch_async(dispatch_get_main_queue(), { 
     self.scrollToBottom(true) 
    }) 
} 

nie mogę zmusić go do pracy z insertRowsAtIndexPaths(_:withRowAnimation:), ale reloadData() działało. Następnie musisz ponownie ustawić to samo opóźnienie przed animacją do nowego ostatniego wiersza.

Powiązane problemy