Ich möchte Pull-down-to-Refresh in einem UICollectionViewController
unter iOS 6 implementieren. Dies war mit einem UITableViewController
einfach zu erreichen, wie folgt:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Das Obige implementiert eine nette Liquid-Drop-Animation als Teil eines nativen Widgets.
Da UICollectionViewController
ein "weiterentwickelter" UITableViewController
ist, würde man etwas von einer Parität von Funktionen erwarten, aber ich kann nirgendwo einen Verweis auf eine eingebaute Möglichkeit finden, dies zu implementieren.
UIRefreshControl
irgendwie mit UICollectionViewController
verwendet werden, obwohl der Header und die Dokumentation beide besagen, dass es für eine Tabellenansicht gedacht ist?Die Antworten auf beide (1) und (2) sind ja.
Fügen Sie einfach eine UIRefreshControl
-Instanz als Unteransicht von .collectionView
Hinzu, und es funktioniert einfach.
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
Das ist es! Ich wünschte, dies wäre irgendwo in der Dokumentation erwähnt worden, obwohl manchmal ein einfaches Experiment den Trick macht.
BEARBEITEN: Diese Lösung funktioniert nicht, wenn die Sammlung nicht groß genug ist, um eine aktive Bildlaufleiste zu haben. Wenn Sie diese Anweisung hinzufügen,
self.collectionView.alwaysBounceVertical = YES;
dann funktioniert alles einwandfrei. Dieser Fix stammt aus einem anderen Beitrag zum selben Thema (auf den in einem Kommentar in der anderen veröffentlichten Antwort verwiesen wird).
Ich suchte nach der gleichen Lösung, aber in Swift. Basierend auf der obigen Antwort habe ich Folgendes getan:
let refreshCtrl = UIRefreshControl()
...
refreshCtrl.addTarget(self, action: "startRefresh", forControlEvents: .ValueChanged)
collectionView?.addSubview(refreshCtrl)
Nicht zu vergessen:
refreshCtrl.endRefreshing()
Ich habe Storyboard verwendet und self.collectionView.alwaysBounceVertical = YES;
funktioniert nicht. Auswahl von Bounces
und Bounces Vertically
erledigt den Job für mich.
Die Eigenschaft refreshControl
wurde ab iOS 10 zu UIScrollView
hinzugefügt, sodass Sie das Aktualisierungssteuerelement direkt in Sammlungsansichten festlegen können.
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;
die Antwort von mjh ist richtig.
Ich bin auf das Problem gestoßen, wo, wenn das das collectionView.contentSize
war nicht größer als der collectionView.frame.size
, Sie können das collectionView
nicht zum Scrollen bringen. Sie können die Eigenschaft contentSize
auch nicht festlegen (zumindest konnte ich das nicht).
Wenn es nicht scrollen kann, können Sie es nicht zum Aktualisieren ziehen.
Meine Lösung bestand darin, UICollectionViewFlowLayout
in Unterklassen zu unterteilen und die Methode zu überschreiben:
- (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);
}