ios6 - refreshcontrol - swiperefreshlayout swift
Pull-to-refresh en UICollectionViewController (5)
Estaba buscando la misma solución, pero en Swift. En base a la respuesta anterior, he hecho lo siguiente:
let refreshCtrl = UIRefreshControl()
...
refreshCtrl.addTarget(self, action: "startRefresh", forControlEvents: .ValueChanged)
collectionView?.addSubview(refreshCtrl)
Sin olvidar:
refreshCtrl.endRefreshing()
Quiero implementar pull-down-to-refresh en un UICollectionViewController
bajo iOS 6. Esto fue fácil de lograr con un UITableViewController
, así:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Lo anterior implementa una bonita animación de gota líquida como parte de un widget nativo.
Como UICollectionViewController
es un UICollectionViewController
"más evolucionado", uno esperaría algo de una paridad de características, pero no puedo encontrar una referencia en ninguna parte a una forma incorporada para implementar esto.
- ¿Hay una manera simple de hacer esto que estoy pasando por alto?
- ¿
UIRefreshControl
puede usarUIRefreshControl
alguna manera conUICollectionViewController
pesar de que el encabezado y los documentos indican que se debe usar con una vista de tabla?
Estaba usando Storyboard y estableciendo self.collectionView.alwaysBounceVertical = YES;
no funcionó. Seleccionar los Bounces
y los Bounces Vertically
hace el trabajo por mí.
La propiedad refreshControl
ahora se ha agregado a UIScrollView
partir de iOS 10 para que pueda establecer el control de actualización directamente en las vistas de colección.
https://developer.apple.com/reference/uikit/uiscrollview/2127691-refreshcontrol
UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged];
self.collectionView.refreshControl = refreshControl;
La respuesta de mjh es correcta.
Me encontré con el problema en el que si el collectionView.contentSize
no era más grande que el collectionView.frame.size
, no se puede obtener el collectionView
para desplazarse. No puede establecer la propiedad contentSize
tampoco (al menos no pude).
Si no puede desplazarse, no le permitirá hacer la extracción para actualizar.
Mi solución fue subclase UICollectionViewFlowLayout
y sobre el método:
- (CGSize)collectionViewContentSize
{
CGFloat height = [super collectionViewContentSize].height;
// Always returns a contentSize larger then frame so it can scroll and UIRefreshControl will work
if (height < self.collectionView.bounds.size.height) {
height = self.collectionView.bounds.size.height + 1;
}
return CGSizeMake([super collectionViewContentSize].width, height);
}
Las respuestas a ambos (1) y (2) son sí.
Simplemente agregue una instancia de UIRefreshControl
como una subvista de .collectionView
y simplemente funciona.
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
¡Eso es! Desearía que esto hubiera sido mencionado en la documentación en alguna parte, aunque a veces un simple experimento es el truco.
EDITAR: esta solución no funcionará si la colección no es lo suficientemente grande como para tener una barra de desplazamiento activa. Si agrega esta declaración,
self.collectionView.alwaysBounceVertical = YES;
entonces todo funciona a la perfección. Esta solución se tomó de otra publicación sobre el mismo tema (a la que se hace referencia en un comentario en la otra respuesta publicada).