iOS 純代碼自定義collectionview节槐,選中搀庶,刪除cell效果

由于沒有用過collectionview,也是剛開始純代碼布局铜异,所以查了很多資料和問了一些朋友哥倔,總算解決問題

在vc里用到了另外的一些分類,如有需要歡迎追問揍庄,互相學(xué)習(xí)咆蒿。歡迎大神指點

群號:310800319

群號:246807516

步驟:

? 1.自定義collectionviewCell類

??2.模型類 ?

? 3. 在一個UIViewController里添加一個collectionView

第一步:自定義cell

在cell的.h 里:

#import#import "LocalWorkModel.h"

NS_ASSUME_NONNULL_BEGIN

@class LocalWorkCell;

typedef void(^CellSelectedHander)(LocalWorkCell * cell,BOOL isSelected);

@interface LocalWorkCell : UICollectionViewCell

/** model */

@property(nonatomic,strong)LocalWorkModel *model;

/** 選中圖片 */

@property(nonatomic,strong)UIImageView *selectedImage;

/// 點擊進(jìn)行的回調(diào)

@property (nonatomic, copy)CellSelectedHander selectedHandler;

/// 表示選中

- (void)didSelected;

@end

在cell的.m 里:

#import "LocalWorkCell.h"

@interface LocalWorkCell ()

//圖片

@property(nonatomic,weak) UIImageView? *imageView;

@end

@implementation LocalWorkCell

//通過純代碼的方式創(chuàng)建此類實例 會調(diào)用該方法? 在此方法中,添加子控件

- (instancetype)initWithFrame:(CGRect)frame{

if(self = [super initWithFrame:frame]){

UIImageView *imageView = [[UIImageView alloc] init];

[self addSubview:imageView];

self.imageView = imageView;

//選中cell的圖片

UIImageView *selectedImage = [[UIImageView alloc]init];

[self addSubview:selectedImage];

self.selectedImage = selectedImage;

self.selectedImage.hidden = YES;

}

return self;

}

//當(dāng)子控件發(fā)生變化(包括子控件增減和位置大小改變)時,都會調(diào)用此方法 來重新布局所有子控件

- (void)layoutSubviews{

[super layoutSubviews];

//設(shè)置 imageView 的 frame

//? ? CGFloat imageViewX = 10;

//? ? CGFloat imageViewY = 0;

//? ? CGFloat imageViewW = self.cc_w - 2 * imageViewX;

//? ? CGFloat imageViewH = imageViewW;

self.imageView.frame = CGRectMake(0, 0, self.cc_w + 5 , self.cc_h);

self.selectedImage.frame = self.imageView.frame;

}

//設(shè)置子控件的內(nèi)容

-(void)setModel:(LocalWorkModel *)model{

_model = model;

self.imageView.image = [UIImage imageNamed:model.icon];

self.selectedImage.image = [UIImage imageNamed:@"cover_ selected"];

}

-(void)didSelected

{

self.selectedImage.hidden = !self.selectedImage.hidden;

if (self.selectedHandler) {

self.selectedHandler(self,!self.selectedImage.hidden);//已經(jīng)隱藏表示需要移除

}

}

@end

第二步:模型類

在模型類的.h:

#import@interface LocalWorkModel : NSObject

//名稱

@property(nonatomic,copy)NSString *name;

//圖片

@property(nonatomic,copy)NSString *icon;

//快速創(chuàng)建實例

+ (instancetype)appWithDict:(NSDictionary *)dict;

@end

模型類的.m:

#import "LocalWorkModel.h"

@implementation LocalWorkModel

+ (instancetype)appWithDict:(NSDictionary *)dict{

//這樣寫會通用 可以把這個 作為代碼塊了

id obj = [[self alloc] init];

[obj setValuesForKeysWithDictionary:dict];

return obj;

}

@end

第三步:在一個UIViewController里添加一個collectionView

在.h里沒有代碼蚂子,所以直接.m:

#import "LocalWorkVC.h"

#import "UIBarButtonItem+Extension.h"

#import "LocalWorkCell.h"

#import "LocalWorkModel.h"

#import "PlayLocalVideoVC.h"

static NSString *ID = @"LocalWorkcell";

@interface LocalWorkVC ()@property(nonatomic,strong)UICollectionView *collectionview;

@property(nonatomic,strong)UICollectionViewFlowLayout *flowLayout;

/** 數(shù)組 */

@property(nonatomic,strong)NSMutableArray *models;

/** 操作本地數(shù)據(jù)的VIEW */

@property(nonatomic,strong)UIView *operationDataView;

@property(nonatomic,strong)UIButton *deleteButton;

//選中cell的圖片獲取

/** cell */

@property(nonatomic,strong)LocalWorkCell *selectedCellImage;

/// 表示選中的cache

@property (nonatomic, strong)NSMutableSet * cacheSet;

@end

@implementation LocalWorkVC

- (void)viewDidLoad {

[super viewDidLoad];

[self setupUI];

[self setupnavigation];

}

