Можно ли добавить UIRefreshControl
в нижней части UITableView
?
Я бы использовал его для загрузки большего количества данных.
Пожалуйста, предложите?
UIRefreshControl в нижней части UITableView iOS6?
Ответ 1
Я считаю, что не будет никакого простого решения этой проблемы. Может быть, кто-то может написать отдельную библиотеку для реализации этого поведения, и это вызовет больше осложнений после того, как вы будете кэшировать данные в виде таблицы.
Но давайте разберем проблему и это поможет вам в достижении того, чего вы хотите. Я использовал следующий код, чтобы добавить больше строк в приложение:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
if (endScrolling >= scrollView.contentSize.height)
{
NSLog(@"Scroll End Called");
[self fetchMoreEntries];
}
}
Или вы можете сделать что-то подобное:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
{
if (!self.isMoreData)
{
self.MoreData = YES;
// call some method that handles more rows
}
}
}
Вы, наверное, видели такие методы во многих вопросах, как я описал выше, и, конечно же, не то, о чем вы просили. Но то, что вы можете сделать, заключается в том, что в то время как приведенный выше код загружает больше данных, вы можете добавить subview и показать несколько изображений, похожих на то, что предлагает UIRefreshControl. Добавьте изображения в подвью, чтобы они отображались как прогресс, пока не будет выполнен предыдущий код. Это помогает.
Кстати, я предлагаю вам не делать этого, поскольку это просто тратит время на то, чтобы сделать что-то настолько маленькое, если вы просто не делаете это для учебных целей.
Ответ 2
Вы можете использовать UIView для настройки вашего refreshControl внизу. Создайте UIView и добавьте его в UITableView как footerView.
UIView* footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
[footerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"refreshImage.png"]]];
tableView.tableFooterView = footerView;
Скрыть: tableView.tableFooterView.hidden = YES;
Внедрить делегат UIScrollView -
(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
{
tableView.tableFooterView.hidden = NO;
// call method to add data to tableView
}
}
перед добавлением данных в таблицуView сохранить текущее смещение на CGPoint offset = tableView.contentOffset;
вызвать reloadData, затем установить ранее сохраненное смещение обратно в tableView [tableView setContentOffset:offset animated:NO];
Чтобы вы могли почувствовать новые данные, добавленные снизу.
Ответ 3
Я недавно застал ту же проблему и напишу категорию для класса UIScrollView. Здесь CCBottomRefreshControl.
Ответ 4
На самом деле свободная среда Sensible TableView действительно предоставляет эту функциональность из коробки. Вы указываете номер партии и автоматически загружаете данные, отображая последнюю ячейку как ячейку "загрузить больше". Когда вы нажмете эту ячейку, она автоматически загрузит следующую партию и так далее. Стоит взглянуть на.
Ответ 5
Следующий ответ приведен в Xcode 8 и Swift 3.
сначала объявить
var spinner = UIActivityIndicatorView()
чем в viewDidLoad
, напишите следующий код:
spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
spinner.stopAnimating()
spinner.hidesWhenStopped = true
spinner.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 60)
tableView.tableFooterView = spinner
теперь наконец override
метод делегата scrollViewDidEndDragging
со следующим:
override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let offset = scrollView.contentOffset
let bounds = scrollView.bounds
let size = scrollView.contentSize
let inset = scrollView.contentInset
let y = offset.y + bounds.size.height - inset.bottom
let h = size.height
let reloadDistance = CGFloat(30.0)
if y > h + reloadDistance {
print("fetch more data")
spinner.startAnimating()
}
}
Ответ 6
Для UITableView я предлагаю следующий подход:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// if this is the last row that we have in local data
// and we didn't reach the total count of rows from the server side
if (count == indexPath.row+1 && count < total)
{
// .. fetch more rows and reload table when data comes
}
}
Я не использовал методы просмотра прокрутки намеренно, потому что просмотр прокрутки медленный. Происходит прокрутка прокрутки, мы запрашиваем больше данных, обновляем больше строк, а прокрутка пока еще не завершена с помощью прокрутки, она все еще замедляется и вызывает проблемы с получением дополнительных данных.
Ответ 7
Используйте CCBottomRefreshControl в cocoapods,
Как это для языковой цели. Вы можете добавить файл pod в ваш проект Swift, а затем запустить его, я сделал это, никаких проблем для меня не возникает
Надеюсь, поможет.
Ответ 8
Эта библиотека Swift добавляет тягу, чтобы обновить до нижней части UITableview
.
https://github.com/marwendoukh/PullUpToRefresh-iOS
Я надеюсь, что это поможет вам.