猫猫学iOS 之微博项目实战程序启动新特性用UICollectionViewController实现
Posted jzdwajue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猫猫学iOS 之微博项目实战程序启动新特性用UICollectionViewController实现相关的知识,希望对你有一定的参考价值。
猫猫分享。必须精品
原创文章。欢迎转载。转载请注明:翟乃玉的博客
地址:http://blog.csdn.net/u013357243
一:效果
这里实现了大多数app都会有的软件新特性的功能,用的是UICollectionViewController实现的
二:思路
这里用了UICollectionViewController实现,就是做一个没有间隙,每一个cell都是一个屏幕的UICollectionViewController,自己定义的。
然后把以下的UIPageControl 还有最后一页的開始以及分享button放入就OK了。
调用的时候。首先获取当前的app的版本号号。然后再获取上一个版本号。
进行两个版本号的比較。
当前版本号和上一个版本号不同。当前版本号是从infoDictionary中拿到的,上一个版本号是从自己存的NSUserDefaults 中的NYVersionKey拿到的,而且苹果同意上传小于当前版本号的app。假设是第一个版本号时候。上一个版本号还没有值,也会不同。
依据结果设置window的不同根控制器。
自己定义UICollectionViewController步骤:
要注意:
1.初始化的时候设置布局參数
2.collertionView必须注冊cell
3.自己定义cell
三:代码
调用部分代码:AppDelegate
//1,获取当前的版本号号
NSString *currentVersion = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
//2。获取上一次的版本号号
NSString *lastVersion = [[NSUserDefaults standardUserDefaults]objectForKey:NYVersionKey];
NYLog(@"currentVersion == %@ , lastVersion == %@ ",currentVersion, lastVersion);
//推断是否有新的版本号
if ([currentVersion isEqualToString:lastVersion]) {
//假设没有新的版本号(当前版本号和上一个版本号不同,当前版本号是从infoDictionary中拿到的,上一个版本号是从自己存的NSUserDefaults 中的NYVersionKey拿到的,而且苹果同意上传小于当前版本号的app,假设是第一个版本号时候,上一个版本号还没有值,也会不同。)
//创建tabBarVC
NYTabBarController *tabBarVC = [[NYTabBarController alloc]init];
//设置窗体跟控制器
self.window.rootViewController = tabBarVC;
}else{//假设有新的版本号
//进入新特性界面
NYNewFeatureController *newFeatureVC = [[NYNewFeatureController alloc]init];
newFeatureVC.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = newFeatureVC;
//用偏好设置,保存当前版本号。
[[NSUserDefaults standardUserDefaults]setObject:currentVersion forKey:NYVersionKey];
}
自己定义的collectionViewController
NYNewFeatureController.m
//
// NYNewFeatureController.m
// 猫猫微博
//
// Created by apple on 15-8-1.
// Copyright (c) 2015年 znycat. All rights reserved.
//
#import "NYNewFeatureController.h"
#import "NYNewFeatureCell.h"
@interface NYNewFeatureController ()
@property (nonatomic, weak) UIPageControl *control;
@end
@implementation NYNewFeatureController
static NSString * const reuseIdentifier = @"cell";
- (void)viewDidLoad {
[super viewDidLoad];
//注冊cell。默认就会创建这个类型的cell
[self.collectionView registerClass:[NYNewFeatureCell class] forCellWithReuseIdentifier:reuseIdentifier];
//分页
self.collectionView.pagingEnabled = YES;
//取消弹簧效果
self.collectionView.bounces = NO;
//不显示滚动栏
self.collectionView.showsHorizontalScrollIndicator = NO;
// 加入pageController
[self setUpPageControl];
// Do any additional setup after loading the view.
}
// 加入pageController
- (void)setUpPageControl
{
// 加入pageController,仅仅须要设置位置。不须要管理尺寸
UIPageControl *control = [[UIPageControl alloc] init];
control.numberOfPages = 4;
control.pageIndicatorTintColor = [UIColor blackColor];
control.currentPageIndicatorTintColor = [UIColor redColor];
// 设置center
control.center = CGPointMake(self.view.width * 0.5, self.view.height);
_control = control;
[self.view addSubview:control];
}
/*使用UICollectionViewController要注意:
1.初始化的时候设置布局參数
2.collertionView必须注冊cell
3.自己定义cell
*/
-(instancetype)init
{
//
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
//设置cell的尺寸
layout.itemSize = [UIScreen mainScreen].bounds.size;
//清空cell间隔的行距
layout.minimumLineSpacing = 0;
//设置cell的滑动方向
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
return [super initWithCollectionViewLayout:layout];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - UICollectionView代理和数据源
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 4;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
// dequeueReusableCellWithReuseIdentifier
// 1.首先从缓存池里取cell
// 2.看下当前是否有注冊Cell,假设注冊了cell,就会帮你创建cell
// 3.没有注冊,报错
NYNewFeatureCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// 拼接图片名称 3.5 320 480
CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
NSString *imageName = [NSString stringWithFormat:@"new_feature_%ld",indexPath.row + 1];
if (screenH > 480) { // 5 , 6 , 6 plus
imageName = [NSString stringWithFormat:@"new_feature_%ld-568h",indexPath.row + 1];
}
cell.image = [UIImage imageNamed:imageName];
[cell setIndexPath:indexPath count:4];
return cell;
}
#pragma mark - UIScrollView代理
// 仅仅要一滚动就会调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 获取当前的偏移量,计算当前第几页
int page = scrollView.contentOffset.x / scrollView.bounds.size.width + 0.5;
// 设置页数
_control.currentPage = page;
}
@end
自己定义的cell
NYNewFeatureCell.h
//
// NYNewFeatureCell.h
// 猫猫微博
//
// Created by apple on 15-8-1.
// Copyright (c) 2015年 znycat. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface NYNewFeatureCell : UICollectionViewCell
@property (nonatomic, strong) UIImage *image;
// 推断是否是最后一页
- (void)setIndexPath:(NSIndexPath *)indexPath count:(int)count;
@end
NYNewFeatureCell.m
//
// NYNewFeatureCell.m
// 猫猫微博
//
// Created by apple on 15-8-1.
// Copyright (c) 2015年 znycat. All rights reserved.
//
#import "NYNewFeatureCell.h"
#import "NYTabBarController.h"
@interface NYNewFeatureCell()
@property (nonatomic, weak) UIImageView *imageView;
//分享button
@property (nonatomic, weak) UIButton *shareButton;
//開始button
@property (nonatomic, weak) UIButton *startButton;
@end
@implementation NYNewFeatureCell
//分享button懒载入
- (UIButton *)shareButton
{
if (_shareButton == nil) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@"分享给大家" forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"new_feature_share_false"] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"new_feature_share_true"] forState:UIControlStateSelected];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn sizeToFit];
[self.contentView addSubview:btn];
_shareButton = btn;
}
return _shareButton;
}
//開始button懒载入
- (UIButton *)startButton
{
if (_startButton == nil) {
UIButton *startBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[startBtn setTitle:@"開始微博" forState:UIControlStateNormal];
[startBtn setBackgroundImage:[UIImage imageNamed:@"new_feature_finish_button"] forState:UIControlStateNormal];
[startBtn setBackgroundImage:[UIImage imageNamed:@"new_feature_finish_button_highlighted"] forState:UIControlStateHighlighted];
[startBtn sizeToFit];
[startBtn addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:startBtn];
_startButton = startBtn;
}
return _startButton;
}
-(UIImageView *)imageView
{
if (_imageView == nil) {
UIImageView *imageV = [[UIImageView alloc]init];
_imageView = imageV;
// 注意:一定要载入contentView
[self.contentView addSubview:imageV];
}
return _imageView;
}
// 布局子控件的frame
-(void)layoutSubviews
{
[super layoutSubviews];
self.imageView.frame = self.bounds;
// 分享button
self.shareButton.center = CGPointMake(self.width * 0.5, self.height * 0.8);
// 開始button
self.startButton.center = CGPointMake(self.width * 0.5, self.height * 0.9);
}
-(void)setImage:(UIImage *)image
{
_image = image;
self.imageView.image = image;
}
// 推断当前cell是否是最后一页
-(void)setIndexPath:(NSIndexPath *)indexPath count:(int)count
{
if (indexPath.row == count - 1) { // 最后一页,显示分享和開始button
self.shareButton.hidden = NO;
self.startButton.hidden = NO;
}else{ // 非最后一页,隐藏分享和開始button
self.shareButton.hidden = YES;
self.startButton.hidden = YES;
}
}
// 点击開始微博的时候调用
- (void)start
{
// 进入tabBarVc
NYTabBarController *tabBarVc = [[NYTabBarController alloc] init];
// 切换根控制器:能够直接把之前的根控制器清空
NYKeyWindow.rootViewController = tabBarVc;
}
@end
以上是关于猫猫学iOS 之微博项目实战程序启动新特性用UICollectionViewController实现的主要内容,如果未能解决你的问题,请参考以下文章
猫猫学iOS 之微博项目实战微博主框架-自己定义导航控制器NavigationController
猫猫学iOS 之微博项目实战微博主框架-自己定义导航控制器NavigationController
猫猫学iOS 之微博项目实战微博主框架-自己定义导航控制器NavigationController
猫猫学iOS 之微博项目实战微博主框架-自己定义导航控制器NavigationController
猫猫学iOS 之微博项目实战微博主框架-自己定义导航控制器NavigationController
猫猫学iOS之微博国际版的一个关于线程调用的异常修复Main Thread Checker: UI API called on a background thread 异常