webentwicklung-frage-antwort-db.com.de

Pull-to-Refresh in UICollectionViewController

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.

  1. Gibt es eine einfache Möglichkeit, die ich übersehen habe?
  2. Kann UIRefreshControl irgendwie mit UICollectionViewController verwendet werden, obwohl der Header und die Dokumentation beide besagen, dass es für eine Tabellenansicht gedacht ist?
73
mjh

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).

215
mjh

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()
18
djbp

Ich habe Storyboard verwendet und self.collectionView.alwaysBounceVertical = YES; funktioniert nicht. Auswahl von Bounces und Bounces Vertically erledigt den Job für mich.

enter image description here

7
harinsa

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;    
4
Berry Blue

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);
}
2
Padin215