iOS开发之路--微博新特性页面
程序员文章站
2022-03-08 16:24:16
beyondappdelegate.m
//
// beyondappdelegate.m
// 20_帅哥no微博
//
// created by b...
beyondappdelegate.m
// // beyondappdelegate.m // 20_帅哥no微博 // // created by beyond on 14-8-3. // copyright (c) 2014年 com.beyond. all rights reserved. // #import "beyondappdelegate.h" #import "beyondviewcontroller.h" #import "newfeatureviewcontroller.h" #import "oauthviewcontroller.h" #define kversioncodekey (nsstring *)kcfbundleversionkey @implementation beyondappdelegate // 应用最先执行的方法 - (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions { // 1,创建窗口 self.window = [[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]]; // 2,设置窗口的背景色 self.window.backgroundcolor = [uicolor whitecolor]; // 3,调用自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了newfeature控制器,否则 就直接让主控制器成为了窗口的根控制器 [self versioncodecheck]; // 4,让窗口可见 [self.window makekeyandvisible]; return yes; } // 自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了newfeature控制器,否则 就直接让主控制器成为了窗口的根控制器 - (void)versioncodecheck { // 1,使用用户偏好,从沙盒中取出旧的版本号 nsstring *oldversioncode = [[nsuserdefaults standarduserdefaults] objectforkey:kversioncodekey]; nsstring *currentversioncode = [[[nsbundle mainbundle]infodictionary] objectforkey:kversioncodekey]; // 根据版本号的比较结果 进入不同的控制器 //[self stepintoviewcontroller:currentversioncode oldversion:oldversioncode]; //return; #warning block test -===============以下内容,和其中调用的方法,仅用于block调用测试 if ([currentversioncode isequaltostring:oldversioncode]) { //if(0){ [self enterbeyondvc]; } else { // 关键 ,并且保存版本号 [[nsuserdefaults standarduserdefaults]setobject:currentversioncode forkey:kversioncodekey]; // 进入新特性控制器 newfeatureviewcontroller *newvc = [[newfeatureviewcontroller alloc]init]; newvc.startblock = ^(bool isselected){ log(@"%d",isselected); [self enterbeyondvc]; }; self.window.rootviewcontroller = newvc; } } #warning block test - (void) enterbeyondvc { // 1,如果进行过oauth授权,则直接进入主控制器,否则 进行oauth授权控制器 if (1) { oauthviewcontroller *oauthvc = [[oauthviewcontroller alloc]init]; self.window.rootviewcontroller = oauthvc; return; } // 进入主控制器 beyondviewcontroller *vc =[[beyondviewcontroller alloc]init]; self.window.rootviewcontroller = vc; } - (void)stepintoviewcontroller:(nsstring *)curversion oldversion:(nsstring *)oldversion { // 比较新旧版本号 uiviewcontroller *rootviewcontroller = nil; #warning 测试新特性的view if ([curversion isequaltostring:oldversion]) { // if (0){ // 说明不是第一次运行,直接实例化主控制器,将主控制器设置为窗口的根控制器 // 进入主控制器(主界面之前 先把状态栏,恢复) ios 7 无效 // [[uiapplication sharedapplication] setstatusbarhidden:no withanimation:uistatusbaranimationfade]; rootviewcontroller = [[beyondviewcontroller alloc]init]; } else { // 说明是第一次运行,进入新特性控制器,将新特性控制器设置为窗口的根控制器,并且保存版本号 // 进入新特性控制器(新特性界面之前 先把状态栏,隐藏) ios 7 无效 // [uiapplication sharedapplication].statusbarhidden = yes; // [[uiapplication sharedapplication]setstatusbarhidden:yes withanimation:uistatusbaranimationslide]; rootviewcontroller = [[newfeatureviewcontroller alloc]init]; // 关键 ,并且保存版本号 [[nsuserdefaults standarduserdefaults]setobject:curversion forkey:kversioncodekey]; } // 设置窗口的根控制器,为相应的控制器 self.window.rootviewcontroller = rootviewcontroller; } @end
newfeatureviewcontroller.h
// // newfeatureviewcontroller.h // 20_帅哥no微博 // // created by beyond on 14-8-3. // copyright (c) 2014年 com.beyond. all rights reserved. // 只使用一次,版本新特性控制器,在第一次运行本版本时启用 #import <uikit/uikit.h> @interface newfeatureviewcontroller : uiviewcontroller // 定义一个block作为成员变量,点击开始按钮时,初始化主控制器,让其成为窗口的根控制器 // block用copy @property (nonatomic,copy) void(^startblock)(bool isshare); @end
newfeatureviewcontroller.m
// // newfeatureviewcontroller.m // 20_帅哥no微博 // // created by beyond on 14-8-3. // copyright (c) 2014年 com.beyond. all rights reserved. // 只使用一次,版本新特性控制器,在第一次运行本版本时启用 /* 写在前面: 当一个控件不显示 的时候,检查下面三个属性: 没有宽度和高度 x y 坐标不正确 没有添加到父控件中 当一个控制不能点击的时候,检查下面个属性: 自己的userinteraction = no 父控件的userinteraction = no 控件本身已经超出了它所在的控制器范围 pagecontroller的高度不能更改,那么就可以置高度为0,其他控件同理 4,居中显示 的标准步骤:先设置center,再设置bounds 5,切换按钮图片可以通过切换按钮的状态来完成 normal:普通 highlighted : 高亮(人为长按的时候) disabled :失效(通过代码控制) selected : 选中 (通过代码控制) */ #import "newfeatureviewcontroller.h" #define kpicnum 4 #warning viewsize 要改成kwinsize #define viewsize self.view.bounds.size @interface newfeatureviewcontroller ()<uiscrollviewdelegate> { // 页面指示控制器 uipagecontrol *_pagecontrol; // 因为开启按钮的点击事件中需要分享按钮的选中状态 uibutton *_sharebtn; } @end @implementation newfeatureviewcontroller - (bool)prefersstatusbarhidden { // 在loadview之前 还要先 nslog(@"prefers bar hidden"); return yes; } - (void)loadview { nslog(@"load view"); // 新特性,让imageview成为控制器的view,然后才再imageview上面添加一层scrollview uiimageview *imgview = [[uiimageview alloc]init]; // 设置控制器view(即imgview)的尺寸为全屏 imgview.frame = [uiscreen mainscreen].bounds; nslog(@"%@",nsstringfromcgrect(imgview.frame)); // 使用分类中的方法,如果是iphone5,加载 -568h的图片 imgview.image = [uiimage fullscrennimagenamed:@"new_feature_background.png"]; // 让控制器的view可以与用户交互 imgview.userinteractionenabled = yes; // 直接让imgeview成为控制器的view self.view = imgview; } - (void)viewdidload { [super viewdidload]; nslog(@"view did load "); // 1,调用自定义方法,加载uiscrollview,并且批量添加uiimageview,每个imageview中放一张图片 [self adduiscrollview]; // 2,调用自定义方法,加载uipagecontrol [self adduipagecontrol]; } // 自定义方法,加载uiscrollview,并且批量添加uiimageview,每个imageview中放一张图片 - (void) adduiscrollview { // 1.加载uiscrollview,并且批量添加uiimageview,每个imageview中放一张图片 uiscrollview *scrollview = [[uiscrollview alloc] init]; // 显示的可视区域大小 scrollview.frame = self.view.bounds; // 水平滚动条 scrollview.showshorizontalscrollindicator = no; // 按可视区域进行分页 scrollview.pagingenabled = yes; // 滚动的范围 scrollview.contentsize = cgsizemake(kpicnum * viewsize.width, 0); // 代理 可以监听滚动的各类事件 scrollview.delegate = self; // 添加到self.view即imageview [self.view addsubview:scrollview]; // 2,根据索引添加kpicnum张图片排列而成的kpicnum个imageview到scrollview里面 for (int i = 0; i<kpicnum; i++) { [self addimageviewtoscrollview:scrollview atindex:i]; } } // 自定义方法,加载uipagecontrol - (void) adduipagecontrol { // 1,加载uipagecontrol _pagecontrol = [[uipagecontrol alloc] init]; // 居中最好是先设置center,再设置bounds _pagecontrol.center = cgpointmake(viewsize.width * 0.5, viewsize.height * 0.95); _pagecontrol.bounds = cgrectmake(0, 0, 100, 0); // 设置总页数 _pagecontrol.numberofpages = kpicnum; // 重点~从图片中加载颜色 默认颜色和当前页的颜色 _pagecontrol.pageindicatortintcolor = [uicolor colorwithpatternimage:[uiimage imagenamed:@"new_feature_pagecontrol_point.png"]]; _pagecontrol.currentpageindicatortintcolor = [uicolor colorwithpatternimage:[uiimage imagenamed:@"new_feature_pagecontrol_checked_point.png"]]; // 禁止默认的交互事件 _pagecontrol.userinteractionenabled = no; // 添加到self.view即imageview [self.view addsubview:_pagecontrol]; } // scrollview的代理方法,用于动态控制pagecontrol的当前圆点,滚动减速完毕就会调用(即scrollview静止) - (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview { // 当前的第几页就是偏移的x除以单张宽度 _pagecontrol.currentpage = scrollview.contentoffset.x / scrollview.frame.size.width; } // 自定义方法,根据索引添加kpicnum张图片排列而成的kpicnum个imageview到scrollview里面 - (void)addimageviewtoscrollview:(uiscrollview *)scrollview atindex:(int)i { // 1.创建imageview uiimageview *imageview = [[uiimageview alloc] init]; // 因为是一张张水平排列,所以根据索引计算 frame ,通过结构体必须强转为cgrect imageview.frame = (cgrect){{i * viewsize.width, 0} , viewsize}; // 2.设置图片 nsstring *name = [nsstring stringwithformat:@"new_feature_%d.png", i + 1]; // 使用分类中的方法,如果是iphone5,加载 -568h的图片 imageview.image = [uiimage fullscrennimagenamed:name]; // 3.添加 [scrollview addsubview:imageview]; // 4.如果是最后一张图片,添加2个按钮(分享、开始) if (i == kpicnum - 1) { // 必须让最后一张imageview可以进行点击,这样它里面的2个按钮才可以点击 imageview.userinteractionenabled = yes; // 最后一张图片页面,有两个按钮,一个是开始 [self addstartbtninimageview:imageview]; // 最后一张图片页面,有两个按钮,另一个是分享微博按钮,默认是选中状态 [self addsharebtninimageview:imageview]; } } // 最后一张图片页面,有两个按钮,一个是分享 - (void) addsharebtninimageview:(uiimageview *)imageview { // 2.1.创建自定义样式的按钮 _sharebtn = [uibutton buttonwithtype:uibuttontypecustom]; // 添加到最后一张imageview里面 [imageview addsubview:_sharebtn]; // 2.2.设置按钮背景图片 // 调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回 图片的尺寸 cgsize sharebtnnormalbgimgsize = [_sharebtn setbtnbgimgfornormalandselectedwithname:@"new_feature_share_false.png" selectedname:@"new_feature_share_true.png"]; // 2.3.边框(居中,先center,后bounds) _sharebtn.center = cgpointmake(viewsize.width * 0.5, viewsize.height * 0.75); // 按钮宽高,就按背景图片宽高 _sharebtn.bounds = (cgrect){cgpointzero, sharebtnnormalbgimgsize}; // 2.4.监听 [_sharebtn addtarget:self action:@selector(sharebtnclick:) forcontrolevents:uicontroleventtouchupinside]; // 2.5.高亮状态下不要改变图片颜色 _sharebtn.adjustsimagewhenhighlighted = no; // 2.6.默认选中 _sharebtn.selected = yes; } // 分享按钮点击事件,只要切换不同的选中状态,就可以显示不同的两张图片(正常图片是不勾选,选中状态的图片是勾选) - (void)sharebtnclick:(uibutton *)sharebtn { sharebtn.selected = !sharebtn.isselected; } // 最后一张图片页面,有两个按钮,一个是开始 - (void) addstartbtninimageview:(uiimageview *)imageview { // 1.1.创建开启按钮 // 使用自定义样式 uibutton *startbtn = [uibutton buttonwithtype:uibuttontypecustom]; // 添加到最后一张imageview里面 [imageview addsubview:startbtn]; // 1.2.设置背景图片等个性样式 // 调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回 图片的尺寸 cgsize startbtnbgimgsize = [startbtn setbtnbgimgfornormalandhighightedwithname:@"new_feature_finish_button.png"]; // 1.3.边框 startbtn.center = cgpointmake(viewsize.width * 0.5, viewsize.height * 0.85); // 按钮的宽高 与 背景图片的宽高一样大 startbtn.bounds = (cgrect){cgpointzero, startbtnbgimgsize}; // 1.4.监听 [startbtn addtarget:self action:@selector(startbtnclick) forcontrolevents:uicontroleventtouchupinside]; } // 点击开始按钮时,调用block完成,以下功能:初始化主控制器,让其成为窗口的根控制器 - (void)startbtnclick { // 直接调用block (即另外一个类里面的一段代码来执行) if (_startblock) { _startblock(_sharebtn.isselected); } } @end
上一篇: 浙江师范大学行知学院2022年在各个榜单中的排名情况
下一篇: PAT-1045 快速排序