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

一. 新特性概念

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

该APP动态图就是新特性界面

二. UICollectionView

1. 继承:为什么UICollectionViewController会有这样的功能呢?这里主要是因为这种控制器中有一个继承于UIScrollView的属性,那么既然是继承,也就拥有了其父类的所有特性了.
2. 流水布局:所谓流水布局,就是按照从上到下的顺序依次的排在后面,一行排满就跳到下一行.加在UICollectionView上面的cell,必须要流水布局.

三. 代码

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

自定义控制器和自定义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. 大家要是还有什么注意点,麻烦大家互相分享,万分感谢!!!!!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS的导航控制器(UINavigationController)是一种视图控制器容器,用于管理应用程序的多个视图控制器。它是一种实现iOS视图控制器之间导航的常用方式,可以使用它来管理应用程序的层级结构。 导航控制器的工作原理如下: 1. 创建导航控制器应用程序创建一个导航控制器,然后将第一个视图控制器添加到该导航控制器。 ``` let navController = UINavigationController(rootViewController: firstViewController) ``` 2. 添加视图控制器 使用以下方法将要显示的视图控制器添加到导航控制器。 ``` navController.pushViewController(secondViewController, animated: true) ``` 3. 返回视图控制器 使用以下方法将当前显示的视图控制器返回到导航控制器的上一个视图控制器。 ``` navController.popViewController(animated: true) ``` 举例来说,假设我们有一个简单的应用程序,它有三个视图控制器:`ViewController1`,`ViewController2`和`ViewController3`。我们通过以下代码创建一个导航控制器,并将`ViewController1`添加为第一个视图控制器: ``` let navController = UINavigationController(rootViewController: ViewController1()) ``` 当用户在`ViewController1`点击按钮时,我们将跳转到`ViewController2`。我们可以使用以下代码将`ViewController2`添加到导航控制器: ``` navController.pushViewController(ViewController2(), animated: true) ``` 当用户在`ViewController2`点击返回按钮时,我们将返回到`ViewController1`。我们可以使用以下代码将当前显示的视图控制器返回到导航控制器的上一个视图控制器: ``` navController.popViewController(animated: true) ``` 当用户在`ViewController2`点击另一个按钮时,我们将跳转到`ViewController3`。我们可以使用以下代码将`ViewController3`添加到导航控制器: ``` navController.pushViewController(ViewController3(), animated: true) ``` 这就是导航控制器的基本工作原理和用法。它可以使我们方便地管理应用程序的视图控制器层级结构,并实现视图控制器之间的导航。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值