iOS实现带遮罩的弹出选项卡
程序员文章站
2023-11-22 14:04:40
在我们日常开发的过程中难免会碰到一些选项的需求,下面是我针对我们该次需求做的一个小的demo,闲话不多说了,上图片,上代码。这样在我们选择上面一个cell进行点击的时候,我会通过一个代理把数据传递到下...
在我们日常开发的过程中难免会碰到一些选项的需求,下面是我针对我们该次需求做的一个小的demo,闲话不多说了,上图片,上代码。
这样在我们选择上面一个cell进行点击的时候,我会通过一个代理把数据传递到下面的页面,下面是代码
// // lcalertlistview.h // meimeidu // // created by 韩伟佳 on 16/4/6. // copyright © 2016年 langcuang. all rights reserved. // #import <uikit/uikit.h> @class lcalertlistview; @protocol lcalertlistviewdelegate <nsobject> -(void)alertlistview:(lcalertlistview*)view didselectedrow:(nsinteger)row; @end @interface lcalertlistview : uiview<uitableviewdatasource, uitableviewdelegate> -(instancetype)initwithframe:(cgrect)frame datas:(nsarray*)datas; -(instancetype)initwithframe:(cgrect)frame datas:(nsarray*)datas count:(nsarray*)counts; @property(nonatomic, strong) id<lcalertlistviewdelegate> delegate; @end
下面是具体实现
// // lcalertlistview.m // meimeidu // // created by 韩伟佳 on 16/4/6. // copyright © 2016年 langcuang. all rights reserved. // #import "lcalertlistview.h" #import "nofreecell.h" static cgfloat tableviewheight ; @implementation lcalertlistview{ uitableview* mtableview; nsarray* tabledata; nsarray* visiabledata; nsarray* visiablecount; uibutton* backgroundbtn; } -(instancetype)initwithframe:(cgrect)frame datas:(nsarray*)datas{ if (self = [super initwithframe:frame]) { self.backgroundcolor = [uicolor clearcolor]; backgroundbtn = [[uibutton alloc] initwithframe:frame]; backgroundbtn.backgroundcolor = rgba(88, 88, 88, 0.8); [backgroundbtn addtarget:self action:@selector(dismiss) forcontrolevents:uicontroleventtouchupinside]; [self addsubview:backgroundbtn]; tabledata = datas; tableviewheight = (datas.count + 1) * 44 + 20; mtableview = [[uitableview alloc] initwithframe:cgrectmake(0, kscreenheight, kscreenwidth, tableviewheight) style:uitableviewstyleplain]; [mtableview registerclass:[uitableviewcell class] forcellreuseidentifier:@"cell"]; mtableview.delegate = self; mtableview.datasource = self; [self addsubview:mtableview]; [uiview animatewithduration:.25 animations:^{ [mtableview setframe:cgrectmake(0, kscreenheight - tableviewheight, kscreenwidth, tableviewheight)]; } completion:^(bool finished) { }]; } return self; } -(instancetype)initwithframe:(cgrect)frame datas:(nsarray*)datas count:(nsarray*)counts{ if (self = [super initwithframe:frame]) { self.backgroundcolor = [uicolor clearcolor]; backgroundbtn = [[uibutton alloc] initwithframe:frame]; backgroundbtn.backgroundcolor = rgba(88, 88, 88, 0.8); [backgroundbtn addtarget:self action:@selector(dismiss) forcontrolevents:uicontroleventtouchupinside]; [self addsubview:backgroundbtn]; visiabledata = datas; visiablecount = counts; tableviewheight = (datas.count + 1) * 44 + 20; mtableview = [[uitableview alloc] initwithframe:cgrectmake(0, kscreenheight, kscreenwidth, tableviewheight) style:uitableviewstyleplain]; [mtableview registerclass:[uitableviewcell class] forcellreuseidentifier:@"cell"]; mtableview.delegate = self; mtableview.datasource = self; [self addsubview:mtableview]; [uiview animatewithduration:.25 animations:^{ [mtableview setframe:cgrectmake(0, kscreenheight - tableviewheight, kscreenwidth, tableviewheight)]; } completion:^(bool finished) { }]; } return self; } - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section{ if(tabledata.count > 0){ return [tabledata count]; }else if (visiablecount.count > 0){ return [visiablecount count]; } return nil; } - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath{ uitableviewcell* cell; nofreecell *doublecell; if([tabledata count] <= 3 && [tabledata count] > 0){ cell = [tableview dequeuereusablecellwithidentifier:@"cell" forindexpath:indexpath]; cell.textlabel.text = tabledata[indexpath.row]; return cell; }else { static nsstring *identifier = @"cell0"; doublecell =[tableview dequeuereusablecellwithidentifier:identifier]; if (doublecell == nil){ doublecell= [[nofreecell alloc]initwithstyle:uitableviewcellstyledefault reuseidentifier:identifier]; doublecell.visiblerolelabel.text = visiabledata[indexpath.row]; doublecell.showvisiblerolelabel.text = visiablecount[indexpath.row]; } return doublecell; } } -(void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath{ nsinteger row = indexpath.row; [self dismiss:row]; } -(void)dismiss:(nsinteger) row{ if (_delegate && [_delegate respondstoselector:@selector(alertlistview:didselectedrow:)]) { [_delegate alertlistview:self didselectedrow:row]; } [uiview animatewithduration:.15 animations:^{ [mtableview setframe:cgrectmake(0, kscreenheight, kscreenwidth, tableviewheight)]; } completion:^(bool finished) { [self removefromsuperview]; }]; } -(void)dismiss{ [uiview animatewithduration:.15 animations:^{ [mtableview setframe:cgrectmake(0, kscreenheight, kscreenwidth, tableviewheight)]; } completion:^(bool finished) { [self removefromsuperview]; }]; } @end
上面的nofree 文件只是一个自定义的cell,我们可以根据自己的需求自己设计,就不上传了,最后我们说说用法:
lcalertlistview* alertlistview = [[lcalertlistview alloc]initwithframe:cgrectmake(0, 0, kscreenwidth, kscreenheight) datas:visiblerolearray count:visiblerolecountarray]; alertlistview.delegate = self; [[[self.view superview] superview] addsubview:alertlistview];
下面是代理传值的使用
#pragma mark - lcalertlistviewdelegate -(void)alertlistview:(lcalertlistview *)view didselectedrow:(nsinteger)row{ if(didselectedindex == 0){ testvisiblerole = visiblerolearray[row]; }else{ testdata = datas[row]; } nsindexpath *indexpath = [nsindexpath indexpathforrow:didselectedindex insection:0]; [_mytableview reloadrowsatindexpaths:@[indexpath] withrowanimation:uitableviewrowanimationfade]; }
这样,我们的alerttableview 就做好了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: C#生成漂亮验证码完整代码类
下一篇: PHP执行linux命令常用函数汇总