您的位置:首页 > 移动开发 > IOS开发

ios中新特性和跳转主控制器

2016-03-10 23:34 375 查看

一. 新特性概念

概念:当一个APP刚被下载并且开始使用的时候,进入界面的UICollectionViewController.用户需要滑动页面,然后才能进入主页面.但是当用户将APP删除后,在次下载该应用也需要经过该过程.同时,每次只要更新了版本,都会经过该过程,这就是新特性.

APP功能图:



二. UICollectionView

1. 继承:为什么UICollectionViewController会有这样的功能呢?这里主要是因为这种控制器中有一个继承于UIScrollView的属性,那么既然是继承,也就拥有了其父类的所有特性了.

2. 流水布局:所谓流水布局,就是按照从上到下的顺序依次的排在后面,一行排满就跳到下一行.加在UICollectionView上面的cell,必须要流水布局.

三. 代码

1.由于系统的UICollectionViewController控制器并不能满足要求,我们自定义控制器和自定义cell



2. 设置根控制器

2.1 在AppDelegate.m的文件中将Appde 根控制器设置为自定义的XFNewFeatureCollectionViewController控制器,控制器继承于UICollectionViewController.

//创建新特性控制器
XFNewFeatureCollectionViewController *collection = [[XFNewFeatureCollectionViewController alloc] init];
//设置根控制器
self.window.rootViewController = collection;


3. 代码跳转

3.1 当外界init创建XFNewFeatureCollectionViewControlle对象的时候会直接调用下面代码—–流水布局

- (instancetype)init
{
//流水布局
UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
//高度和宽度
flow.itemSize = CGSizeMake([UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height);
//行
flow.minimumLineSpacing = 0;
//垂直
flow.minimumInteritemSpacing = 0;

//设置滚动方法
flow.scrollDirection = UICollectionViewScrollDirectionHorizontal;

return [super initWithCollectionViewLayout:flow];

}


4. 布局子控件:

当view加载完毕的时候调用:对每个cell的背景文字;cell中间的曲线;滑动时候从右向左的动图

#pragma mark - 布局子控件
- (void)setUp
{
//guideLargeText1---->大字体
UIImageView *imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"guideLargeText1"]];
//位置
imageView2.center = CGPointMake(self.view.width * 0.5, self.view.height * 0.7);
self.imageView2 = imageView2;
//添加
[self.collectionView addSubview:imageView2];

//guideSmallText1---->小字体
UIImageView *imageViwe3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"guideSmallText1"]];
imageViwe3.center = CGPointMake(self.view.width * 0.5, self.view.height * 0.75);
self.imageView3 = imageViwe3;
[self.collectionView addSubview:imageViwe3];

//guide1---->滑动cell的时候,从右向左的动图
UIImageView *imageView4 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"guide1"]];
imageView4.x += 50;
self.imageView = imageView4;
NSLog(@"%f",imageView4.x);
[self.collectionView addSubview:imageView4];

//guideLine---->处在每个cell中间的曲线
UIImageView *imageView1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"guideLine"]];
//设置尺寸
imageView1.x -= 150;
//添加到conllectionView中
[self.collectionView addSubview:imageView1];

}


5. 数据源方法:

5.1 组数:

//有多少组
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}


5.2 每组的个数

//每组有多少个---->XFCount代表宏,个数为4
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return XFCount;
}


5.3 注册cell(注意cell必须采用注册的方法,传统的方法不行)

- (void)viewDidLoad {
[super viewDidLoad];

//注册
[self.collectionView registerClass:[XFNewFeatureCell class] forCellWithReuseIdentifier:reuseIdentifier];

//取消弹簧效果
self.collectionView.bounces = NO;
//开启分页功能
self.collectionView.pagingEnabled = YES;

//布局子控件
[self setUp];
}


5.3.1 每个cell的内容

//每个cell的内容是什么
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
XFNewFeatureCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
//设置背景cell的背景图片
cell.image = [UIImage imageNamed:[NSString stringWithFormat:@"guide%ldBackground568h",indexPath.item + 1]];

[cell setStartBtnHidden:indexPath count:XFCount];

//NSLog(@"%ld",indexPath.item);
;
return cell;
}


6. 在自定义的cell中设置属性,并且重写该属性的set方法

6.1 在5.3.1中cell.image调用了set方法,我们就用这个特性设置背景图片的值

//设置XFNewFeatureCell中的cell的背景图片
-(void)setImage:(UIImage *)image
{
_image = image;
self.imageView.image = image;
}


6.2 在6.1中self.imageView调用了imageView的get方法,我们也利用这特性懒加载背景图片的创建对象

#pragma makr - 懒加载
//需要时候再加载
- (UIImageView *)imageView
{
if (_imageView == nil) {
UIImageView *imageView = [[UIImageView alloc] init];
//设置背景图片的尺寸
imageView.frame = self.bounds;
//注意千万不能写成[self addSubview:imageView];
[self.contentView addSubview:imageView];
//赋值
_imageView = imageView;
}
return _imageView;
}


