UIRefreshControl in UICollectionView funktioniert nur, wenn die Sammlung die Höhe des Containers ausfüllt

142

Ich versuche, a UIRefreshControlzu einem hinzuzufügen UICollectionView, aber das Problem ist, dass das Aktualisierungssteuerelement nur angezeigt wird, wenn die Sammlungsansicht die Höhe des übergeordneten Containers ausfüllt. Mit anderen Worten, es sei denn, die Sammlungsansicht ist lang genug, um einen Bildlauf zu erfordern, kann nicht nach unten gezogen werden, um die Aktualisierungssteuerungsansicht anzuzeigen. Sobald die Sammlung die Höhe ihres übergeordneten Containers überschreitet, wird sie heruntergezogen und zeigt die Aktualisierungsansicht an.

Ich habe ein schnelles iOS - Projekt mit nur einem aufgerichteten UICollectionViewso innerhalb der Hauptansicht mit einem Auslass die Sammlung Ansicht , dass ich das hinzufügen kann , UIRefreshControlum es in viewDidLoad. Es gibt auch eine Prototypzelle mit der WiederverwendungskennungcCell

Dies ist der gesamte Code im Controller und zeigt das Problem ziemlich gut. In diesem Code habe ich die Höhe der Zelle auf 100 gesetzt, was nicht ausreicht, um die Anzeige zu füllen. Daher kann die Ansicht nicht gezogen werden und das Aktualisierungssteuerelement wird nicht angezeigt. Stellen Sie einen höheren Wert ein, um die Anzeige zu füllen, dann funktioniert es. Irgendwelche Ideen?

@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);
}
Merott
quelle
siehe dies für iOS 10 stackoverflow.com/questions/19483511/…
Anish Parajuli 웃
1
Verwenden SiealwaysBounceVertical
onmyway133

Antworten:

395

Versuche dies:

self.collectionView.alwaysBounceVertical = YES;

Vollständiger Code für a 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;
Larry
quelle
1
Genial, diese Zeile ist die genaue Lösung, der Rest des Codes spielt keine Rolle. Kein schlechter Start für Sie bei StackOverflow! Prost!
Merott
7
Ja kein Problem. Es ist so offensichtlich, dass ich ein Neuling bin, oder? Wie auch immer, es stellt sich heraus, dass ich in der gleichen Situation feststeckte, als ich Ihren Beitrag sah. Als ich die Lösung gefunden habe, sollte ich sie auf jeden Fall teilen. Prost
Larry
6
Nun, Juan, du hast wahrscheinlich schon die Antwort auf deine Frage gefunden. Um das Aktualisierungssteuerelement nach einer Aktualisierung wieder in den normalen Zustand zu versetzen, müssen Sie aufrufen [refreshControl endRefreshing].
Merott
2
Dies wird leider nicht mehr unterstützt. UIRefreshControl kann nur mit UITableViewController verwendet werden und wird jetzt strikt durchgesetzt.
Luke Van Am
3
In iOS 10 hat UIScrollView(eine Übersicht von UICollectionView) eine refreshControlEigenschaft jetzt developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter
29

Attribute / Bildlaufansicht / Vertikal springen in Storyboard / Xib

Geben Sie hier die Bildbeschreibung ein

Avdyushin
quelle
23

Larrys Antwort in Kürze:

    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
Andrew Schreiber
quelle
Const gibt einen Fehler einer undefinierten Variablen aus. Wenn jemand auf die gleiche Situation stößt, ersetzen Sie sie einfach durch eine UIColor.whiteColor()beliebige Farbe.
Faisal
1
Auch für Swift 2.2 verwendenaction: #selector(self.refresh)
Faisal
1

Wenn Ihr collectionviewInhalt groß genug ist, um vertikal zu scrollen, ist dies in Ordnung, in Ihrem Fall jedoch nicht.

Sie müssen die Eigenschaft aktivieren AlwaysBounceVertical, damit Sie sie festlegen könnenself.collectionView.alwaysBounceVertical = YES;

Nghia Luong
quelle
0

Auch ich hatte das gleiche Problem. Ich konnte das UIRefreshControlerst verwenden, wenn der UICollectionViewInhalt des Inhalts groß genug war, um vertikal zu scrollen.

Das Einstellen der bouncesEigenschaft von UICollectionViewlöste dies

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];
Saif
quelle
0

Ich rufe beginRefreshing()gleich danach an viewDidLoad(), aber auf einigen Bildschirmen funktioniert es nicht. Und nur collectionView.layoutIfNeeded()in viewDidLoad()hat mir geholfen

Nikolai Ischuk
quelle
0

Sie müssen den API-Aufruf einchecken, wenn sich die Sammlungsansicht im Aktualisierungsstatus befindet, und dann die Aktualisierung beenden, um die Aktualisierungssteuerung zu schließen.

private let refreshControl = UIRefreshControl()
 refreshControl.tintColor = .white
 refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)
 collectionView.addSubview(refreshControl)
 @objc func refreshData() {
    // API Call
 }
// Disable refresh control if already refreshing 
if refreshControl.isRefreshing {
    refreshControl.endRefreshing()
}
Asad Jamil
quelle
Zu beachten ist, dass Bounce on Scroll in meiner Storyboard-Datei aktiviert ist.
Asad Jamil