UIRefreshControl trên UICollectionView chỉ hoạt động nếu bộ sưu tập lấp đầy chiều cao của container


142

Tôi đang cố gắng để thêm một UIRefreshControlđến một UICollectionView, nhưng vấn đề là kiểm soát làm mới không xuất hiện trừ khi xem bộ sưu tập đầy lên chiều cao của container cha của nó. Nói cách khác, trừ khi chế độ xem bộ sưu tập đủ dài để yêu cầu cuộn, không thể kéo xuống để hiển thị chế độ xem điều khiển làm mới. Ngay khi bộ sưu tập vượt quá chiều cao của thùng chứa mẹ, nó được kéo xuống và hiển thị chế độ xem làm mới.

Tôi đã thiết lập một dự án iOS nhanh chóng chỉ với một UICollectionViewbên trong khung nhìn chính, với một lối thoát cho chế độ xem bộ sưu tập để tôi có thể thêm UIRefreshControlnó vào đó viewDidLoad. Ngoài ra còn có một ô nguyên mẫu với mã định danh tái sử dụngcCell

Đây là tất cả các mã trong bộ điều khiển và nó thể hiện vấn đề khá tốt. Trong mã này, tôi đặt chiều cao của ô là 100, không đủ để lấp đầy màn hình và do đó, chế độ xem không thể kéo và điều khiển làm mới sẽ không hiển thị. Đặt nó vào một cái gì đó cao hơn để lấp đầy màn hình, sau đó nó hoạt động. Có ý kiến ​​gì không?

@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
Sử dụngalwaysBounceVertical
onmyway133

Câu trả lời:


395

Thử cái này:

self.collectionView.alwaysBounceVertical = YES;

Hoàn thành mã cho một 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
Tuyệt vời, dòng đó là sửa chữa chính xác, phần còn lại của mã không thành vấn đề. Một khởi đầu không tồi cho bạn trên StackOverflow! Chúc mừng!
Merott

7
Yup không có vấn đề. Rõ ràng là tôi là người mới hả. Dù sao hóa ra tôi đã bị mắc kẹt trong tình huống tương tự khi tôi thấy bài viết của bạn. Khi tôi tìm thấy giải pháp mặc dù tôi chắc chắn nên chia sẻ nó. Chúc mừng
Larry

6
Chà, Juan, có lẽ bạn đã tìm thấy câu trả lời cho câu hỏi của mình. Nhưng, để trả lại điều khiển làm mới về trạng thái bình thường sau khi làm mới, bạn phải gọi [refreshControl endRefreshing].
Merott

2
Thật không may, điều này không còn được hỗ trợ. UIRefreshControl chỉ có thể được sử dụng với UITableViewControll và bây giờ nó được thi hành nghiêm ngặt.
Luke Van vào

3
Trong iOS 10, UIScrollView(một giám sát viên UICollectionView) có một refreshControltài sản hiện là developer.apple.com/ideo/play/wwdc2016/219/?time=2033
Streeter

29

Thuộc tính / Chế độ xem cuộn / Thoát theo chiều dọc trong Storyboard / Xib

nhập mô tả hình ảnh ở đây


23

Câu trả lời của Larry nhanh chóng:

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

Swift 3:

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

Const đưa ra một lỗi của biến không xác định. nếu ai đó gặp phải tình huống tương tự, chỉ cần thay thế nó bằng UIColor.whiteColor()hoặc bất kỳ màu nào bạn thích.
Faisal

1
Ngoài ra để sử dụng Swift 2.2action: #selector(self.refresh)
Faisal

1

Nếu collectionviewkích thước nội dung của bạn đủ lớn để cuộn theo chiều dọc thì không sao, nhưng trong trường hợp của bạn thì không.

Bạn phải kích hoạt thuộc tính AlwaysBounceVertical, để bạn có thể đặtself.collectionView.alwaysBounceVertical = YES;


0

Tôi cũng đang đối mặt với cùng một vấn đề, tôi không thể sử dụng UIRefreshControlcho đến khi UICollectionViewkích thước nội dung của nó đủ lớn để cuộn theo chiều dọc,

Đặt thuộc bouncestính của UICollectionViewgiải quyết này

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

0

Tôi đang gọi beginRefreshing()ngay sau đó viewDidLoad(), nhưng trên một số màn hình thì nó không hoạt động. Và chỉ collectionView.layoutIfNeeded()trong viewDidLoad()giúp tôi


0

Bạn phải kiểm tra cuộc gọi api nếu chế độ xem bộ sưu tập ở trạng thái làm mới sau đó kết thúc làm mới để loại bỏ kiểm soát làm mới.

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()
}

Để được lưu ý nảy trên cuộn được kích hoạt trong tập tin bảng phân cảnh của tôi.
Asad Jamil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.