UIRefreshControl pada UICollectionView hanya berfungsi jika koleksi mengisi ketinggian wadah


142

Saya mencoba menambahkan a UIRefreshControlke UICollectionView, tetapi masalahnya adalah bahwa kontrol penyegaran tidak muncul kecuali tampilan koleksi mengisi ketinggian wadah induknya. Dengan kata lain, kecuali tampilan koleksi cukup panjang untuk memerlukan pengguliran, itu tidak dapat ditarik ke bawah untuk mengungkapkan tampilan kontrol penyegaran. Segera setelah koleksi melebihi ketinggian wadah induknya, itu ditarik ke bawah dan mengungkapkan tampilan penyegaran.

Saya telah menyiapkan sebuah proyek iOS cepat dengan hanya UICollectionViewdalam tampilan utama, dengan outlet ke tampilan koleksi sehingga saya dapat menambahkan UIRefreshControluntuk itu dalam viewDidLoad. Ada juga sel prototipe dengan reuse identifiercCell

Ini semua kode di controller, dan itu menunjukkan masalah dengan cukup baik. Dalam kode ini saya mengatur ketinggian sel ke 100, yang tidak cukup untuk mengisi tampilan, dan oleh karena itu tampilan tidak dapat ditarik dan kontrol penyegaran tidak akan ditampilkan. Atur ke sesuatu yang lebih tinggi untuk mengisi tampilan, lalu berfungsi. Ada ide?

@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);
}


1
GunakanalwaysBounceVertical
onmyway133

Jawaban:


395

Coba ini:

self.collectionView.alwaysBounceVertical = YES;

Kode lengkap untuk 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;

1
Luar biasa, baris itu adalah perbaikan tepat, sisa kode tidak masalah. Bukan awal yang buruk untuk Anda di StackOverflow! Bersulang!
Merott

7
Yup tidak masalah. Sudah jelas bahwa saya seorang pemula ya. Bagaimanapun ternyata saya terjebak dalam situasi yang sama ketika saya melihat posting Anda. Ketika saya menemukan solusinya saya pikir saya pasti harus membagikannya. Cheers
Larry

6
Nah, Juan, Anda mungkin sudah menemukan jawaban untuk pertanyaan Anda. Tapi, untuk mengembalikan kontrol refresh ke keadaan normal setelah refresh, Anda harus menelepon [refreshControl endRefreshing].
Merott

2
Sayangnya ini tidak lagi didukung. UIRefreshControl hanya dapat digunakan dengan UITableViewController dan sekarang diberlakukan dengan ketat.
Luke Van Pada

3
Di iOS 10, UIScrollView(sebuah superview of UICollectionView) memiliki refreshControlproperti sekarang developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter

29

Atribut / Tampilan Gulir / Terpental secara vertikal di Storyboard / Xib

masukkan deskripsi gambar di sini


23

Jawaban Larry dengan cepat:

    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

Const memberikan kesalahan pada variabel yang tidak terdefinisi. jika seseorang menemukan situasi yang sama, ganti saja dengan UIColor.whiteColor()atau warna apa pun yang Anda suka.
Faisal

1
Juga untuk penggunaan Swift 2.2action: #selector(self.refresh)
Faisal

1

Jika collectionviewukuran konten Anda cukup besar untuk digulirkan secara vertikal, tidak apa-apa, tetapi dalam kasus Anda tidak.

Anda harus mengaktifkan properti AlwaysBounceVertical, sehingga Anda dapat mengaturself.collectionView.alwaysBounceVertical = YES;


0

Saya juga menghadapi masalah yang sama, saya tidak dapat menggunakan UIRefreshControlsampai UICollectionViewukuran konten cukup besar untuk menggulir secara vertikal,

Pengaturan bouncesproperti UICollectionViewdiselesaikan ini

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];

0

Saya menelepon beginRefreshing()segera setelah itu viewDidLoad(), tetapi pada beberapa layar tidak berfungsi. Dan hanya collectionView.layoutIfNeeded()di viewDidLoad()membantuku


0

Anda harus memeriksa panggilan api jika tampilan koleksi dalam keadaan menyegarkan kemudian mengakhiri penyegaran untuk menghilangkan kontrol penyegaran.

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()
}

Untuk dicatat bouncing pada gulir diaktifkan di file storyboard saya.
Asad Jamil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.