iOS_20_微博新特性页面

最终效果图:

BeyondAppDelegate.m

//
//  BeyondAppDelegate.m
//  20_帅哥no微博
//
//  Created by beyond on 14-8-3.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondAppDelegate.h"
#import "BeyondViewController.h"
#import "NewFeatureViewController.h"
#import "OauthViewController.h"
#define kVersionCodeKey  (NSString *)kCFBundleVersionKey
@implementation BeyondAppDelegate
// 应用最先执行的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 1,创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // 2,设置窗口的背景色
    self.window.backgroundColor = [UIColor whiteColor];
    // 3,调用自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了NewFeature控制器,否则 就直接让主控制器成为了窗口的根控制器
    [self versionCodeCheck];
    // 4,让窗口可见
    [self.window makeKeyAndVisible];
    return YES;
}

// 自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了NewFeature控制器,否则 就直接让主控制器成为了窗口的根控制器
- (void)versionCodeCheck
{
    // 1,使用用户偏好,从沙盒中取出旧的版本号

    NSString *oldVersionCode = [[NSUserDefaults standardUserDefaults] objectForKey:kVersionCodeKey];
    NSString *currentVersionCode = [[[NSBundle mainBundle]infoDictionary] objectForKey:kVersionCodeKey];

    // 根据版本号的比较结果 进入不同的控制器
    //[self stepIntoViewController:currentVersionCode oldVersion:oldVersionCode];
    //return;

#warning block test -===============以下内容,和其中调用的方法,仅用于block调用测试
    if ([currentVersionCode isEqualToString:oldVersionCode]) {
    //if(0){
        [self enterBeyondVC];
    } else {
        // 关键 ,并且保存版本号
        [[NSUserDefaults standardUserDefaults]setObject:currentVersionCode forKey:kVersionCodeKey];

        // 进入新特性控制器
        NewFeatureViewController *newVC = [[NewFeatureViewController alloc]init];
        newVC.startBlock = ^(BOOL isSelected){
            log(@"%d",isSelected);
            [self enterBeyondVC];
        };
        self.window.rootViewController = newVC;
    }
}

#warning block test
- (void) enterBeyondVC
{
    // 1,如果进行过Oauth授权,则直接进入主控制器,否则 进行Oauth授权控制器
    if (1) {
        OauthViewController *oauthVC = [[OauthViewController alloc]init];
        self.window.rootViewController = oauthVC;
        return;
    }

    // 进入主控制器
    BeyondViewController *vc =[[BeyondViewController alloc]init];
    self.window.rootViewController = vc;
}

- (void)stepIntoViewController:(NSString *)curVersion oldVersion:(NSString *)oldVersion
{
    // 比较新旧版本号
    UIViewController *rootViewController = nil;
#warning 测试新特性的view
    if ([curVersion isEqualToString:oldVersion]) {
     //   if (0){
        // 说明不是第一次运行,直接实例化主控制器,将主控制器设置为窗口的根控制器
        // 进入主控制器(主界面之前 先把状态栏,恢复) ios 7 无效
        // [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
        rootViewController = [[BeyondViewController alloc]init];
    } else {
        // 说明是第一次运行,进入新特性控制器,将新特性控制器设置为窗口的根控制器,并且保存版本号
        // 进入新特性控制器(新特性界面之前 先把状态栏,隐藏)  ios 7 无效
        // [UIApplication sharedApplication].statusBarHidden = YES;
        // [[UIApplication sharedApplication]setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
        rootViewController = [[NewFeatureViewController alloc]init];
        // 关键 ,并且保存版本号
        [[NSUserDefaults standardUserDefaults]setObject:curVersion forKey:kVersionCodeKey];
    }
    // 设置窗口的根控制器,为相应的控制器
    self.window.rootViewController = rootViewController;
}
@end

NewFeatureViewController.h

//
//  NewFeatureViewController.h
//  20_帅哥no微博
//
//  Created by beyond on 14-8-3.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  只使用一次,版本新特性控制器,在第一次运行本版本时启用

