2015-08-28 11 views
8

Ich habe einen Zweifel: gibt es eine Möglichkeit, ein tableView Scrollen abzufangen, um es eine Aktion hinzuzufügen? Zum Beispiel ist mein prototype cell Hintergrund rot, in einer Zelle berührend, beginnt seine Hintergrundfarbe blau und scrollt die tableView Hintergrundfarbe zurück rot. Ist es möglich, dies zu tun ?!Wie zu wissen, dass TableView begann zu scrollen

Vielen Dank im Voraus.

+0

Um zu verdeutlichen, möchten Sie wissen, ob ein 'UITableView' gescrollt hat? oder scrollt? –

+0

Ich muss wissen, wann Scrollen ist, also kann ich etwas Action hinzufügen! –

Antwort

24

UITableView erbt von UIScrollView und UITableViewDelegateUIScrollViewDelegate erstreckt.

Besonders interessiert Sie vielleicht scrollViewDidScroll Methode. Also, in Ihrer UITableViewDelegate Implementierung, fügen Sie die folgende Methode:

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    NSLog("Table view scroll detected at offset: %f", scrollView.contentOffset.y) 
} 
+0

Ich löse mein Problem mit dieser Methode scrollViewWillBeginDragging, um die Hintergrundfarbe der Zelle zu ändern, wenn TableView mit dem Scrollen beginnt, und scrollViewDidEndDragging, um die Farbe zu ändern, wenn das TableView den Bildlauf stoppt. –

+0

@FabioCelli um zu erkennen, wann der Bildlauf stoppt, verwenden Sie besser 'scrollViewDidEndDecelerating'. 'scrollViewDidEndDragging' wird aufgerufen, wenn der Benutzer das Ziehen des Inhalts beendet hat, der Bildlauf jedoch möglicherweise danach verschoben wird. – redent84

+0

Ok Ich werde diese Methode verwenden! Danke vielmals!! –

0

In der ViewController, die als Delegat für die TableView festgelegt ist, können Sie auch die Delegate-Methoden einer ScrollView festlegen. Diese werden aufgerufen, wenn die TableView gescrollt wird, da sie eine scrollView enthält.

z.B:

extension ViewController: UIScrollViewDelegate { 
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 

    } 
} 
-1

cellForRowAtIndexPath wird wiederholt aufgerufen werden, wenn Sie die Tableview scrollen, wenn Sie sehr wenige Anzahl von Zeilen haben.

+1

cellForRowAtIndexPath wird NUR aufgerufen, wenn die Tabellenansicht die Zelle noch nicht enthält. Es liegt im Ermessen der tableView, wann die Zellen festgehalten werden sollen. Es gibt also keine Garantie, dass cellForRowAtIndexPath während des Scrollens aufgerufen wird. – fishinear

+1

Ich bin mir meiner Antwort sehr sicher, es wird entweder tableView genannt oder die Zelle neu erstellt. Sie sollten es vor dem Abstimmen versucht haben. –

+0

Und ich habe auch erwähnt, wenn es nicht heißt, dh: Sie haben eine sehr geringe Anzahl von Zeilen. –

0

Sie sind besser darin, eine Variable um z. var isBackgroundColorRed: Bool = true

Und ein anderes für Bildlauf y Position, wenn Sie die Hintergrundfarbe auf blau einstellen. z.B.

var blueBackgroundColorYOffset: CGFloat? 

Wenn Sie die Hintergrundfarbe blau eingestellt, stellen Sie die y-Offset auf die contentView.origin.y.

Dann in den Delegaten für die Tableview

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if !isBackgroundColorRed { 
     // apply some color blending between blue and red based on 
     // the amount of movement on y axis, until you reach the limit 
     // its also important to take the absolute value of the blueBackgroundColorYOffset 
     // and the offset here in scrollViewDidScroll to cover up or down movements 
     // say 1 cell's height, then set your isBackgroundColorRed to true 
    } 
} 

Versuchen, diese zu Ihrem Projekt (die UIScrollView Unterklassen) und yur Überbrückung Header aktualisieren. UIColor-CrossFade

Diese Technik wird Ihnen eine nette UX anstelle einer plötzlichen Hintergrundänderung geben.

0

CellForRow ist eine Möglichkeit, Scrollen zu erkennen, die Ihnen auch die indexPath.row der nächsten Zelle in die Ansicht eingibt. Wenn der Benutzer eine so kurze Strecke scrollt, dass eine neue oder recycelte Zelle nicht konfiguriert ist, wird das Ziehen nicht erkannt. Aber auch mit built in methods, wie scrollViewWillBeginDragging, wird das Scrollen mit kurzer Entfernung nicht erkannt.

var lastCellForRowAtIndex = 0 
var isScrollingUp = false 
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    isScrollingUp = indexPath.row > lastCellForRowAtIndex 
    lastCellForRowAtIndex = indexPath.row 
}