UICollectionView üzerindeki UIRefreshControl yalnızca toplama kabının yüksekliğini dolduruyorsa çalışır


143

Ben eklemek çalışıyorum UIRefreshControlbir etmek UICollectionView, ancak sorun toplama görünümü, üst kabın yüksekliği doldurur sürece yenileme denetimi görünmüyor olmasıdır. Başka bir deyişle, koleksiyon görünümü kaydırma gerektirecek kadar uzun değilse, yenileme kontrol görünümünü ortaya çıkarmak için aşağı çekilemez. Koleksiyon ana kabının yüksekliğini aşar aşmaz, aşağı çekilir ve yenileme görünümünü gösterir.

Sadece hızlı bir iOS projeyi kurdunuz UICollectionViewyüzden ekleyebileceğiniz toplama görünümüne bir çıkış ile, ana görünümde içindeki UIRefreshControlkendisine viewDidLoad. Yeniden tanımlayıcılı bir prototip hücre de vardırcCell

Bu, denetleyicideki tüm koddur ve sorunu oldukça iyi gösterir. Bu kodda, hücrenin yüksekliğini 100'e ayarladım, bu da ekranı doldurmak için yeterli değildir ve bu nedenle görünüm çekilemez ve yenileme kontrolü gösterilmez. Ekranı doldurmak için daha yüksek bir değere ayarlayın, sonra çalışır. Herhangi bir fikir?

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

iOS 10 için
bunu görün

1
KullanımalwaysBounceVertical
onmyway133

Yanıtlar:


395

Bunu dene:

self.collectionView.alwaysBounceVertical = YES;

İçin tam kod 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
Harika, bu satır kesin düzeltme, kodun geri kalanı önemli değil. StackOverflow'da sizin için kötü bir başlangıç ​​değil! Şerefe!
Merott

7
Evet sorun değil. Acemi olduğum o kadar açık ki ha. Her neyse, yazınızı gördüğümde aynı durumda takılıp kaldım. Çözümü bulduğumda kesinlikle paylaşmalıyım. Şerefe
Larry

6
Juan, muhtemelen sorunun cevabını zaten bulmuşsundur. Ancak, yenilemeyi takiben yenileme denetimini normal durumuna döndürmek için aramalısınız [refreshControl endRefreshing].
Merott

2
Bu maalesef artık desteklenmiyor. UIRefreshControl yalnızca UITableViewController ile kullanılabilir ve şimdi kesinlikle uygulanmaktadır.
Luke Van,

3
UIScrollViewİOS 10'da, (bir gözetiminde UICollectionView) artık bir refreshControlmülke sahip developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter

29

Özellikler / Kaydırma Görünümü / Film Şeridinde Dikey Olarak Sıçrama / Xib

resim açıklamasını buraya girin


23

Larry'nin cevabı hızla:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor.blueColor()
    refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Hızlı 3:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = .blue
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Sabit tanımsız değişken hatası veriyor. Birisi aynı durumla karşılaşırsa, sadece onu UIColor.whiteColor()veya istediğiniz rengi değiştirin .
Faysal

1
Ayrıca Swift 2.2 kullanımı içinaction: #selector(self.refresh)
Faysal

1

Eğer senin collectionviewDikey kaydırmak için içerik boyutu büyük yeterince sahip 's Tamam, ama senin durumunda değil.

Özelliği etkinleştirmelisiniz AlwaysBounceVertical, böyleceself.collectionView.alwaysBounceVertical = YES;


0

Ben de aynı sorunla karşı karşıya kaldım, 'içerik boyutu dikey kaydırmak için yeterince büyük UIRefreshContrololana kadar kullanamadım UICollectionView,

Ayarlama bouncesözelliği UICollectionViewbu çözüldü

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

0

beginRefreshing()Hemen arkasından arıyorum viewDidLoad(), ancak bazı ekranlarda çalışmıyor. Ve sadece collectionView.layoutIfNeeded()içinde viewDidLoad()bana yardımcı oldu


0

Koleksiyon görünümünün yenileme durumunda olup olmadığını görmek için API çağrısını kontrol etmeniz ve ardından yenileme kontrolünü kapatmak için yenilemeyi sonlandırmanız gerekir.

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

Kayda değer sıçrama, film şeridi dosyamda etkinleştirildi.
Asad Jamil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.