#import <UIKit/UIKit.h>

@interface NewFeatureViewController : UIViewController
// 定义一个block作为成员变量,点击开始按钮时,初始化主控制器,让其成为窗口的根控制器
// block用copy
@property (nonatomic,copy) void(^startBlock)(BOOL isShare);
@end

NewFeatureViewController.m

//
//  NewFeatureViewController.m
//  20_帅哥no微博
//
//  Created by beyond on 14-8-3.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  只使用一次,版本新特性控制器,在第一次运行本版本时启用
/*
 写在前面:
 当一个控件不显示 的时候,检查下面三个属性:
 没有宽度和高度
 x y 坐标不正确
 没有添加到父控件中
 当一个控制不能点击的时候,检查下面个属性:
 自己的userinteraction = no
 父控件的userinteraction = no
 控件本身已经超出了它所在的控制器范围
 pageController的高度不能更改,那么就可以置高度为0,其他控件同理

 4,居中显示 的标准步骤:先设置center,再设置bounds

 5,切换按钮图片可以通过切换按钮的状态来完成

 normal:普通
 highlighted : 高亮(人为长按的时候)
 disabled :失效(通过代码控制)
 selected : 选中 (通过代码控制)

 */
#import "NewFeatureViewController.h"

#define kPicNum 4

#warning viewSize 要改成kWinSize
#define viewSize self.view.bounds.size

@interface NewFeatureViewController ()<UIScrollViewDelegate>
{
    // 页面指示控制器
    UIPageControl *_pageControl;

    // 因为开启按钮的点击事件中需要分享按钮的选中状态
    UIButton *_shareBtn;
}

@end

@implementation NewFeatureViewController

- (BOOL)prefersStatusBarHidden
{
    // 在LoadView之前 还要先
    NSLog(@"prefers bar hidden");
    return YES;

}

- (void)loadView
{
    NSLog(@"load view");
    // 新特性,让imageView成为控制器的view,然后才再ImageView上面添加一层scrollView
    UIImageView *imgView = [[UIImageView alloc]init];
    // 设置控制器view(即imgView)的尺寸为全屏
    imgView.frame = [UIScreen mainScreen].bounds;
    NSLog(@"%@",NSStringFromCGRect(imgView.frame));
    // 使用分类中的方法,如果是iphone5,加载 -568h的图片
    imgView.image = [UIImage fullScrennImageNamed:@"new_feature_background.png"];

    // 让控制器的view可以与用户交互
    imgView.userInteractionEnabled = YES;
    // 直接让imgeView成为控制器的view
    self.view = imgView;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"view did load ");

    // 1,调用自定义方法,加载UIScrollView,并且批量添加UIImageView,每个ImageView中放一张图片
    [self addUIScrollView];

    // 2,调用自定义方法,加载UIPageControl
    [self addUIPageControl];
}

// 自定义方法,加载UIScrollView,并且批量添加UIImageView,每个ImageView中放一张图片
- (void) addUIScrollView
{
    // 1.加载UIScrollView,并且批量添加UIImageView,每个ImageView中放一张图片
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    // 显示的可视区域大小
    scrollView.frame = self.view.bounds;
    // 水平滚动条
    scrollView.showsHorizontalScrollIndicator = NO;
    // 按可视区域进行分页
    scrollView.pagingEnabled = YES;
    // 滚动的范围
    scrollView.contentSize = CGSizeMake(kPicNum * viewSize.width, 0);
    // 代理 可以监听滚动的各类事件
    scrollView.delegate = self;
    // 添加到self.view即ImageView
    [self.view addSubview:scrollView];

    // 2,根据索引添加kPicNum张图片排列而成的kPicNum个imageView到scrollView里面
    for (int i = 0; i<kPicNum; i++) {
        [self addImageViewToScrollView:scrollView atIndex:i];
    }

}
// 自定义方法,加载UIPageControl
- (void) addUIPageControl
{
    // 1,加载UIPageControl
    _pageControl = [[UIPageControl alloc] init];
    // 居中最好是先设置center,再设置bounds
    _pageControl.center = CGPointMake(viewSize.width * 0.5, viewSize.height * 0.95);
    _pageControl.bounds = CGRectMake(0, 0, 100, 0);
    // 设置总页数
    _pageControl.numberOfPages = kPicNum;
    // 重点~从图片中加载颜色 默认颜色和当前页的颜色
    _pageControl.pageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"new_feature_pagecontrol_point.png"]];
    _pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"new_feature_pagecontrol_checked_point.png"]];
    // 禁止默认的交互事件
    _pageControl.userInteractionEnabled = NO;
    // 添加到self.view即ImageView
    [self.view addSubview:_pageControl];
}

