2015-09-19 9 views
10

Link to the subclass of UITableViewWie führe ich Aktualisierungen mit UITableView beim Scrollen mit CADisplayLink und UITableViewAutomaticDimension ohne Springen durch?

Warum springt UITableView beim Scrollen? Können Sie mir helfen?

für den, der mir helfen, ich beginnen und preis später ANOTHER Prämie von 100 :-)

Wie einige Änderungen auf UITableView zusammen mit der Einstellung seiner contentOffset auszuführen?

Dies ist, wie ich meine eingerichtet scrollDisplayLink:

scrollDisplayLink = CADisplayLink(target: self, selector: Selector("scrollTable")) 
scrollDisplayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) 
cellForCurrentIndexPath?.hidden = true 

und dann innerhalb von scrollTable ich Dinge tun folgendes:

func scrollTable() { 
    var newOffset = CGPointMake(currentContentOffset.x, currentContentOffset.y + scrollRate * 10) 

    if currentContentSize.height < frame.size.height { 
     newOffset = currentContentOffset 
    } else if newOffset.y > currentContentSize.height - frame.size.height { 
     newOffset.y = currentContentSize.height - frame.size.height 
    } else if newOffset.y < 0 { 
     newOffset = CGPointZero 
    } 

    contentOffset = newOffset 


    if coveredIndexPath != nil && coveredIndexPath! != currentIndexPath! { 

     let verticalPositionInCoveredCell = longPressGestureRecognizer.locationInView(cellForRowAtIndexPath(coveredIndexPath!)).y 

     if direction == .Down && heightForCoveredCell - verticalPositionInCoveredCell <= heightForCurrentCell/2 { 
       print("moved down") 

       beginUpdates() //1 
       moveRowAtIndexPath(currentIndexPath!, toIndexPath: coveredIndexPath!) //2 
       currentIndexPath = coveredIndexPath //3 
       endUpdates() //4 

     } 
    } 
} 

Scrolling ist in Ordnung, es sei denn, Linien 1-4 kommentiert oder deaktiviere ich UITableViewAutomaticDimension. Wenn sie nicht kommentiert werden, springt die Tabelle, wenn sich currentContentOffset während des Scrollens 0 unterscheidet. Warum passiert es so? Ist es ein Problem mit Threads oder etwas anderem?

HINWEIS:

UITableView arbeitet mit UITableViewAutomaticDimension:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

Antwort

0

Beginnen wir mit dem Offensichtlichen beginnen:

UITableView eine Unterklasse von UIScrollView ist und wir einige Eigenschaften, dass verwenden können.

Fast jedes Jahr gibt es eine ausgezeichnete WWDC-Diskussion darüber, wie man UIScrollviews anpassen kann.

Sie schlagen vor, Dinge zu tun, wie Sie nach innen tun

// is called every frame of scrolling and zooming 
override func layoutSubviews() { 
    ... 
    super.layoutSubviews() 
    ... 
} 

, die jeder Frame aufgerufen wird, während der Benutzer Scrollen wird.

Ich habe diesen Ort stark benutzt, um mit currentContentOffset und Größe und Koordinatensystemen beim Scrollen herumzualbern (ich habe UIScrollView und nicht UITableView subclassiert).

Vorteile:

  • Sie Ihre Rückrufe jedes Bild kostenlos erhalten, keine Notwendigkeit CADisplayLink verwenden
  • Sie ändern sich die Dinge TIKE Content genau, wann die UIScrollView es geändert werden erwartet.

this helps

P. S.

Die Ansicht, die in einem UIScrollView gescrollt wird, darf laut meinen Experimenten nicht höher als etwa 8000 Pixel sein.

So Äpfel UITableView eine Strategie zu implementieren, hat die unendliche Scrollen genannt wird und in einer der WWDC Videos über UIScrollViews beschrieben:

kurz:

ein Bruchteil der Tabelle wird einmal gezeichnet und dann scrollte, ohne den Tabelleninhalt neu zu zeichnen. Wenn der Benutzer zu weit scrollt, wird ein anderer Teil der gescrollten Tabelle gezeichnet, und gleichzeitig wird contentOffset durch die UITableView-Implementierung geändert.

Dies ist wahrscheinlich getan, wenn Sie super.layoutSubviews() in Ihrer Implementierung von layoutSubviews() aufrufen.