Как прокрутить UITableView в определенную позицию

#iphone #objective-c #cocoa-touch #uitableview #uiscrollview

#iPhone #objective-c #cocoa-touch #uitableview #uiscrollview

Вопрос:

Как я могу прокрутить ячейку таблицы в определенную позицию? У меня есть таблица, в которой показано 3 строки (в зависимости от высоты). я хочу, чтобы, если я нажму на 1-ю строку, чем в соответствии с высотой таблицы, 1-я строка должна прокручиваться и получать новую позицию (по центру) и то же самое для других строк. Я попробовал contenOffset, но не сработало..

ОТРЕДАКТИРОВАНО :

Короче говоря, что-то вроде средства выбора данных, когда мы выбираем любую строку в средстве выбора, строка прокручивается к центру.

Спасибо..

Комментарии:

1. Если я прокручиваю вниз до десятого элемента в списке, и на моем дисплее отображаются элементы 10, 11, 12. Вы хотите сказать, что если я щелкну по первой строке (которая является элементом 10), чтобы расположить элемент 10 по центру на экране, эффективно отображающем элементы 9, 10, 11?

2. да … похоже на средство выбора данных…

Ответ №1:

это должно работать, используя - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated используя это таким образом:

 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[yourTableView scrollToRowAtIndexPath:indexPath 
                     atScrollPosition:UITableViewScrollPositionTop 
                             animated:YES];
  

atScrollPosition может принимать любое из этих значений:

 typedef enum {
UITableViewScrollPositionNone,
UITableViewScrollPositionTop,
UITableViewScrollPositionMiddle,
UITableViewScrollPositionBottom
} UITableViewScrollPosition;
  

Комментарии:

1. будет ли этот метод вызываться при выборе строки?

2. Нет, он выберет строку при ее вызове. Он не будет вызываться при выборе строки. Есть небольшая разница.

3. Я хочу, чтобы таблица прокручивалась при выборе строки… как я могу установить contentOffset ячейки в соответствии с высотой текущей таблицы?

4. Когда вы выбираете строку, вызывается метод - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath in UITableViewDelegate , поэтому поместите вызов scrollToRowAtIndexPath в этот метод. Я настоятельно рекомендую вам прочитать Table View Programming Guide for iOS , а также UITableView ссылку и UITableViewDelegate reference, вы найдете их очень полезными, и, в конце концов, именно для этого и предназначена документация

5. Это должен быть выбранный ответ.

Ответ №2:

Версия Swift 4.2:

 let indexPath:IndexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .none, animated: true)
  

Перечисление: Это доступные позиции прокрутки TableView — здесь для справки. Вам не нужно включать этот раздел в свой код.

 public enum UITableViewScrollPosition : Int {

case None
case Top
case Middle
case Bottom
}
  

Сделал выбор:

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let theCell:UITableViewCell? = tableView.cellForRowAtIndexPath(indexPath)

    if let theCell = theCell {
        var tableViewCenter:CGPoint = tableView.contentOffset
        tableViewCenter.y  = tableView.frame.size.height/2

        tableView.contentOffset = CGPointMake(0, theCell.center.y-65)
        tableView.reloadData()
    }

}
  

Ответ №3:

 [tableview scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
  

Это переведет ваш tableview в первую строку.

Комментарии:

1. @Parveen Спасибо, это мне очень помогает

2. Ответ для разработчиков xamarin: tblRecord. scrollRectToVisible(CoreGraphics. CGRect.FromLTRB(0, 0, 1, 1), верно);

Ответ №4:

наконец-то я нашел… это будет хорошо работать, когда в таблице отображаются только 3 строки … если строк больше, изменения должны быть соответствующими…

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{    
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section
{  
    return 30;
}

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {         
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault    
                                       reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell.
    cell.textLabel.text =[NSString stringWithFormat:@"Hello roe no. %d",[indexPath row]];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * theCell = (UITableViewCell *)[tableView     
                                              cellForRowAtIndexPath:indexPath];

    CGPoint tableViewCenter = [tableView contentOffset];
    tableViewCenter.y  = myTable.frame.size.height/2;

    [tableView setContentOffset:CGPointMake(0,theCell.center.y-65) animated:YES];
    [tableView reloadData]; 
 }
  

Комментарии:

1. Просто комментарий — жесткое кодирование значений в коде — плохая практика. Здесь я вижу, что вы поставили [TableView setContentOffset:CGPointMake(0, ячейка.center.y-65) анимированный: ДА]; — значение -65 неверно. Рассмотрите возможность использования кода для 65, такого как, например, cell.frame.size.height.

2. @Rocotilos да, я согласен. Но я четко упомянул, что «это будет хорошо работать, когда в таблице отображаются только 3 строки … если строк больше, изменения должны быть соответствующими… » Это был просто пример кода. Также я использовал эту таблицу в качестве UIPicker.

3. Это не работает, кроме того, есть решение получше этого.

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

Ответ №5:

Использование [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:YES]; Прокручивает приемник до тех пор, пока строка, идентифицируемая по пути индекса, не окажется в определенном месте на экране.

И

 scrollToNearestSelectedRowAtScrollPosition:animated:
  

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

Комментарии:

1. и как я могу рассчитать высоту таблицы? означает, должен ли я вычислять высоту таблицы со всеми строками или только с видимыми строками?

2. или, скажем, как я могу установить contentOffset ячейки в соответствии с высотой текущей таблицы? нужно ли мне вычислять высоту таблицы со всеми строками или только с видимыми строками?

3. если это стандартная ячейка таблицы, то ее высота будет равна 44.

Ответ №6:

Стоит отметить, что если вы используете setContentOffset подход, это может привести к небольшому скачку вашего табличного представления / представления коллекции. Я бы, честно говоря, попытался сделать это другим способом. Рекомендуется использовать методы делегирования просмотра прокрутки, которые вам предоставляются бесплатно.

Ответ №7:

Просто одна строка кода:

 self.tblViewMessages.scrollToRow(at: IndexPath.init(row: arrayChat.count-1, section: 0), at: .bottom, animated: isAnimeted)
  

Ответ №8:

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

  challengeInfoTableView.scrollRectToVisible(challengeInfoCell.challengeDescriptionTextView!.frame, animated: false)
  

В этом случае вы можете напрямую прокрутить до нужного текстового поля, вида текста, метки и т.д.