// scrollView的代理方法,用于动态控制PageControl的当前圆点,滚动减速完毕就会调用(即scrollview静止)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    // 当前的第几页就是偏移的x除以单张宽度
    _pageControl.currentPage = scrollView.contentOffset.x / scrollView.frame.size.width;
}

// 自定义方法,根据索引添加kPicNum张图片排列而成的kPicNum个imageView到scrollView里面
- (void)addImageViewToScrollView:(UIScrollView *)scrollView atIndex:(int)i
{
    // 1.创建imageview
    UIImageView *imageView = [[UIImageView alloc] init];
    // 因为是一张张水平排列,所以根据索引计算 frame  ,通过结构体必须强转为CGRect
    imageView.frame = (CGRect){{i * viewSize.width, 0} , viewSize};

    // 2.设置图片
    NSString *name = [NSString stringWithFormat:@"new_feature_%d.png", i + 1];

    // 使用分类中的方法,如果是iphone5,加载 -568h的图片
    imageView.image = [UIImage fullScrennImageNamed:name];

    // 3.添加
    [scrollView addSubview:imageView];

    // 4.如果是最后一张图片,添加2个按钮(分享、开始)
    if (i == kPicNum - 1) {
        // 必须让最后一张imageView可以进行点击,这样它里面的2个按钮才可以点击
        imageView.userInteractionEnabled = YES;

        // 最后一张图片页面,有两个按钮,一个是开始
        [self addStartBtnInImageView:imageView];
        // 最后一张图片页面,有两个按钮,另一个是分享微博按钮,默认是选中状态
        [self addShareBtnInImageView:imageView];
    }
}

// 最后一张图片页面,有两个按钮,一个是分享
- (void) addShareBtnInImageView:(UIImageView *)imageView
{

    // 2.1.创建自定义样式的按钮
    _shareBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    // 添加到最后一张imageView里面
    [imageView addSubview:_shareBtn];

    // 2.2.设置按钮背景图片
    // 调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回 图片的尺寸
    CGSize shareBtnNormalBgImgSize = [_shareBtn setBtnBgImgForNormalAndSelectedWithName:@"new_feature_share_false.png" selectedName:@"new_feature_share_true.png"];

    // 2.3.边框(居中,先center,后bounds)
    _shareBtn.center = CGPointMake(viewSize.width * 0.5, viewSize.height * 0.75);
    // 按钮宽高,就按背景图片宽高
    _shareBtn.bounds = (CGRect){CGPointZero, shareBtnNormalBgImgSize};

    // 2.4.监听
    [_shareBtn addTarget:self action:@selector(shareBtnClick:) forControlEvents:UIControlEventTouchUpInside];
    // 2.5.高亮状态下不要改变图片颜色
    _shareBtn.adjustsImageWhenHighlighted = NO;
    // 2.6.默认选中
    _shareBtn.selected = YES;

}
// 分享按钮点击事件,只要切换不同的选中状态,就可以显示不同的两张图片(正常图片是不勾选,选中状态的图片是勾选)
- (void)shareBtnClick:(UIButton *)shareBtn
{
    shareBtn.selected = !shareBtn.isSelected;
}
// 最后一张图片页面,有两个按钮,一个是开始
- (void) addStartBtnInImageView:(UIImageView *)imageView
{

    // 1.1.创建开启按钮
    // 使用自定义样式
    UIButton *startBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    // 添加到最后一张imageView里面
    [imageView addSubview:startBtn];

    // 1.2.设置背景图片等个性样式
    // 调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回 图片的尺寸
    CGSize startBtnBgImgSize = [startBtn setBtnBgImgForNormalAndHighightedWithName:@"new_feature_finish_button.png"];
    // 1.3.边框
    startBtn.center = CGPointMake(viewSize.width * 0.5, viewSize.height * 0.85);
    // 按钮的宽高 与 背景图片的宽高一样大
    startBtn.bounds = (CGRect){CGPointZero, startBtnBgImgSize};

    // 1.4.监听
    [startBtn addTarget:self action:@selector(startBtnClick) forControlEvents:UIControlEventTouchUpInside];

}

