Рассчитать, в какой строке UITableView остановит прокрутку? - PullRequest
10 голосов
/ 25 мая 2011

Когда в таблице много строк, пользователь может пролистать таблицу вверх / вниз. Это создает анимацию прокрутки, которая, кажется, имеет детерминированную длину в зависимости от скорости / длины жеста пролистывания. Можно ли надежно рассчитать, какие строки в таблице будут видны после остановки прокрутки, если не будет никакого дальнейшего взаимодействия с пользователем?

Ответы [ 4 ]

5 голосов
/ 15 января 2012

В iOS 5.0 и более поздних версиях есть новый API для UIScrollViewDelegate , называемый scrollViewWillEndDragging: withVelocity: targetContentOffset: . С помощью этого нового метода можно рассчитать и даже изменить положение остановки прокрутки, как описано в Видеосеанс 100: Что нового в Cocoa Touch , около девятой минуты.

1 голос
/ 25 мая 2011

UITableView наследуется от UIScrollView, и вы можете сделать это, используя методы UIScrollViewDelegate и свойство табличного представления indexPathsForVisibleRows, чтобы проверить, какие пути индекса ячеек видны в момент остановки прокрутки.

Вы даже можете сохранить начальную позицию, с которой началось замедление, чтобы можно было рассчитать, было ли направление прокрутки вверх или вниз, что позволит вам узнать, является ли ячейка, на которой она остановится, первой или последней извидимые.

int startDeceleratingPosition;

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {

    startDeceleratingPosition = scrollView.contentOffset.y;

}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    BOOL isPositionUp = startDeceleratingPosition < scrollView.contentOffset.y;     

    NSArray *paths = [_myTableview indexPathsForVisibleRows];
    UITableViewCell *cell;
    if(isPositionUp){
        cell = [_myTableview cellForRowAtIndexPath:[paths objectAtIndex:0]];
    } else {
        cell = [_myTableview cellForRowAtIndexPath:[paths lastObject]];
    }

}

Важное замечание о приведенном выше коде состоит в том, что он указывает на табличное представление как переменную _myTableview вместо простого преобразования переменной метода делегата scrollView в UITableView *, хотя это только детали реализации и не должно влиять на логику здесь.

0 голосов
/ 25 мая 2011

Интересный вопрос ..... UITableViewDelegate также соответствует UIScrollViewDelegate: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollViewDelegate_Protocol/Reference/UIScrollViewDelegate.html#//apple_ref/occ/intf/UIScrollViewDelegate

Существует несколько обратных вызовов делегатов, которые вы могли бы использовать, чтобы узнать, когда прокрутка начинает замедляться и заканчивается замедлением.

Возможно, вы могли бы использовать – scrollViewDidEndDecelerating: и в этот момент использовать высоты ячеек и свойство смещения содержимого tableView (подклассы tableView UIScrollView), а затем вычислить ячейки, которые видны после замедления.

0 голосов
/ 25 мая 2011

Я не знаю, как вы могли бы определить, сколько строк будет показано, но вы всегда можете получить, сколько строк было показано.(как только стол перестанет без дальнейших касаний.) Не уверен, что это поможет, но именно так вы бы это сделали

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    // make sure to declare your integer in your .h file and to also synthesize
    //say this is your int "howManyRowsAreShowing"
    howManyRowsAreShowing = indexPath.Row;



    //the rest of the code below is generic table view code for example only
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell...
    NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
    cell.text = cellValue;

    return cell;
    }
...