主要目标:版本新特性界面,新浪授权界面(登录界面)的处理

  任务基本完成了,基本的框架也就到这了,接下来的应该是首页获取微博了。

  1.版本新特性,可以单独作为一个model,写完之加入到项目中。我们新建一个mvc方式的分组Newpart,主要应用的就是那个scrollview,有点类似于广告轮播,这个换成手动的切换图片。

  2.在appdelegate中将window的根控制器换成newpartController,完成效果后在处理他们之间的逻辑。

  3.添加UIScrollView来实现滚动,添加图片,设置scroll的滚动属性(代码:009)

 // 009
// 新特性控制器的scroll设置
- (void)viewDidLoad
{
[super viewDidLoad]; // 初始化scroll
UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:self.view.frame];
// 设置scroll的代理
scroll.delegate = self;
// 添加到view上
[self.view addSubview:scroll]; // 添加图片
CGFloat imageW = self.view.frame.size.width;
CGFloat imageH = self.view.frame.size.height;
for (int index = ; index < SVNewPAartImageCount; index++) {
UIImageView *imageView = [[UIImageView alloc] init]; NSString *imageName = [NSString stringWithFormat:@"new_feature_%d-568h@2x", index+];
imageView.image = [UIImage imageNamed:imageName]; CGFloat imageX = index * imageW;
imageView.frame = CGRectMake(imageX, , imageW, imageH); [scroll addSubview:imageView]; } // 设置滚动的尺寸
scroll.contentSize = CGSizeMake(imageW * SVNewPAartImageCount, );
scroll.showsHorizontalScrollIndicator = NO; // 滚动条
scroll.pagingEnabled = YES; // 分页
scroll.bounces = NO;
}

  4.添加pagecontrol(代码:010),使用scroll的代理完成pagecotrol的变换(代码:011)

 // 010
// 添加pagecontrol
- (void)addPagecontrol
{
// 初始化page
UIPageControl *pageControl = [[UIPageControl alloc] init];
// 设置属性
pageControl.numberOfPages = SVNewPAartImageCount;
CGFloat centerX = self.view.frame.size.width * 0.5;
CGFloat centerY = self.view.frame.size.height * 0.95;
pageControl.center = CGPointMake(centerX, centerY);
pageControl.bounds = CGRectMake(, , , );
pageControl.userInteractionEnabled = NO;
// 添加page
[self.view addSubview:pageControl];
self.pageControl = pageControl; // 更改圆点的颜色
pageControl.currentPageIndicatorTintColor = SLColor(, , );
pageControl.pageIndicatorTintColor = SLColor(, , );
}
 // 011
// 实现page的变换
#pragma mark UIScrollView的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 取出水平方向滚动的距离
CGFloat offsetX = scrollView.contentOffset.x;
// 计算页码
double pageDouble = offsetX / scrollView.frame.size.width;
int pageInt = (int)(pageDouble + 0.5);
self.pageControl.currentPage = pageInt;
}

  5.为最后一张图片添加分享复选框和开始微博按钮(代码:012),实现从新特性跳转到首页(代码:013)

 //
