iOS应用新特性界面
程序员文章站
2022-03-23 14:00:49
//
// xtxguideviewcontroller.m
// 新特性界面
//
// copyright ? 2016年 longchuang. all rights...
// // xtxguideviewcontroller.m // 新特性界面 // // copyright ? 2016年 longchuang. all rights reserved. // #import "xtxguideviewcontroller.h" // 1.导入第三方框架 #import "masonry.h" // 2.导入视图头文件 #import "xtxguideview.h" #define xtximagecount 4 // 自定义sb视图类 @interface xtxguideviewcontroller () @end @implementation xtxguideviewcontroller - (void)viewdidload { [super viewdidload]; // do any additional setup after loading the view. // 设置主背景图片 [self setupui]; [self addguideview]; } -(void)setupui { // 创建主界面图片 uiimageview *imageview = [[uiimageview alloc]init]; // 添加图片 imageview.image = [uiimage imagenamed:@"cozy-control-car"]; // 设置图片填充模式 imageview.contentmode = uiviewcontentmodescaleaspectfit; // 添加到父控件 [self.view addsubview:imageview]; // 给imageview添加约束,添加约束前imageview一定要被添加到父控件上 [imageview mas_makeconstraints:^(masconstraintmaker *make) { [make center]; make.width.equalto(self.view.mas_width); make.height.equalto(self.view.mas_height); }]; } -(nsarray *)loaddata { // 根据图片数量开辟对应大小的空间 nsmutablearray *arrm = [nsmutablearray arraywithcapacity:xtximagecount]; // 读取图片名字 for (nsinteger i = 1; i <=xtximagecount; i++) { nsstring *imagename = [nsstring stringwithformat:@"common_h%zd.jpg",i]; [arrm addobject:imagename]; } return arrm; } -(void)addguideview { // 创建自定义界面,并同时创建滚动视图 // self = guide view controller xtxguideview *guideview = [[xtxguideview alloc]initwithframe:self.view.bounds]; // 此处暂未使用数据模型保存数据 guideview.imagename = [self loaddata]; [self.view addsubview:guideview]; } @end
// xtxguideview.h // 新特性界面 // // copyright ? 2016年 longchuang. all rights reserved. // #import @interface xtxguideview : uiview // 用于接收控制界面传过来的数据 @property(nonatomic,strong)nsarray *imagename; @end
// // xtxguideview.m // 新特性界面 // // copyright ? 2016年 longchuang. all rights reserved. // #import "xtxguideview.h" #import "masonry.h" @interface xtxguideview() // 滚动视图 @property(nonatomic,weak)uiscrollview *scrollview; // 翻页控制器 @property(nonatomic,weak)uipagecontrol *pagecontrol; @end @implementation xtxguideview // 创建自定义view视图的时候,同时创建scrollview -(instancetype)initwithframe:(cgrect)frame { self = [super initwithframe:frame]; if (self) { [self setupui]; } return self; } -(void)setupui { uiscrollview *scrollview = [[uiscrollview alloc]initwithframe:self.bounds]; [self addsubview:scrollview]; self.scrollview = scrollview; // 隐藏两个滑动条 scrollview.showsverticalscrollindicator = no; scrollview.showshorizontalscrollindicator = no; // 设置分页 scrollview.pagingenabled = yes; // 关闭弹簧效果 scrollview.bounces =yes; // 设置scrollview代理 scrollview.delegate = self; // 创建分页指示器 uipagecontrol *pagecontrol = [[uipagecontrol alloc]init]; // 给属性赋值 self.pagecontrol = pagecontrol; // 设置当前页 pagecontrol.currentpage = 0; // 设置其他页的颜色 pagecontrol.pageindicatortintcolor = [uicolor blackcolor]; // 设置当前页的颜色 pagecontrol.currentpageindicatortintcolor = [uicolor yellowcolor]; // 把分页指示器添加到自定义视图上不要加在scrollview上 [self addsubview:pagecontrol]; // 设置分页指示器的偏移 [pagecontrol mas_makeconstraints:^(masconstraintmaker *make) { // 设置x与父物体x对齐 [make centerx]; // 下部向上偏移20 make.bottom.offset(-20); }]; // 设置分页指示器不能点击 pagecontrol.enabled = no; } // 控制器视图中通过model层的保存的数据给view层赋值的时候,调用改set方法 -(void)setimagename:(nsarray *)imagename { _imagename = imagename; for (nsinteger i = 0 ; i < imagename.count; i++) { uiimageview *imageview = [[uiimageview alloc]init]; // uiimageview的图片以及大小 imageview.frame = cgrectoffset(self.bounds, i*self.bounds.size.width, 0); imageview.image = [uiimage imagenamed:imagename[i]]; [self.scrollview addsubview:imageview]; // 开启交互 imageview.userinteractionenabled = yes; // 添加按钮 [self makeloadmorebtn:imageview]; } // 多出一页,用于显示主页面,为其增加可滑动的条件 self.scrollview.contentsize = cgsizemake((imagename.count + 1) * self.bounds.size.width, 0); // 三 设置分页指示器的总个数 self.pagecontrol.numberofpages = imagename.count; } // 添加按钮 - (void)makeloadmorebtn:(uiimageview *)imageview { // 1.创建按钮 uibutton *loadmorebtn = [[uibutton alloc] init]; // 2.设置图片 [loadmorebtn setimage:[uiimage imagenamed:@"common_more_black"] forstate:uicontrolstatenormal]; [loadmorebtn setimage:[uiimage imagenamed:@"common_more_white"] forstate:uicontrolstatehighlighted]; // 3.添加到父控件上 [imageview addsubview:loadmorebtn]; // 让按钮的尺寸根据图片的大小自适应 [loadmorebtn sizetofit]; // 4.给加载更多按钮添加约束 [loadmorebtn mas_makeconstraints:^(masconstraintmaker *make) { make.right.offset(-20); make.bottom.offset(-50); }]; // 5.给加载更多按钮添加监听事件 [loadmorebtn addtarget:self action:@selector(loadmorebtnclick:) forcontrolevents:uicontroleventtouchupinside]; } #pragma mark - 加载更多按钮监听方法 - (void)loadmorebtnclick:(uibutton *)btn { // 1.把当前被点击的加载更多按钮隐藏 btn.hidden = yes; // 2.动画的方式让imageview放大及完全透明 [uiview animatewithduration:0.2 animations:^{ // 让按钮的父控件,也就当前点击的按钮所在的imageview放大 btn.superview.transform = cgaffinetransformmakescale(2, 2); // 让imageview透明 btn.superview.alpha = 0; } completion:^(bool finished) { // 让新特性界面自定义视图直接从父控件上移除 // 3.动画完成之后把自定义的新特性view直接从父控件中移除 [self removefromsuperview]; }]; } #pragma mark - uiscrollviewdelegate // 正在滚动中一直会调用此方法 - (void)scrollviewdidscroll:(uiscrollview *)scrollview { cgfloat page = scrollview.contentoffset.x / scrollview.bounds.size.width; // 当新的一页已经出来一大半就让分页指示器显示到新的一页 nsinteger pageno = page + 0.4999; self.pagecontrol.currentpage = pageno; // 把当前的页数设置给scrollview的tag scrollview.tag = pageno; self.pagecontrol.hidden = (pageno == _imagename.count); } #pragma mark - 手动拖拽并且有降速过程,降速完成之后就会来调用此方法 - (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview { // 如果滚动到最后一页并停在了空白的这一页上时,把自定义新特性界面移除 if (scrollview.tag == _imagename.count) { [self removefromsuperview]; } } @end