2015-08-28 5 views
8

У меня есть сомнение: есть ли способ перехватить прокрутку tableView, чтобы добавить его в действие? Например, мой prototype cell фон красный, касаясь внутри ячейки его цвет фона начинает синий и прокручивает tableView цвет фона возвращается красный. Можно ли это сделать ?!Как узнать, что tableView начал прокрутку

Заранее спасибо.

+0

Чтобы уточнить, вы хотите узнать, прокручивается ли 'UITableView'? или прокрутка? –

+0

Мне нужно знать, когда прокручивается, поэтому я могу добавить какое-то действие! –

ответ

24

UITableView наследует от UIScrollView и UITableViewDelegate простирается UIScrollViewDelegate.

В частности, вас может заинтересовать scrollViewDidScroll метод. Таким образом, в вашем UITableViewDelegate реализации, добавьте следующий метод:

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

Я решаю свою проблему, используя этот два метода scrollViewWillBeginDragging для изменения цвета фона ячейки при прокрутке таблицы TableView и scrollViewDidEndDragging для изменения цвета, когда tableView останавливает прокрутку. –

+0

@FabioCelli, чтобы обнаружить, когда прокрутка останавливается, лучше использовать 'scrollViewDidEndDecelerating'. 'scrollViewDidEndDragging' вызывается, когда пользователь заканчивает перетаскивание содержимого, но после этого свиток еще может двигаться. – redent84

+0

Хорошо, я буду использовать этот метод! Большое спасибо!! –

0

В ViewController, который задан как делегат для tableView, вы также можете установить методы делегата scrollView. Они будут вызываться, когда таблицаView прокручивается, поскольку она содержит scrollView.

например:

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

    } 
} 
-1

cellForRowAtIndexPath будет повторно вызывается, когда вы прокрутке Tableview, если у вас есть очень небольшое число строк.

+1

cellForRowAtIndexPath ТОЛЬКО вызывается, когда tableview уже не имеет ячейки. Это зависит от усмотрения tableView, когда нужно удерживать ячейки, поэтому нет никакой гарантии, что cellForRowAtIndexPath будет вызываться во время прокрутки. – fishinear

+1

Я очень уверен в своем ответе, он будет называться либо tableView, либо deques cell, либо создаст новый. Вы должны были попытаться перед тем, как засунуть. –

+0

И я также упомянул, когда он не называется, т. Е. У вас очень мало строк. –

0

Вы лучше держите переменную вокруг, например. var isBackgroundColorRed: Bool = true

И еще один для прокрутки позиции y, когда вы задаете цвет фона синим. например

var blueBackgroundColorYOffset: CGFloat? 

Когда вы установите цвет фона синий, установите у смещение, к contentView.origin.y.

Тогда в делегате для Tableview (который подклассы 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 
    } 
} 

Попробуйте добавить это в свой проект и обновить Юр мостовую заголовка. UIColor-CrossFade

Этот метод даст вам хороший UX, а не внезапное изменение фона.

0

CellForRow - это способ обнаружения прокрутки, который также дает вам indexPath.row следующей ячейки, входящей в представление. Если пользователь прокручивает такое короткое расстояние, что новая или переработанная ячейка даже не настроена, перетаскивание не будет обнаружено. Однако даже с built in methods, например scrollViewWillBeginDragging, прокрутка на короткие расстояния не будет обнаружена.

var lastCellForRowAtIndex = 0 
var isScrollingUp = false 
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    isScrollingUp = indexPath.row > lastCellForRowAtIndex 
    lastCellForRowAtIndex = indexPath.row 
} 
Смежные вопросы