UIRefreshControl
をUICollectionView
に追加しようとしていますが、問題は、コレクションビューがその親コンテナーの高さをいっぱいにしない限り、更新コントロールが表示されないことです。つまり、コレクションビューがスクロールを必要とするほど長くない限り、コレクションビューをプルダウンして更新コントロールビューを表示することはできません。コレクションが親コンテナの高さを超えるとすぐに、コレクションがプルダウンされ、更新ビューが表示されます。
メインビュー内にUICollectionView
だけで、コレクションビューへのアウトレットを使用して、UIRefreshControl
をviewDidLoad
に追加できるように、簡単なiOSプロジェクトをセットアップしました。再利用識別子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);
}
これを試して:
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;
SwiftでのLarryの答え:
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
collectionview
のコンテンツサイズが垂直方向にスクロールするのに十分な大きさであれば、問題ありませんが、あなたの場合はそうではありません。
プロパティAlwaysBounceVertical
を有効にする必要があるため、self.collectionView.alwaysBounceVertical = YES;
を設定できます
私も同じ問題に直面していました。UIRefreshControl
のコンテンツサイズが垂直にスクロールするのに十分な大きさになるまで、UICollectionView
を使用できませんでした。
bounces
のUICollectionView
プロパティを設定すると、これが解決しました
[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];
beginRefreshing()
の直後にviewDidLoad()
を呼び出していますが、一部の画面では機能しません。 collectionView.layoutIfNeeded()
のviewDidLoad()
だけが私を助けてくれました