- (void)setupLastImageView:(UIImageView *)imageView
{
// 让imageview可以和用户进行交互
imageView.userInteractionEnabled = YES;
// 添加开始微博按钮
UIButton *startBtn = [[UIButton alloc] init];
[startBtn setBackgroundImage:[UIImage imageNamed:@"new_feature_finish_button"] forState:UIControlStateNormal];
[startBtn setBackgroundImage:[UIImage imageNamed:@"new_feature_finish_button_highlighted"] forState:UIControlStateHighlighted];
// 设置frame
CGFloat centerX = imageView.frame.size.width * 0.5;
CGFloat centerY = imageView.frame.size.height * 0.6;
startBtn.center = CGPointMake(centerX, centerY);
startBtn.bounds = (CGRect){CGPointZero, startBtn.currentBackgroundImage.size};
// 设置文字
[startBtn setTitle:@"开始微博" forState:UIControlStateNormal];
[startBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
// 绑定事件
[startBtn addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
[imageView addSubview:startBtn]; // 添加选择框
UIButton *checkBox = [[UIButton alloc] init];
checkBox.selected = YES;
[checkBox setTitle:@"分享给大家" forState:UIControlStateNormal];
[checkBox setImage:[UIImage imageNamed:@"new_feature_share_false"] forState:UIControlStateNormal];
[checkBox setImage:[UIImage imageNamed:@"new_feature_share_true"] forState:UIControlStateSelected];
checkBox.bounds = CGRectMake(, , , );
CGFloat checkboxcenterX = centerX;
CGFloat checkboxcenterY = imageView.frame.size.height * 0.5;
checkBox.center = CGPointMake(checkboxcenterX, checkboxcenterY);
[checkBox setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
checkBox.titleLabel.font = [UIFont systemFontOfSize:];
[checkBox addTarget:self action:@selector(checkboxClick:) forControlEvents:UIControlEventTouchUpInside];
// checkbox.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
checkBox.imageEdgeInsets = UIEdgeInsetsMake(, , , );
// checkbox.contentEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
[imageView addSubview:checkBox];
}
 //
- (void)start
{
// 显示状态栏
[UIApplication sharedApplication].statusBarHidden = NO;
// 切换窗口的根控制器
self.view.window.rootViewController = [[SVTabbarController alloc] init];
}
- (void)checkboxClick:(UIButton *)checkbox
{
checkbox.selected = !checkbox.isSelected;
}

  6.存储版本信息,当不是第一次安装本软件的时候不显示新特性界面,在appdelegate中完成存储和判断,(代码:014)

 //
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // 设置窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // 版本信息的键值
NSString *key = @"CFBundleVersion";
// 取出沙盒中是上次存储的软件版本信息
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *lastVersion = [defaults stringForKey:key];
// 获得但前版本
NSString *currentVersion = [NSBundle mainBundle].infoDictionary[key]; if ([currentVersion isEqualToString:lastVersion]) {
// 显示状态栏
[UIApplication sharedApplication].statusBarHidden = NO;
self.window.rootViewController = [[SVTabbarController alloc] init];
} else { // 新版本
self.window.rootViewController = [[SVNewpartController alloc] init];
// 存储新版本
[defaults setObject:currentVersion forKey:key];
[defaults synchronize];
}
// 显示窗口
[self.window makeKeyAndVisible]; return YES;
}

  7.微博的Author授权,首先要成为新浪的开发者,这个很好申请的,我这个上次就已经弄好了,这次就直接用了。

  8.这个授权也可以作为一个模块但度拿出来。想以后要是使用微博分享自己应用的一些动态就可以把这儿授权模块直接该一下就好,我们新建一个mvc组Author。

  9.新浪的授权也是一个网页的形式,所以要用到webview,加载页面的时候iOS9也许会报错,是因为iOS要求使用更安全的https,需要在info.plist中加入一句话,(代码:特殊0)

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</plist>

  10.登陆后,通过webView的代理截取返回的code,并通过code换取accesstoken,在换取accesToken的方法中使用AFN发送请求

  11.为了实现模型编程,新建一个用户账号模型SVAccount,为了优化账号的存取,添加一个AccountTool类,用来将用户归档保存。为后面的用户是否已经登录判断做基础

  12.软件启动顺序:(图004),添加工具类weiboTool选择app的进入界面,在appdelegate中的判断就少了很多(代码015)

 //
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 设置窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 显示窗口
[self.window makeKeyAndVisible]; // 先判断有无存储账号信息
SVAccount *account = [SVAccountTool account];
if (account) { // 之前登录成功
[SLWeiboTool chooseRootController];
} else { // 之前没有登录成功
self.window.rootViewController = [[SVAuthorController alloc] init];
}
return YES;
}

iOS实践03的更多相关文章

  1. 使用Bootstrap 3开发响应式网站实践03,轮播下方的内容排版

    通常把一些重要信息.需要重点标注的信息放在轮播的下方显示,这部分区域用到了大字体的标题.副标题以及段落文字等. <div class="row" id="bigCa ...

  2. MatrixOne从入门到实践03——部署MatrixOne

    MatrixOne从入门到实践--部署MatrixOne 前两章节我们简单介绍了MatrixOne和源码编译了MatrixOne.本章节将使用不同的部署方式,来部署MatrixOne的服务. 注意:不 ...

  3. 系统设计实践(03)- Instagram社交服务

    前言 系统设计实践篇的文章将会根据<系统设计面试的万金油>为前置模板,讲解数十个常见系统的设计思路. 前置阅读: <系统设计面试的万金油> 系统设计实践(01) - 短链服务 ...

  4. iOS实践01

    去年放假之前大概完成了新浪微博项目,到现在也忘得差不多了,打算在重新写一遍.之前的一些笔记在新浪的博客SleenXiu,在这主要是把新浪微博以随笔的形式写在这,方便以后的复习. 先看看之前主要完成的几 ...

  5. iOS实践04

    第四天 微博数据展示:获取服务器数据,json数据的解析,MVC的使用,自定义cell高度的计算,一些分类的设计.已经是第四天了,虽然每天都有课程,但这个东西也基本完成了一大半吧,一些忘掉的知识也捡起 ...

  6. iOS实践02

    第二天了,上了一天课,软件测试.数据挖掘.概率论,晚上了才有时间捣鼓捣鼓程序. 今天只是简单的做了一点.觉得自己思考的写不出来,只能简单的写一个过程,不像第一次写这个,少了很多思考的. 1.完善tab ...

  7. swift 实践- 03 -- UILabel

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 标签 let ...

  8. 使用Axure RP原型设计实践03,制作一个登录界面的原型

    本篇体验做一个登录界面的原型. 登录页 首先在Page Style里为页面设置背景色. 如果想在页面中加图片,就把Image部件拖入页面,并设置x和y轴.双击页面中的Image部件可以导入图片.在Im ...

  9. 在ASP.NET MVC中使用Knockout实践03,巧用data参数

    使用Knockout,当通过构造函数创建View Model的时候,构造函数的参数个数很可能是不确定的,于是就有了这样的一个解决方案:向构造函数传递一个object类型的参数data. <inp ...

随机推荐

  1. Win7下qt5.3.1+opencv2.4.9编译环境的搭建(好多 Opencv2.4.9源码分析的博客)

      到官网下载qt-opensource-windows-x86-mingw482_opengl-5.3.1.exe文件,执行该文件,选择默认安装即可实现QT的安装(安装在C盘的根目录下),该文件封装 ...

  2. Referrer 还是 Referer?

    上回我写了一篇文章介绍「Referrer Policy」,有小伙伴看完后问我:Referrer 这个单词到底怎么拼,为什么有时候中间有两个 r,有时候只有一个? 是的,这是一个很有趣的问题,这里就给有 ...

  3. 解决android开发webservice的发布与数据库连接的问题

    由于app后续开发的需要,移植了两次webservice和数据库,遇到了不少问题,也花费了很多时间,实践告诉我要学会寻找问题的根源,这样才能在开发中节省时间,尽快解决问题!好,废话不多说,转入正题…… ...

  4. poj1563---蜗牛爬井

    #include <stdio.h> #include <stdlib.h> int main() { int dayTh; float Udis,currentHeight, ...

  5. paip.提升用户体验---论文本编辑器的色彩方案

    paip.提升用户体验---论文本编辑器的色彩方案 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.ne ...

  6. Baskets of Gold Coins

    Baskets of Gold Coins Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. Windows内核之进程的终止和子进程

    1 进程终止的方法: <1>主线程的进入点函数返回(最好使用这种方法) <2>进程中的一个线程调用ExitProcesss函数(应该避免使用这样的方法). <3>还 ...

  8. 基于Nodejs开发的web即时聊天工具

    由于公司需要开发web即时聊天的功能,开始时我们主要的实施方法是用jquery的ajax定时(10秒)轮询向服务器请求,由于是轮询请求,对 服务器的压力比较大.我们网站上线的时间不长,访问量不是很大, ...

  9. html中radio,checkbox值的获取、赋值、注册事件

    1,radio分组 只要name一样,就是一组的,即一组中只能选择一个,如下: 代码如下: <span>group1:</span> <input type=" ...

  10. 创建自己的yum软件源(以Cloudera Hadoop的安装为例)

    .下载Cloudera Manager安装文件 Cloudera Manager的可以从如下网址获得: http://archive.cloudera.com/cm4/installer/ 这里选择C ...