四. 动画

1.动画产生:由APP不难看出,当用户向右手边滑动的时候,会有一个从右向左的图片出现,这就是动画

2. 动画实现原理:我们将动画的图片的x值设为两倍的屏幕的宽度,当用户滑动的时候,就让总x值减去一个屏幕的宽度,这样就能形成图片从右边滑动到左边了.

2.1 当滑动开始减速的时候调用

#pragma mark - 设置往左侧滑动,描述的图片从右侧滚动
//当滑动开始减速的时候调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat offsetX = scrollView.contentOffset.x - self.preOffsetX;

self.preOffsetX = scrollView.contentOffset.x;
self.imageView.x += 2 * offsetX;
self.imageView2.x += 2 * offsetX;
self.imageView3.x += 2 * offsetX;
//动画
[UIView animateWithDuration:0.3 animations:^{

self.imageView.x -= offsetX;
self.imageView2.x -= offsetX;
self.imageView3.x -= offsetX;
}];

//计算当前是第几页
NSInteger page = scrollView.contentOffset.x / self.collectionView.width;
//曲线
self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"guide%ld",page + 1]];
//大字体
self.imageView2.image = [UIImage imageNamed:[NSString stringWithFormat:@"guideLargeText%ld",page + 1]];
//小字体
self.imageView3.image = [UIImage imageNamed:[NSString stringWithFormat:@"guideSmallText%ld",page + 1]];
}


五. 开始体验按钮

1. 在cell中提供一个方法.在设置cell的内容的方法中,将cell的角标,开始体验按钮出现在哪个cell中,将参数传入定义的方法中

1.1 cell中定义的方法实现

//控制体验按钮出现的位置
- (void)setStartBtnHidden:(NSIndexPath *)indexPath count:(NSInteger)count
{
if (indexPath.item == count - 1) {
//是否显示开始体验按钮
self.startBtn.hidden = NO;
}else{
//是否隐藏开始体验按钮
self.startBtn.hidden = YES;
}
}


1.2 设置每个cell中的内容中调用该方法,将参数传入1.1代码中

//将参数传入方法中
[cell setStartBtnHidden:indexPath count:XFCount];


2. 懒加载创建开始体验按钮

#pragma mark - 懒加载开始体验按钮
- (UIButton *)startBtn
{
if (_startBtn == nil) {

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"guideStart"] forState:UIControlStateNormal];
btn.center = CGPointMake(self.width * 0.3, self.height * 0.8);
NSLog(@"---------%@",NSStringFromCGPoint(btn.center));
//按钮尺寸
[btn sizeToFit];

//将按钮加入到contentView中
[self.contentView addSubview:btn];

self.startBtn = btn;

//监听开始体验按钮---->跳转控制器
[btn addTarget:self action:@selector(staartBtnClick) forControlEvents:UIControlEventTouchUpInside];

}
return _startBtn;
}


六. 控制器的切换

1. 在上面懒加载开始体验按钮中,后面写了一段监听按钮的代码,就是用来跳转主控制器的

#pragma mark - 实现监听方法
- (void)staartBtnClick
{
XFTabBarController *tabBarController = [[XFTabBarController alloc] init];

//获取窗口,然后设置要跳转的控制器
[UIApplication sharedApplication].keyWindow.rootViewController = tabBarController;
}


七. 根据版本对比设置新特性是否隐藏和出现

//获取以前的版本号
NSString *preV = [[NSUserDefaults standardUserDefaults] objectForKey:XFCurVersion];

//获取当前的版本号
//具体方式:右击info.plist文件-->open As-->Souce code找到当前版本
NSString *curV = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];
//判断
if ([preV isEqualToString:curV]){

XFTabBarController *tabBarController = [[XFTabBarController alloc] init];
self.window.rootViewController = tabBarController;

}else{
//创建新特性控制器
XFNewFeatureCollectionViewController *collection = [[XFNewFeatureCollectionViewController alloc] init];

self.window.rootViewController = collection;

//根据key获取以前的版本号
[[NSUserDefaults standardUserDefaults] setObject:curV forKey:XFCurVersion];

}


上面代码说明:由于每次APP的版本更新,新特性都需要出现,那么我们是怎么判断版本不同而决定是出现主界面还是新特性界面呢,那么就需啊哟上面的代码作为判断了.

八.注意

1.由于在UIScrollView中规定有一个装控件的容器—–contentView,很多初学者会吧控件直接加在cell当中,有可能刚开始不会有问题,但是在后面再加入控件的时候,有控件会显示不出来,这就是因为控件加错容器了.contentView本来就是用来装子控件的容器.所以要特别注意.

九. 结束语

1. 大家要是还有什么注意点,麻烦大家互相分享,万分感谢!!!!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: