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