2015-08-28 48 views
8

Mam wątpliwości: czy istnieje sposób przechwycenia przewijania tableView, aby dodać do niego działanie? Na przykład moje tło prototype cell jest czerwone, dotykając wewnątrz komórki, a jego kolor tła zaczyna być niebieski i przewija kolor czerwony powrotny w kolorze tła tableView. Czy można to zrobić ?!Skąd wiadomo, że tableView zaczął przewijanie

Z góry dziękuję.

+0

Aby wyjaśnić, chcesz wiedzieć, czy przewinął "UITableView"? lub przewija się? –

+0

Muszę wiedzieć, kiedy przewijam, więc mogę dodać trochę akcji! –

Odpowiedz

24

UITableView dziedziczy z UIScrollView i UITableViewDelegate rozciąga UIScrollViewDelegate.

Szczególnie może Cię zainteresować metoda scrollViewDidScroll. Tak więc, w realizacji UITableViewDelegate, dodaj następującą metodę:

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

Rozwiązuję mój problem za pomocą tej metody scrollViewWillBeginDragging, aby zmienić kolor tła komórki, gdy tableView rozpocznie przewijanie, i scrollViewDidEndDragging, aby zmienić kolor, gdy tableView przestanie przewijać. –

+0

@FabioCelli do wykrywania zatrzymania przewijania, lepiej użyj 'scrollViewDidEndDecelerating'. 'scrollViewDidEndDragging' jest wywoływane, gdy użytkownik kończy przeciąganie zawartości, ale po niej nadal może się poruszać. – redent84

+0

Ok, użyję tej metody! Wielkie dzięki!! –

0

W ViewController, który jest ustawiony jako delegat dla tableView, można również ustawić metody delegatów dla scrollView. Będą one wywoływane, gdy przewijane jest tableView, ponieważ zawiera scrollView.

przykład:

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

    } 
} 
-1

cellForRowAtIndexPath będzie wielokrotnie wzywał podczas przewijania tableView, chyba że masz bardzo mało liczbę wierszy.

+1

Funkcja cellForRowAtIndexPath jest wywoływana WYŁĄCZNIE, gdy widok tabeli nie zawiera już komórki. To zależy od tabeli tableView, kiedy trzymać się komórek, więc nie ma żadnej gwarancji, że funkcja cellForRowAtIndexPath zostanie wywołana podczas przewijania. – fishinear

+1

Jestem bardzo pewny mojej odpowiedzi, będzie ona nazywana albo tableView deques komórki lub utworzyć nową. Powinieneś był wypróbować przed zaniedbaniem. –

+0

I wspomniałem również, gdy nie jest to nazywane, tj .: masz bardzo mało wierszy. –

0

Lepiej utrzymywać zmienną wokół np. var isBackgroundColorRed: Bool = true

I kolejna pozycja przewijania y po ustawieniu koloru tła na niebieski. na przykład

var blueBackgroundColorYOffset: CGFloat? 

Po ustawieniu koloru tła na niebieski, ustaw przesunięcie y, na contentView.origin.y.

Następnie w delegata dla tableview (który podklasy UIScrollView)

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 
    } 
} 

warto dodać to do swojego projektu i aktualizować yur pomostowego nagłówek. UIColor-CrossFade

Technika ta zapewni miłe UX zamiast nagłej zmiany tła.

0

CellForRow to sposób na wykrycie przewijania, który daje także indexPath.row z następnej komórki wchodzącej do widoku. Jeśli użytkownik przewinie tak małą odległość, że nowa lub poddana recyklingowi komórka nie zostanie skonfigurowana, przeciąganie nie zostanie wykryte. Jednak nawet z built in methods, np. scrollViewWillBeginDragging, przewijanie na krótkich dystansach nie zostanie wykryte.

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