148

我正在尝试将 a 添加UIRefreshControl到 a UICollectionView,但问题是刷新控件不会出现,除非集合视图填满其父容器的高度。换句话说,除非集合视图足够长以至于需要滚动,否则它不能被拉下以显示刷新控制视图。一旦集合超过其父容器的高度,它就会被拉下并显示刷新视图。

我已经建立了一个快速的 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);
}
4

7 回答 7

403

试试这个:

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;
于 2013-02-04T18:59:33.050 回答
30

Storyboard/Xib 中的属性/滚动视图/垂直弹跳

在此处输入图像描述

于 2013-12-13T09:04:07.267 回答
24

拉里迅速回答:

    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
于 2015-10-20T21:19:55.533 回答
2

如果您collectionview的内容大小足以垂直滚动,那没关系,但在您的情况下不是。

您必须启用该属性AlwaysBounceVertical,以便您可以设置self.collectionView.alwaysBounceVertical = YES;

于 2015-04-22T05:17:18.837 回答
0

UIRefreshControl我也面临同样的问题,直到UICollectionView' 的内容大小足够大可以垂直滚动,我才能使用,

设置bounces属性UICollectionView解决了这个

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];
于 2015-05-29T06:36:25.060 回答
0

我在beginRefreshing()之后马上打电话viewDidLoad(),但在某些屏幕上它不起作用。只有collectionView.layoutIfNeeded()viewDidLoad()帮助我

于 2019-01-17T06:13:45.327 回答
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()
}
于 2020-02-06T08:15:41.297 回答