ios - UIRefreshControl en UICollectionView solo funciona si la colección llena la altura del contenedor
swiperefreshlayout swift (5)
Estoy intentando agregar un UIRefreshControl
a UICollectionView
, pero el problema es que el control de actualización no aparece a menos que la vista de colección llene la altura de su contenedor principal. En otras palabras, a menos que la vista de colección sea lo suficientemente larga como para requerir desplazamiento, no se puede bajar para revelar la vista de control de actualización. Tan pronto como la colección excede la altura de su contenedor principal, se tira hacia abajo y revela la vista de actualización.
He configurado un proyecto rápido de iOS con solo UICollectionView
dentro de la vista principal, con una salida a la vista de colección para poder agregarle el UIRefreshControl
en viewDidLoad
. También hay un prototipo de celda con el identificador de reutilización cCell
Este es todo el código en el controlador, y demuestra bastante bien el problema. En este código, establezco la altura de la celda en 100, que no es suficiente para llenar la pantalla, y por lo tanto, no se puede extraer la vista y no se mostrará el control de actualización. Configúralo en algo más alto para llenar la pantalla, luego funciona. ¿Algunas ideas?
@interface ViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[self.collectionView addSubview:refreshControl];
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 1;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
return [collectionView dequeueReusableCellWithReuseIdentifier:@"cCell" forIndexPath:indexPath];
}
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(self.view.frame.size.width, 100);
}
La respuesta de Larry es rápida:
let refreshControl = UIRefreshControl()
refreshControl.tintColor = UIColor.blueColor()
refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
collectionView.addSubview(refreshControl)
collectionView.alwaysBounceVertical = true
Swift 3:
let refreshControl = UIRefreshControl()
refreshControl.tintColor = .blue
refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
collectionView.addSubview(refreshControl)
collectionView.alwaysBounceVertical = true
Prueba esto:
self.collectionView.alwaysBounceVertical = YES;
Código completo para un UIRefreshControl
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
[refreshControl addTarget:self action:@selector(refershControlAction) forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
self.collectionView.alwaysBounceVertical = YES;
Si su vista de collectionview
tiene un tamaño de contenido lo suficientemente grande como para desplazarse verticalmente, está bien, pero en su caso no lo es.
Debe habilitar la propiedad AlwaysBounceVertical
para que pueda establecer self.collectionView.alwaysBounceVertical = YES;
Yo también estaba enfrentando el mismo problema, no pude usar el UIRefreshControl
hasta que el tamaño del contenido de UICollectionView
fuera lo suficientemente grande como para desplazarse verticalmente.
Establecer la propiedad de bounces
de UICollectionView
resolvió esto
[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];