UIRefreshControl บน UICollectionView จะทำงานได้ก็ต่อเมื่อคอลเลกชันเติมความสูงของคอนเทนเนอร์


143

ฉันพยายามที่จะเพิ่มUIRefreshControlไปUICollectionViewแต่ปัญหาคือการควบคุมการรีเฟรชไม่ปรากฏเว้นแต่มุมมองคอลเลกชันเติมขึ้นสูงของภาชนะพ่อแม่ของตน กล่าวอีกนัยหนึ่งยกเว้นว่ามุมมองการรวบรวมยาวพอที่จะต้องเลื่อนมันไม่สามารถดึงลงมาเพื่อเปิดเผยมุมมองการควบคุมการรีเฟรช ทันทีที่คอลเล็กชันมีขนาดเกินความสูงของคอนเทนเนอร์หลักจะถูกดึงลงมาและแสดงมุมมองการรีเฟรช

ฉันได้ตั้งค่าโครงการ iOS อย่างรวดเร็วด้วยUICollectionViewมุมมองหลักภายในด้วยทางออกไปยังมุมมองคอลเลกชันเพื่อให้ฉันสามารถเพิ่ม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);
}

ดูสิ่งนี้สำหรับ iOS 10 stackoverflow.com/questions/19483511/…
Anish Parajuli 웃

1
ใช้alwaysBounceVertical
onmyway133

คำตอบ:


395

ลองสิ่งนี้:

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
ดีเลิศบรรทัดนั้นคือการแก้ไขที่ถูกต้องส่วนที่เหลือของรหัสไม่สำคัญ ไม่ใช่จุดเริ่มต้นที่แย่สำหรับคุณใน StackOverflow! ไชโย!
Merott

7
ไม่มีปัญหาเลย เห็นได้ชัดว่าฉันเป็นมือใหม่ อย่างไรก็ตามปรากฎว่าฉันติดอยู่ในสถานการณ์เดียวกันเมื่อฉันเห็นโพสต์ของคุณ เมื่อฉันพบวิธีการแก้ปัญหาที่ฉันแม้ว่าฉันควรจะแบ่งปันมันแน่นอน ไชโย
แลร์รี่

6
ฮวนคุณอาจพบคำตอบสำหรับคำถามของคุณแล้ว [refreshControl endRefreshing]แต่เพื่อที่จะกลับมาควบคุมเพื่อการฟื้นฟูสภาวะปกติต่อไปรีเฟรชคุณต้องเรียก
Merott

2
น่าเสียดายที่ไม่รองรับอีกต่อไป UIRefreshControl สามารถใช้ได้กับ UITableViewController เท่านั้นและตอนนี้มีการบังคับใช้อย่างเคร่งครัด
Luke Van ใน

3
ใน iOS 10 UIScrollView(ผู้ดูแลUICollectionView) มีrefreshControlสถานที่ให้บริการในขณะนี้developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter


23

คำตอบของ 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

Const ให้ข้อผิดพลาดของตัวแปรที่ไม่ได้กำหนด หากมีคนพบสถานการณ์เดียวกันเพียงแค่แทนที่ด้วยUIColor.whiteColor()หรือสีที่คุณชอบ
Faisal

1
นอกจากนี้สำหรับการใช้งาน Swift 2.2action: #selector(self.refresh)
Faisal

1

หากcollectionviewขนาดเนื้อหาของคุณใหญ่พอที่จะเลื่อนในแนวตั้งก็โอเค แต่ในกรณีของคุณจะไม่เป็นเช่นนั้น

คุณต้องเปิดใช้งานคุณสมบัติAlwaysBounceVerticalเพื่อให้คุณสามารถตั้งค่าself.collectionView.alwaysBounceVertical = YES;


0

ฉันก็เผชิญกับปัญหาเดียวกันฉันไม่สามารถใช้UIRefreshControlจนกว่าUICollectionViewเนื้อหาขนาดใหญ่พอที่จะเลื่อนในแนวตั้ง

การตั้งค่าbouncesคุณสมบัติของการUICollectionViewแก้ไขนี้

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

0

ฉันกำลังโทรหาbeginRefreshing()หลังจากviewDidLoad()นั้น แต่ในบางหน้าจอมันไม่ทำงาน และเฉพาะcollectionView.layoutIfNeeded()ในviewDidLoad()ช่วยฉัน


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

ที่จะต้องสังเกตการตีกลับในการเลื่อนเปิดใช้งานในไฟล์เรื่องราวของฉัน
ซาด Jamil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.