refreshcontrol ios6 uikit pull-to-refresh

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.

  1. ¿Hay una manera simple de hacer esto que estoy pasando por alto?
  2. ¿ UIRefreshControl puede usar UIRefreshControl alguna manera con UICollectionViewController 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).