-(void)setupUI{

//1.創(chuàng)建 UICollectionView 實例

//1.1創(chuàng)建流水布局

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

//? ? layout.itemSize = CGSizeMake(150, 150);

//1.2通過流水布局創(chuàng)建UICollectionView

UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight-64) collectionViewLayout:layout];

//1.3設(shè)置UICollectionView的背景色

collectionView.backgroundColor = [UIColor whiteColor];

//1.4設(shè)置數(shù)據(jù)源

collectionView.dataSource = self;

collectionView.delegate = self;

//1.5添加到View中

[self.view addSubview:collectionView];

//1.6設(shè)置為全局變量

self.collectionview = collectionView;

//3 注冊cell

[self.collectionview registerClass:[LocalWorkCell class] forCellWithReuseIdentifier:ID];

//彈出底部view

UIWindow *window = [UIApplication sharedApplication].keyWindow;

[window addSubview:self.operationDataView];

[self.operationDataView mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(0);

make.right.equalTo(0);

make.bottom.equalTo(0);

make.height.equalTo(44);

}];

self.operationDataView.hidden = YES;

//刪除delete

[self.operationDataView addSubview:self.deleteButton];

[self.deleteButton mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.bottom.right.left.equalTo(0);

}];

//collection

[self.view addSubview:_collectionview];

//初始化模擬數(shù)據(jù)源

self.cacheSet = [NSMutableSet set];


}

-(void)setupnavigation{ ? ? ?self.title = @"本地作品";? ? self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [CCTools stringToColor:@"#333333"]};? ? //導(dǎo)航欄右邊按鈕沃测,系統(tǒng)的不能修改,自己寫個按鈕上去? ? UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"選擇" style:UIBarButtonItemStylePlain target:self action:@selector(navChooseRightButton)];? ? rightButton.tintColor = RGB(51, 51, 51);? ? [rightButton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"" size:17.0], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];? ? self.navigationItem.rightBarButtonItem = rightButton;}-(void)navChooseRightButton{? ? ? ? if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"選擇"]) {? ? ? ? [self.navigationItem.rightBarButtonItem setTitle:@"取消"];? ? ? ? self.operationDataView.hidden = NO;? ? }else if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"取消"]){? ? ? ? [self.navigationItem.rightBarButtonItem setTitle:@"選擇"];? ? ? ? self.operationDataView.hidden = YES;? ? ? ? ? ? }? ? }-(void)deleteEvent{? ? DLog(@"事件");? ? [self p_deleteHandler];? ? _deleteButton.userInteractionEnabled = NO;? ? _deleteButton.alpha = 0.4;}#pragma mark - 進(jìn)行刪除操作- (void)p_deleteHandler{? ? //如果沒有選擇缆镣,return? 這里也可以判斷是否有選中的cell? ? if (self.cacheSet.count == 0) {? return;? }? ? ? //獲得無序序列? ? NSArray * indexPaths = self.cacheSet.allObjects;? ? ? ? //變?yōu)橛行? ? NSSortDescriptor * descirptor = [NSSortDescriptor sortDescriptorWithKey:@"row" ascending:true];? ? ? ? NSArray* deleteIndexPath = [indexPaths sortedArrayUsingDescriptors:@[descirptor]];

//逆序刪除數(shù)據(jù)源

for (NSInteger i = deleteIndexPath.count - 1; i >= 0; i--) {

NSInteger row = deleteIndexPath[i].row;

//刪除

[self.models removeObjectAtIndex:row];

}

//刷新collectionView

[self.collectionview deleteItemsAtIndexPaths:deleteIndexPath];

//刪除所有數(shù)據(jù)

[self.cacheSet removeAllObjects];

//返回

//? ? [self.navigationController popViewControllerAnimated:true];

}

-(void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:NO];

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

[self.navigationController setNavigationBarHidden:YES];

}

#pragma mark -2.實現(xiàn)數(shù)據(jù)源方法//2.1 返回多少組- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{? ? return 1;}//2.2 返回每組有多少item- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{? ? return self.models.count;}//2.3 返回每個item的cell- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{? ? //獲得可重用cell? ? LocalWorkCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];? ? __weak typeof(self) weakSelf = self;? ? //設(shè)置交互回調(diào)? ? cell.selectedHandler = ^(LocalWorkCell * _Nonnull cell,BOOL isSelected) {? ? ? ? ? ? ? ? /********? 使用回調(diào)獲得indexPath? **********/? ? ? ? ? ? ? ? //獲得indexPath? ? ? ? NSIndexPath * index = [weakSelf.collectionview indexPathForCell:cell];? ? ? ? ? ? ? ? if (isSelected) {//表示選中芽突,添加indexPath至Set? ? ? ? ? ? _deleteButton.userInteractionEnabled = YES;? ? ? ? ? ? _deleteButton.alpha = 1.0;? ? ? ? ? ? [weakSelf.cacheSet addObject:index];? ? ? ? }? ? ? ? ? ? ? ? else { //移除? ? ? ? ? ? _deleteButton.userInteractionEnabled = NO;? ? ? ? ? ? _deleteButton.alpha = 0.4;? ? ? ? ? ? [weakSelf.cacheSet removeObject:index];? ? ? ? }? ? };? ? //設(shè)置狀態(tài)? ? cell.selectedImage.hidden = ![self.cacheSet containsObject:indexPath];? ? //給cell設(shè)置數(shù)據(jù)? ? cell.model = self.models[indexPath.item];? ? //返回cell? ? return cell;}//_deleteButton.userInteractionEnabled = NO;//點擊item(cell)方法- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{? ? DLog(@"indexPath= %ld",indexPath.row);? ? ? if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"選擇"]) {? ? ? ? PUSH_CONTROL(PlayLocalVideoVC);? ? }? ? if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"取消"]){? ? ? ? //獲得cell? ? ? ? LocalWorkCell * cell = (LocalWorkCell *)[collectionView cellForItemAtIndexPath:indexPath];? ? ? ? ? ? ? ? [cell didSelected];? ? }}- (void)deleteItemsAtIndexPaths:(NSArray*)indexPaths{

