最近有點閑,愛上了封裝,從此走上了一條不歸路。經(jīng)常性看封裝性的東西,也為此買了一本自定義封裝控件的書籍,覺得那位大牛寫的還不錯。
首先上一正版圖再好好墨跡墨跡。
實現(xiàn)效果
在控制器中直接導入#import "HHQzoneAlert.h" 接著請看調用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
Pucker2Cell *cell =[tableView dequeueReusableCellWithIdentifier:cellID];
cell.shuoshuo.hidden = YES;
cell.name.text = self.ArrData[indexPath.row];
[cell setdownOnClick:^(Pucker2Cell *cell, UIButton *btn) {
NSArray *arr = @[
@{HHAlertViewLeftImageKey:@"qzone-1",HHAlertViewTitleLabelKey:@"分享",
HHAlertViewCellTypeKey : @(HHQzoneAlertCellTypeShare)},
@{HHAlertViewLeftImageKey:@"qzone-2",HHAlertViewTitleLabelKey:@"收藏"},
@{HHAlertViewLeftImageKey:@"qzone-3",HHAlertViewTitleLabelKey:@"轉載照片"},
@{HHAlertViewLeftImageKey:@"qzone-4",HHAlertViewTitleLabelKey:@"隱藏此條動態(tài)"},
@{HHAlertViewLeftImageKey:@"qzone-5",HHAlertViewTitleLabelKey:@"不看他的動態(tài)"},
];
[[HHQzoneAlert shareQzoneAlert] showAround:btn array:arr];
[[HHQzoneAlert shareQzoneAlert]setlistCellOPerationOnclick:^(NSInteger row) {
NSDictionary *dic = arr[row];
[self showHudAutoHideString:dic[HHAlertViewTitleLabelKey]];
}];
[[HHQzoneAlert shareQzoneAlert] setshareCellOperationOnClick:^(NSInteger index) {
NSString *text;
switch (index) {
case 0:
text = @"QQ分享";
break;
case 1:
text = @"微信分享";
break;
default:
text = @"朋友圈分享";
break;
}
[self showHudAutoHideString:text];
}];
}];
return cell;
}
層次結構圖
思路分析:
首先先分析標準為1的部分,再逐步求精。
- 新建一個HHQzoneAlertView:UIView,用HHQzoneAlertView來實現(xiàn)彈框內容。
- 然后添加兩個屬性tableView和listArr.以及兩個代理方法;
// 點擊分享按鈕的響應事件
- (void)shareButtonOnClick:(NSInteger)index alertView:(HHQzoneAlertView *)alertView;
// 點擊cell的響應事件
- (void)listCellHandler:(NSInteger)row alertView:(HHQzoneAlertView *)alertView;
3.緊接著實現(xiàn)初始化、懶加載、再實現(xiàn)tableView中的dataSource中的兩個必須要實現(xiàn)的方法,以及一個delegate中的didSelectRowAtIndexPath
這個方法。一起看看cellForRowAtIndexPath
里面做了一些什么事情。。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSDictionary *dict = self.listArr[indexPath.row];
NSNumber *number = dict[HHAlertViewCellTypeKey];
if (number == nil) {
HHQzoneAlertListCell *cell =[tableView dequeueReusableCellWithIdentifier:listCellID];
NSDictionary *dic = self.listArr[indexPath.row];
NSString *imageName = dic[HHAlertViewLeftImageKey];
NSString *titleLabel = dic[HHAlertViewTitleLabelKey];
cell.leftImageView.image =[UIImage imageNamed:imageName];
cell.titleLabel.text = titleLabel;
return cell;
}
switch (number.integerValue) {
case 0:{
HHQzoneAlertListCell *cell =[tableView dequeueReusableCellWithIdentifier:listCellID];
NSDictionary *dic = self.listArr[indexPath.row];
NSString *imageName = dic[HHAlertViewLeftImageKey];
NSString *titleLabel = dic[HHAlertViewTitleLabelKey];
cell.leftImageView.image =[UIImage imageNamed:imageName];
cell.titleLabel.text = titleLabel;
return cell;
}
break;
case 1:{
HHQzoneAlertShareCell *cell = [tableView dequeueReusableCellWithIdentifier:shareCellID];
NSDictionary *dic = self.listArr[indexPath.row];
NSString *imageName = dic[HHAlertViewLeftImageKey];
NSString *titleLabel =dic[HHAlertViewTitleLabelKey];
cell.leftImageView.image =[UIImage imageNamed:imageName];
cell.titleLabel.text = titleLabel;
cell.delegate = self;
return cell;
}
break;
default:
return nil;
break;
}
}
隨后一起來看下自定義cell里面的布局情況
1.同時在HHQzoneAlertView這里@interface HHQzoneAlertListCell:UITableViewCell
和@interface HHQzoneAlertShareCell:HHQzoneAlertListCell
例如:此時的HHQzoneAlertView結構是這樣的,HHQzoneAlertView類加起來也就270行代碼。
現(xiàn)在開始要大動干戈了!!!!
1.先搭建HHQzoneAlertListCell(即彈出來的那個視圖,不包括qq,微信,朋友圈三個按鈕),下面會講到該怎么處理,先不捉急。先為HHQzoneAlertListCell添加兩個屬性leftImageView和titleLabel.
其次三步驟
初始化,重新布局,懶加載(簡化為初中懶):
//初始化將leftImageView和titleLabel添加進去
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;
- (void)layoutSubviews;
-(UIImageView *)leftImageView;
-(UILabel *)titleLabel;
2.再搭建HHQzoneAlertShareCell。添加一個sharebtnArr的屬性用來存儲三個按鈕。
其次設置一個HHQzoneAlertShareCellDelegate代理方法- (void)clickIndex:(NSInteger)index shareCell:(HHQzoneAlertShareCell *)shareCell
用來監(jiān)聽按鈕的點擊。
再者就是看葫蘆畫瓢的事情了。初中懶
三步驟又開始出來表演了。。
HHQzoneAlertView完事之后,再新建一個HHQzoneAlert:NSObject.提供一個單粒,在.h文件添加接口方便給使用者調用
//單粒
+ (instancetype)shareQzoneAlert;
// 顯示在指定的位置 指定的y值
-(void)show:(CGFloat )yy;
// 顯示在指定位置 指定的y值 array 字典數(shù)組(指定key的字典)
-(void)show:(CGFloat)yy array:(NSArray<NSDictionary *>*)array;
// 根據(jù)彈窗的高度自適應彈窗的顯示位置,在view的上面還是下面
-(void)showAround:(UIView *)view array:(NSArray<NSDictionary *>*)array;