// 点击开始按钮时,调用block完成,以下功能:初始化主控制器,让其成为窗口的根控制器
- (void)startBtnClick
{
    // 直接调用block (即另外一个类里面的一段代码来执行)
    if (_startBlock) {
        _startBlock(_shareBtn.isSelected);
    }
}

@end

iOS_20_微博新特性页面

时间: 2024-10-06 08:23:00

iOS_20_微博新特性页面的相关文章

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

iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <UIKit/UIKit.h> 6 7 t

新特性页面

本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <UIKit/UIKit.h> 6 7 typedef enum:NSInteger 8 {

Spring4.1新特性——Spring缓存框架增强(转)

目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异常处理 Spring4.1新特性——数据库集成测试脚本初始化 Spring4.1新特性——Spring MVC增强 Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介 Spring4.1新特性——静态资源处理增强 Spring 4.1提供了对jcach

iOS开发-项目新特性

iOS开发实用技巧—项目新特性页面的处理 iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <

iOS彩票项目--第五天,新特性引导页的封装、返回按钮的自定义、导航控制器的滑动返回以及自定义滑动返回功能

一.上次实现了在AppDelegate中通过判断app版本决定是否进入新特性页面,今天将AppDelegate中的一坨进行了封装.将self.window的根控制器到底应该为新特性界面,还是主页面,封装到了导航工具类ChaosGuideTool 封装,先决定外面怎么用,然后实现方法.外部通过类方法调用  + (UIViewController *)chooseRootVC; 外部的APPDelegate 只是调用方法 之前的业务判断没有改变,只是将数据的存储进行了封装 二.返回按钮的自定义 <1

iOS_20_微博『更多』页面

最终效果图: MoreViewController.m // // MoreViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-4. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "MoreViewController.h" @interface MoreViewController () { // more.plist根是字典

让页面滑动流畅得飞起的新特性:Passive Event Listeners

版权声明:本文由陈志兴原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/153 来源:腾云阁 https://www.qcloud.com/community 在不久前的Google I/O 2016 Mobile Web Talk中,Google公布了一个让页面滑动更流畅的新特性Passive Event Listeners.该特性目前已经集成到Chrome51版本中.Chrome51上使用Passive Event L

猫猫学iOS 之微博项目实战(7)程序启动新特性用UICollectionViewController实现

猫猫分享.必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 这里实现了大多数app都会有的软件新特性的功能,用的是UICollectionViewController实现的 二:思路 这里用了UICollectionViewController实现,就是做一个没有间隙,每一个cell都是一个屏幕的UICollectionViewController,自己定义的. 然后把以下的UIPageControl 还有最后

[iOS微博项目 - 1.7] - 版本新特性

A.版本新特性 1.需求 第一次使用新版本的时候,不直接进入app,而是展示新特性界面 github: https://github.com/hellovoidworld/HVWWeibo 2.思路 [[NSBundle mainBundle] infoDictionary]取得当前版本号(最新版本),版本号存储在了info.plist中 从preference取得上一次使用的版本号 将讲个版本号进行对比,如果相同就是当前是最新版本,直接进入app:如果不相同,就进入新特性界面并保存最新版本号到