[[[UICollectionView alloc] init] deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];

}

//返回每一個cell的大小

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

return CGSizeMake(self.collectionview.cc_w / 3 -5, 150);

}

//設(shè)置每個item的UIEdgeInsets? 組內(nèi)邊距

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{

return UIEdgeInsetsMake(5, 0, 44, 0);

}

//cover_ selected

//設(shè)置最小行間距,也就是前一行與后一行的中間最小間隔? 上下距離

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{

return 3;

}

// 設(shè)置最小列間距董瞻,也就是左行與右一行的中間最小間隔? 左右距離

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {

return 3;

}

#pragma mark -懶加載

-(NSMutableArray *)models{

if (_models == nil) {

//獲得app.plist的路徑

NSString *path = [[NSBundle mainBundle] pathForResource:@"localWork.plist" ofType:nil];

//加載app.plist中的字典為數(shù)組

NSArray *arr = [NSArray arrayWithContentsOfFile:path];

NSMutableArray *array = [NSMutableArray array];

//字典轉(zhuǎn)模型

for(NSDictionary *dict in arr){

LocalWorkModel *model = [LocalWorkModel appWithDict:dict];

[array addObject:model];

}

_models = array;

}

return _models;

}

-(UIView *)operationDataView{

if (_operationDataView == nil) {

_operationDataView = [[UIView alloc]init];

//? ? ? ? _operationDataView.backgroundColor = [UIColor grayColor];

}

return _operationDataView;

}

-(UIButton *)deleteButton{

if (_deleteButton == nil) {

_deleteButton = [[UIButton alloc]init];

_deleteButton.backgroundColor = [UIColor redColor];

[_deleteButton setTitle:@"刪 除" forState:UIControlStateNormal];

[_deleteButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

_deleteButton.layer.cornerRadius = 4.5;? // 設(shè)置圓角

[_deleteButton addTarget:self action:@selector(deleteEvent) forControlEvents:UIControlEventTouchUpInside];

_deleteButton.userInteractionEnabled = NO;

_deleteButton.alpha = 0.4;

}

return _deleteButton;

}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寞蚌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钠糊,更是在濱河造成了極大的恐慌挟秤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抄伍,死亡現(xiàn)場離奇詭異艘刚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)截珍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門攀甚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箩朴,“玉大人,你說我怎么就攤上這事秋度≌ㄅ樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵荚斯,是天一觀的道長埠居。 經(jīng)常有香客問我,道長事期,這世上最難降的妖魔是什么滥壕? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮兽泣,結(jié)果婚禮上绎橘,老公的妹妹穿的比我還像新娘。我一直安慰自己撞叨,他們只是感情好金踪,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牵敷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法希。 梳的紋絲不亂的頭發(fā)上枷餐,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音苫亦,去河邊找鬼毛肋。 笑死,一個胖子當(dāng)著我的面吹牛屋剑,可吹牛的內(nèi)容都是我干的润匙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼唉匾,長吁一口氣:“原來是場噩夢啊……” “哼孕讳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巍膘,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤厂财,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峡懈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璃饱,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年肪康,在試婚紗的時候發(fā)現(xiàn)自己被綠了荚恶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撩穿。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谒撼,靈堂內(nèi)的尸體忽然破棺而出冗锁,到底是詐尸還是另有隱情,我是刑警寧澤嗤栓,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布冻河,位于F島的核電站,受9級特大地震影響茉帅,放射性物質(zhì)發(fā)生泄漏叨叙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一堪澎、第九天 我趴在偏房一處隱蔽的房頂上張望擂错。 院中可真熱鬧,春花似錦樱蛤、人聲如沸钮呀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爽醋。三九已至,卻和暖如春便脊,著一層夾襖步出監(jiān)牢的瞬間蚂四,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工哪痰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留遂赠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓晌杰,卻偏偏與公主長得像跷睦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肋演,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容