iOS开发实用技巧篇—项目新特性页面的处理

说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理。

代码示例:

新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController。

头文件代码:

  1. //
  2. // JMNewfeatureViewController.h
  3. //
  4.  
  5. #import <UIKit/UIKit.h>
  6.  
  7. typedef enum:NSInteger
  8. {
  9. NewfeatureTypeFromeSetting, //从设置界面进入该页
  10. NewfeatureTypeFromeWelcom, //第一次安装的时候进入
  11. } NewfeatureType;
  12.  
  13. @interface JMNewfeatureViewController : UIViewController
  14.  
  15. @property(nonatomic,assign)NewfeatureType newfeatureType;
  16.  
  17. @end

.m文件代码:

  1. //
  2. // JMNewfeatureViewController.m
  3. //
  4.  
  5. #import "JMNewfeatureViewController.h"
  6. #import "JMTabBarViewController.h"
  7. #import "JMAboutTableViewController.h"
  8.  
  9. #define JMNewfeatureImageCount 4
  10.  
  11. @interface JMNewfeatureViewController () <UIScrollViewDelegate>
  12.  
  13. @property (nonatomic, weak) UIPageControl *pageControl;
  14.  
  15. - (void)setupScrollView;
  16. - (void)setupPageControl;
  17. - (void)setupLastImageView:(UIImageView *)imageView;
  18. - (void)setupStartButton:(UIImageView *)imageView;
  19.  
  20. @end
  21.  
  22. @implementation JMNewfeatureViewController
  23.  
  24. #pragma mark ---------------------
  25. #pragma mark - CycLife
  26.  
  27. - (void)viewDidLoad
  28. {
  29. [super viewDidLoad];
  30.  
  31. [UIApplication sharedApplication].statusBarHidden = YES;
  32.  
  33. [self setupScrollView]; // 添加UISrollView
  34. [self setupPageControl]; // 添加pageControl
  35. }
  36.  
  37. #pragma mark ---------------------
  38. #pragma mark - Methods
  39.  
  40. //添加UISrollView
  41. - (void)setupScrollView
  42. {
  43. // 添加UISrollView
  44. UIScrollView *scrollView = [[UIScrollView alloc] init];
  45. scrollView.frame = self.view.bounds;
  46. scrollView.bounces = NO;
  47. scrollView.delegate = self;
  48. [self.view addSubview:scrollView];
  49.  
  50. // 添加图片
  51. CGFloat imageW = scrollView.width;
  52. CGFloat imageH = scrollView.height;
  53. for (int i = ; i<JMNewfeatureImageCount; i++) {
  54. // 创建UIImageView
  55. UIImageView *imageView = [[UIImageView alloc] init];
  56. NSString *name = [NSString stringWithFormat:@"banner%d.jpg", i + ];
  57. imageView.image = [UIImage imageNamed:name];
  58. [scrollView addSubview:imageView];
  59.  
  60. // 设置frame
  61. imageView.y = ;
  62. imageView.width = imageW;
  63. imageView.height = imageH;
  64. imageView.x = i * imageW;
  65.  
  66. // 给最后一个imageView添加按钮
  67. if (i == JMNewfeatureImageCount - ) {
  68. [self setupLastImageView:imageView];
  69. }
  70. }
  71.  
  72. // 3.设置其他属性
  73. scrollView.contentSize = CGSizeMake(JMNewfeatureImageCount * imageW, );
  74. scrollView.pagingEnabled = YES;
  75. scrollView.showsHorizontalScrollIndicator = NO;
  76. scrollView.backgroundColor = YYColor(, , );
  77. }
  78.  
  79. //添加pageControl
  80. - (void)setupPageControl
  81. {
  82. // 添加PageControl
  83. UIPageControl *pageControl = [[UIPageControl alloc] init];
  84. pageControl.numberOfPages = JMNewfeatureImageCount;
  85. pageControl.centerX = self.view.width * 0.5;
  86. pageControl.centerY = self.view.height - ;
  87. [self.view addSubview:pageControl];
  88.  
  89. // 设置圆点的颜色
  90. self.pageControl = pageControl;
  91. [self changePageControlImage:self.pageControl];
  92. }
  93.  
  94. //设置最后一个UIImageView中的内容
  95. - (void)setupLastImageView:(UIImageView *)imageView
  96. {
  97. imageView.userInteractionEnabled = YES;
  98.  
  99. // 添加开始按钮
  100. [self setupStartButton:imageView];
  101. }
  102.  
  103. //添加开始按钮
  104. - (void)setupStartButton:(UIImageView *)imageView
  105. {
  106. // 1.添加开始按钮
  107. UIButton *startButton = [[UIButton alloc] init];
  108. imageView.userInteractionEnabled = YES;
  109. [imageView addSubview:startButton];
  110.  
  111. // 2.设置背景图片
  112. [startButton setBackgroundImage:[UIImage imageNamed:@"banner_button_moren.jpg"] forState:UIControlStateNormal];
  113. [startButton setBackgroundImage:[UIImage imageNamed:@"banner_button_dianji.jpg"] forState:UIControlStateHighlighted];
  114.  
  115. // 3.设置frame
  116. startButton.size = startButton.currentBackgroundImage.size;
  117. startButton.centerX = self.view.width * 0.5;
  118. startButton.centerY = self.view.height * 0.8;
  119.  
  120. // 4.设置文字
  121. [startButton setTitle:@"立即体验" forState:UIControlStateNormal];
  122. [startButton setTitle:@"" forState:UIControlStateHighlighted];
  123. [startButton addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
  124. }
  125.  
  126. //改变pagecontrol中圆点样式
  127. - (void)changePageControlImage:(UIPageControl *)pageControl
  128. {
  129. static UIImage *imgCurrent = nil;
  130. static UIImage *imgOther = nil;
  131. static dispatch_once_t onceToken;
  132.  
  133. dispatch_once(&onceToken, ^{
  134. imgCurrent = [UIImage imageNamed:@"yuan_01"];
  135. imgOther = [UIImage imageNamed:@"yuan1"];
  136. });
  137.  
  138. if (kSystemVersionMoreThan7) {
  139. [pageControl setValue:imgCurrent forKey:@"_currentPageImage"];
  140. [pageControl setValue:imgOther forKey:@"_pageImage"];
  141. } else {
  142. for (int i = ;i < pageControl.numberOfPages; i++) {
  143. UIImageView *imgv = [pageControl.subviews objectAtIndex:i];
  144. imgv.frame = CGRectMake(imgv.frame.origin.x, imgv.frame.origin.y, , );
  145. imgv.image = pageControl.currentPage == i ? imgCurrent : imgOther;
  146. }
  147. }
  148. }
  149.  
  150. #pragma mark ---------------------
  151. #pragma mark - Events
  152.  
  153. //立即体验
  154. - (void)start
  155. {
  156. [UIApplication sharedApplication].statusBarHidden = NO;
  157.  
  158. //判断类型
  159. if (self.newfeatureType == NewfeatureTypeFromeWelcom) {
  160. JMTabBarViewController *tabVC = [[JMTabBarViewController alloc]init];
  161. // 切换控制器
  162. UIWindow *window = [UIApplication sharedApplication].keyWindow;
  163. window.rootViewController = tabVC;
  164. }else
  165. {
  166.  
  167. [self.navigationController popViewControllerAnimated:YES];
  168. [self.navigationController setNavigationBarHidden:NO animated:NO];
  169. }
  170.  
  171. }
  172.  
  173. #pragma mark - UIScrollViewDelegate
  174. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  175. {
  176. // 获得页码
  177. CGFloat doublePage = scrollView.contentOffset.x / scrollView.width;
  178. int intPage = (int)(doublePage + 0.5);
  179.  
  180. // 设置页码
  181. self.pageControl.currentPage = intPage;
  182. [self changePageControlImage:self.pageControl];
  183. }
  184.  
  185. @end

注意点:

  下面的方法可以为pageControl提供当前状态和默认状态下的图片设置。

  1. //改变pagecontrol中圆点样式
  2. - (void)changePageControlImage:(UIPageControl *)pageControl
  3. {
  4. static UIImage *imgCurrent = nil;
  5. static UIImage *imgOther = nil;
  6. static dispatch_once_t onceToken;
  7.  
  8. dispatch_once(&onceToken, ^{
  9. imgCurrent = [UIImage imageNamed:@"yuan_01"];
  10. imgOther = [UIImage imageNamed:@"yuan1"];
  11. });
  12.  
  13. if (kSystemVersionMoreThan7) {
  14. [pageControl setValue:imgCurrent forKey:@"_currentPageImage"];
  15. [pageControl setValue:imgOther forKey:@"_pageImage"];
  16. } else {
  17. for (int i = ;i < pageControl.numberOfPages; i++) {
  18. UIImageView *imgv = [pageControl.subviews objectAtIndex:i];
  19. imgv.frame = CGRectMake(imgv.frame.origin.x, imgv.frame.origin.y, , );
  20. imgv.image = pageControl.currentPage == i ? imgCurrent : imgOther;
  21. }
  22. }
  23. }

本例中,新特性部分的业务逻辑非常简单,可以直接套用。

实用图片替换pageControl的效果如下:

  

iOS开发实用技巧—项目新特性页面的处理的更多相关文章

  1. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  2. iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示

    iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端.  打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面.   ...

  3. iOS中的项目新特性页面的处理

    一般项目中都会出现新特性页面,比如第一次使用应用的时候,或者在应用设置里查看新特性的时候会出现. 这里,选择新建一个专门处理项目新特性的控制器,来完成功能. 首先是 NewFeaturesViewCo ...

  4. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  5. iOS开发小技巧 - runtime适配字体

    iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...

  6. 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  7. iOS开发小技巧 - UILabel添加中划线

    iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...

  8. iOS开发--常用技巧 (MJRefresh详解)

         iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...

  9. 基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

随机推荐

  1. Winform中DockPanel(引用WeifenLuo.WinFormsUI.Docking.dll组件)的使用

    WeiFenLuo.WinFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可实现像Visual Studio的窗口停靠.拖拽等功能.WeifenLuo.Win ...

  2. Ubuntu 12.04(32位)安装Oracle 11g(32位)

    安装过程(主要过程就直接copy别人的教程了)及问题: 1.将系统更新到最新: sudo apt-get updatesudo apt-get dist-upgrade 2. 如果使用的Ubuntu不 ...

  3. [php-src]一个Php扩展的结构

    内容均以php5.6.14为例. 要拥有一个PHP扩展的架子,使用源码中准备好的 /ext/ext_skel 工具,可以生成一个可运行的扩展骨架. 不加选项运行 ./ext_skel,可查看所有可用选 ...

  4. Java 第四章 选择结构2

    第四章 选择结构 (二) switch 选择结构的执行流程是怎样的? switch 选择结构中break关键字的作用? 本章目标 掌握 switch 选择结构 能够综合运用 if 选择结构 和 swi ...

  5. 关系型数据库与NOSQL(转)

    出处:http://www.cnblogs.com/chay1227/archive/2013/03/17/2964020.html 关系型数据库把所有的数据都通过行和列的二元表现形式表示出来. 关系 ...

  6. Jetty入门

    Jetty的入门 一.开发环境 Eclipse  4.3.1 Maven  3.1 Jetty  9.0.6.v20130930 Jetty的下载地址: http://download.eclipse ...

  7. Java方法的封装

    类的封装性即不能让外面的类随意修改一个类的成员变量: 在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调 ...

  8. andriod终端操作命令

    1.卸载大厅安装包,如果卸载不掉的话,添加-r pm uninstall -r com.scigames.egm.lobby 2.查找包含"scigames"的安装包 3.卸载一个 ...

  9. Shiro-多Realm验证

    1.多Realm验证 存在这样一种场景,同一个密码可能在MqSQL中存储,也可能在Oracle中存储,有可能MqSQL中使用的是MD5加密算法,而Oracle使用SHA1加密算法.这就需要有多个Rea ...

  10. EF(Entity Framework)多对多关系下用LINQ实现"NOT IN"查询

    这是今天在实际开发中遇到的一个问题,需求是查询未分类的博文列表(未加入任何分类的博文),之前是通过存储过程实现的,今天用EF实现了,在这篇博文中记录一下. 博文的实体类BlogPost是这样定义的: ...