// // KBShopItemVC.m // keyBoard // // Created by Mac on 2025/11/9. // #import "KBShopItemVC.h" #import #import #import "KBSkinCardCell.h" @interface KBShopItemVC () @property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); @end @implementation KBShopItemVC - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; // 懒加载 collectionView,并添加到视图 [self.view addSubview:self.collectionView]; [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); // mas 布局:铺满 }]; // 刷新组件(演示:2 秒后结束) KBWeakSelf if (self.isNeedHeader) { self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [weakSelf.collectionView.mj_header endRefreshing]; }); }]; } if (self.isNeedFooter) { self.collectionView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [weakSelf.dataSource addObject:@"加载更多成功"]; // 模拟新增一条 [weakSelf.collectionView reloadData]; [weakSelf.collectionView.mj_footer endRefreshing]; }); }]; } if (@available(iOS 11.0, *)) { self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [self beginFirstRefresh]; } #pragma mark - 刷新控制 // 首次进入自动触发一次刷新(如果需要) - (void)beginFirstRefresh { if (!self.isHeaderRefreshed) { [self beginRefreshImmediately]; } } - (void)beginRefreshImmediately { if (self.isNeedHeader) { [self.collectionView.mj_header beginRefreshing]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.isHeaderRefreshed = YES; [self.collectionView reloadData]; [self.collectionView.mj_header endRefreshing]; }); } else { self.isHeaderRefreshed = YES; [self.collectionView reloadData]; } } #pragma mark - UICollectionView DataSource - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { if (!self.isHeaderRefreshed) return 0; return self.dataSource.count; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { KBSkinCardCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"KBSkinCardCell" forIndexPath:indexPath]; NSString *title = (indexPath.item < self.dataSource.count) ? self.dataSource[indexPath.item] : @"Dopamine"; [cell configWithTitle:title imageURL:nil price:@"20"]; // 价格写死 20(演示) return cell; } #pragma mark - UICollectionView DelegateFlowLayout - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { // 两列布局:左右 16 间距,中间列间距 12 CGFloat insetLR = 16.0; CGFloat spacing = 12.0; CGFloat contentW = collectionView.bounds.size.width - insetLR * 2; CGFloat itemW = floor((contentW - spacing) / 2.0); CGFloat itemH = itemW * 0.75 + 56; // KBSkinCardCell 内部高度估算 return CGSizeMake(itemW, itemH); } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { return UIEdgeInsetsMake(12, 16, 12, 16); } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 12.0; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 12.0; } #pragma mark - UIScrollView Delegate(转发给分页容器) - (void)scrollViewDidScroll:(UIScrollView *)scrollView { !self.scrollCallback ?: self.scrollCallback(scrollView); } #pragma mark - JXPagingViewListViewDelegate - (UIView *)listView { return self.view; } - (UIScrollView *)listScrollView { return self.collectionView; } - (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { self.scrollCallback = callback; } - (void)listWillAppear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (void)listDidAppear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (void)listWillDisappear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (void)listDidDisappear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } #pragma mark - Lazy - (UICollectionView *)collectionView { if (!_collectionView) { UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new]; layout.scrollDirection = UICollectionViewScrollDirectionVertical; _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; _collectionView.backgroundColor = [UIColor whiteColor]; _collectionView.dataSource = self; _collectionView.delegate = self; // 注册皮肤卡片 cell [_collectionView registerClass:KBSkinCardCell.class forCellWithReuseIdentifier:@"KBSkinCardCell"]; // 复用标识 } return _collectionView; } @end