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

时间:2013-02-03 23:48:15

标签: ios uicollectionview uirefreshcontrol

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

我在主视图中设置了一个只有UICollectionView的快速iOS项目,并在集合视图中添加了一个插座,以便我可以在UIRefreshControl中向其添加viewDidLoad 。还有一个具有重用标识符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);
}

7 个答案:

答案 0 :(得分:383)

试试这个:

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 :(得分:28)

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

enter image description here

答案 2 :(得分:20)

拉里快速回答:

    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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我也遇到了同样的问题,在UIRefreshControl的内容大小足以垂直滚动之前,我无法使用UICollectionView

设置bounces的{​​{1}}属性解决了此问题

UICollectionView

答案 5 :(得分:0)

我在beginRefreshing()之后立即打电话给viewDidLoad(),但是在某些屏幕上它不起作用。只有collectionView.layoutIfNeeded()中的viewDidLoad()帮助了我

答案 6 :(得分: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()
}