仅当集合填充容器的高度时,UICollectionView上的UIRefreshControl才起作用


142

我试图将添加UIRefreshControlUICollectionView,但问题是,刷新控制不会出现,除非集合视图填补了其父容器的高度。换句话说,除非收集视图足够长以至于需要滚动,否则无法将其下拉以显示刷新控制视图。一旦集合超过其父容器的高度,它将被下拉并显示刷新视图。

我已经建立了一个快速的iOS项目,该项目仅UICollectionView在主视图内部,并具有集合视图的出口,以便可以在中添加UIRefreshControlviewDidLoad。还有一个带有重用标识符的原型单元cCell

这就是控制器中的所有代码,并且很好地演示了该问题。在此代码中,我将单元格的高度设置为100,这不足以填充显示,因此无法拉动视图,也不会显示刷新控件。将其设置为较高的值以填充显示,然后它可以工作。有任何想法吗?

@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
使用alwaysBounceVertical
onmyway133'3

Answers:


395

试试这个:

self.collectionView.alwaysBounceVertical = YES;

完整的代码 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
太好了,那一行是确切的解决方法,其余代码都没有关系。对您来说StackOverflow不错!干杯!
Merott

7
是的,没问题。很明显,我是新手。无论如何,当我看到您的帖子时,我陷入了同样的境地。当我找到解决方案时,我当然应该分享它。干杯
拉里

6
好吧,胡安,您可能已经找到问题的答案。但是,为了使刷新控件在刷新后返回其正常状态,必须调用[refreshControl endRefreshing]
Merott

2
不幸的是,不再支持此功能。UIRefreshControl只能与UITableViewController一起使用,现在已严格执行。
卢克·范

3
在iOS 10中,UIScrollView(具有的一个超级视图UICollectionView)现在具有refreshControl属性developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter


23

拉里的回答很快:

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

斯威夫特3:

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

常量给出未定义变量的错误。如果有人遇到相同的情况,只需将其替换为UIColor.whiteColor()或您喜欢的任何颜色。
费萨尔

1
也适用于Swift 2.2action: #selector(self.refresh)
Faisal,

1

如果您collectionview的内容大小足够大,可以垂直滚动,则可以,但在您的情况下则不行。

您必须启用该属性AlwaysBounceVertical,然后才能设置self.collectionView.alwaysBounceVertical = YES;


0

我也遇到了同样的问题,UIRefreshControl直到UICollectionView的内容大小足够大以可以垂直滚动时,我才可以使用,

设置解决此问题的bounces属性UICollectionView

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


0

如果集合视图处于刷新状态,则必须签入api调用,然后结束刷新以关闭刷新控件。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.