UICollectionView 上的 UIRefreshControl 只有在集合填满容器的高度时才有效

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

我已经建立了一个快速的 iOS 项目,只有一个 UICollectionView内的主视图,与一个出口的集合视图,以便我可以添加到它的 viewDidLoadUIRefreshControl。还有一个具有重用标识符 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);
}
67489 次浏览

试试这个:

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;

属性/滚动视图/故事板中的垂直反弹/Xib

enter image description here

如果您的 collectionview的内容大小足以垂直滚动,那么可以,但是在您的情况下就不行了。

必须启用属性 AlwaysBounceVertical,这样才能设置 self.collectionView.alwaysBounceVertical = YES;

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

设置 UICollectionViewbounces属性解决了这个问题

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

拉里迅速回答道:

    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

我在 viewDidLoad()之后打电话给 beginRefreshing(),但是在一些屏幕上它不工作。而且只有 viewDidLoad()中的 collectionView.layoutIfNeeded()帮助了我

如果集合视图处于刷新状态,则必须签入 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()
}