146 lines
5.7 KiB
Objective-C
146 lines
5.7 KiB
Objective-C
//
|
||
// KBShopItemVC.m
|
||
// keyBoard
|
||
//
|
||
// Created by Mac on 2025/11/9.
|
||
//
|
||
|
||
#import "KBShopItemVC.h"
|
||
#import <MJRefresh/MJRefresh.h>
|
||
#import <Masonry/Masonry.h>
|
||
#import "KBSkinCardCell.h"
|
||
|
||
@interface KBShopItemVC ()<UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
|
||
@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
|