IOS新浪微博客户端开发练习知识点总结(一)
2014-11-03 21:34
239 查看
一、获得项目中info.plist文件的内容
1> [NSBundle mainBundle].infoDictionary
2> 版本号在info.plist中的key:kCFBundleVersionKey,例子代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSString *key = (NSString *)kCFBundleVersionKey;//系统已定义
// 1.从Info.plist中取出版本号
NSString *version = [NSBundle mainBundle].infoDictionary[key];
// 2.从沙盒中取出上次存储的版本号
NSString *saveVersion = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if ([version isEqualToString:saveVersion]) { // 不是第一次使用这个版本
// 显示状态栏
application.statusBarHidden = NO;
self.window.rootViewController = [[MainController alloc] init];
} else { // 版本号不一样:第一次使用新版本
// 将新版本号写入沙盒
[[NSUserDefaults standardUserDefaults] setObject:version forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
// 显示版本新特性界面
self.window.rootViewController = [[NewfeatureController alloc] init];
}
[self.window makeKeyAndVisible];
return YES;
}
二、自定义控制器的view
需要重写loadView方法(不需要调用[super loadView]),如
#pragma mark 自定义view
- (void)loadView
{
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = [UIImage fullscrennImage:@"new_feature_background.png"];
/*
以3.5inch为例(320x480)
1> 当没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 当有状态栏,applicationFrame的值{{0, 20}, {320, 460}}
*/
imageView.frame = [UIScreen mainScreen].applicationFrame;
// 跟用户进行交互(这样才可以接收触摸事件)
imageView.userInteractionEnabled = YES;
self.view = imageView;
}
当重写这个方法的时候,要注意给view的fram设置大小,否则很有可能在接下来的方法调用中取不到view的frame
三、控制器view的高度和状态栏的关系
创建控制器的view时,系统会检测状态栏是否显示
* 如果有状态栏,那么控制器view的高度是460(iPhone5中是548)
* 如果没有状态栏,那么控制器view的高度是480(iPhone5中是568)
如果使用 imageView.frame = [UIScreen mainScreen].applicationFrame;则创建出来的frame会自动检测是否含有状态栏,即
[UIScreen mainScreen].applicationFrame的取值
以3.5inch为例(320x480)
1> 没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 有状态栏,applicationFrame的值{{0, 20}, {320, 460}},
倘若使用的是imageView.frame = [UIScreen mainScreen].bounds,则创建出来的frame的大小会默认是没有状态栏的情况
四、遇到的错误调试技巧:
1> 一个控件无法显示出来的可能原因
* 没有宽高(宽高为0)
* 位置不对
* hidden=YES
* 没有被addSubview到屏幕上
2> 一个UIScrollView无法滚动
* contentSize没有值
* 不能接收到触摸事件
3> 一个控件无法跟用户交互(无法接收事件)的可能原因
* (父控件的)userInteractionEnabled = NO,此时需要设置 父控件的userInteractionEnabled = YES;
如在重写loadView的方法中,为了使后面向控制器器的view添加的UIScrollView等能够响应事件,需要设置
imageView.userInteractionEnabled = YES;
- (void)loadView
{
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = [UIImage fullscrennImage:@"new_feature_background.png"];
/*
以3.5inch为例(320x480)
1> 当没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 当有状态栏,applicationFrame的值{{0, 20}, {320, 460}}
*/
imageView.frame = [UIScreen mainScreen].applicationFrame;
// 跟用户进行交互(这样才可以接收触摸事件)
imageView.userInteractionEnabled = YES;
self.view = imageView;
}
* (父控件的)hidden = YES
* (父控件的)alpha <= 0.01
* (父控件的)背景是clearColor
五、获得应用的窗口的两个方法:
1、self.view.window;
2、[UIApplication sharedApplication].keyWindow;
六、应用开发的时候,通常都会做一些全局的宏定义,如:
// 1.判断是否为iPhone5的宏
#define iPhone5 ([UIScreen mainScreen].bounds.size.height == 568)
// 2.日志输出宏定义
#ifdef DEBUG
// 调试状态
#define MyLog(...) NSLog(__VA_ARGS__)
#else
// 发布状态
#define MyLog(...)
#endif
七、为适配不同的屏幕尺寸,加载全屏图片的方法可以写成一个UIImage的分类来实现,代码如下
UIImage+Pofabs.h文件内容:
#import <UIKit/UIKit.h>
@interface UIImage (MJ)
#pragma mark 加载全屏的图片
+ (UIImage *)fullscrennImage:(NSString *)imgName;
@end
UIImage+Pofabs.m文件内容:
#import "UIImage+Pofabs.h"
@implementation UIImage (MJ)
#pragma mark 加载全屏的图片
// new_feature_1.png
+ (UIImage *)fullscrennImage:(NSString *)imgName
{
// 1.如果是iPhone5(宏定义中已定义)对文件名特殊处理
if (iPhone5) {
// 1.1.获得文件拓展名
NSString *ext = [imgName pathExtension];
// 1.2.删除最后面的扩展名
imgName = [imgName stringByDeletingPathExtension];
// 1.3.拼接-568h@2x
imgName = [imgName stringByAppendingString:@"-568h@2x"];
// 1.4.拼接扩展名
imgName = [imgName stringByAppendingPathExtension:ext];
}
// 2.加载图片
return [self imageNamed:imgName];
}
@end
八、控制器的view是延迟加载的,在需要显示或者使用的时候才会加载,所以显示状态栏的操作:application.statusBarHidden = NO;一般放在控制器创建之前,以免出现view的frame为全屏的情况(通常我们要考虑出去状态栏),如
#pragma mark - 监听按钮点击
#pragma mark 开始
- (void)start
{
MyLog(@"开始微博");
// [UIApplication sharedApplication].keyWindow;
/*
有显示状态栏时创建控制器,控制器view的高度:460
没有显示状态栏时创建控制器,控制器view的高度:480
*/
// 显示状态栏
[UIApplication sharedApplication].statusBarHidden = NO;
// 控制器的view是延迟加载:需要显示的\用到的时候才会加载
self.view.window.rootViewController = [[MainController alloc] init];
}
九、按钮的设置
// 高亮状态下不更改图片的颜色
self.adjustsImageWhenHighlighted = NO;
// 是否选中状态
self.selected = YES;
// 是否可用状态
self.enabled = YES;
1> [NSBundle mainBundle].infoDictionary
2> 版本号在info.plist中的key:kCFBundleVersionKey,例子代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSString *key = (NSString *)kCFBundleVersionKey;//系统已定义
// 1.从Info.plist中取出版本号
NSString *version = [NSBundle mainBundle].infoDictionary[key];
// 2.从沙盒中取出上次存储的版本号
NSString *saveVersion = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if ([version isEqualToString:saveVersion]) { // 不是第一次使用这个版本
// 显示状态栏
application.statusBarHidden = NO;
self.window.rootViewController = [[MainController alloc] init];
} else { // 版本号不一样:第一次使用新版本
// 将新版本号写入沙盒
[[NSUserDefaults standardUserDefaults] setObject:version forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
// 显示版本新特性界面
self.window.rootViewController = [[NewfeatureController alloc] init];
}
[self.window makeKeyAndVisible];
return YES;
}
二、自定义控制器的view
需要重写loadView方法(不需要调用[super loadView]),如
#pragma mark 自定义view
- (void)loadView
{
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = [UIImage fullscrennImage:@"new_feature_background.png"];
/*
以3.5inch为例(320x480)
1> 当没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 当有状态栏,applicationFrame的值{{0, 20}, {320, 460}}
*/
imageView.frame = [UIScreen mainScreen].applicationFrame;
// 跟用户进行交互(这样才可以接收触摸事件)
imageView.userInteractionEnabled = YES;
self.view = imageView;
}
当重写这个方法的时候,要注意给view的fram设置大小,否则很有可能在接下来的方法调用中取不到view的frame
三、控制器view的高度和状态栏的关系
创建控制器的view时,系统会检测状态栏是否显示
* 如果有状态栏,那么控制器view的高度是460(iPhone5中是548)
* 如果没有状态栏,那么控制器view的高度是480(iPhone5中是568)
如果使用 imageView.frame = [UIScreen mainScreen].applicationFrame;则创建出来的frame会自动检测是否含有状态栏,即
[UIScreen mainScreen].applicationFrame的取值
以3.5inch为例(320x480)
1> 没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 有状态栏,applicationFrame的值{{0, 20}, {320, 460}},
倘若使用的是imageView.frame = [UIScreen mainScreen].bounds,则创建出来的frame的大小会默认是没有状态栏的情况
四、遇到的错误调试技巧:
1> 一个控件无法显示出来的可能原因
* 没有宽高(宽高为0)
* 位置不对
* hidden=YES
* 没有被addSubview到屏幕上
2> 一个UIScrollView无法滚动
* contentSize没有值
* 不能接收到触摸事件
3> 一个控件无法跟用户交互(无法接收事件)的可能原因
* (父控件的)userInteractionEnabled = NO,此时需要设置 父控件的userInteractionEnabled = YES;
如在重写loadView的方法中,为了使后面向控制器器的view添加的UIScrollView等能够响应事件,需要设置
imageView.userInteractionEnabled = YES;
- (void)loadView
{
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = [UIImage fullscrennImage:@"new_feature_background.png"];
/*
以3.5inch为例(320x480)
1> 当没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 当有状态栏,applicationFrame的值{{0, 20}, {320, 460}}
*/
imageView.frame = [UIScreen mainScreen].applicationFrame;
// 跟用户进行交互(这样才可以接收触摸事件)
imageView.userInteractionEnabled = YES;
self.view = imageView;
}
* (父控件的)hidden = YES
* (父控件的)alpha <= 0.01
* (父控件的)背景是clearColor
五、获得应用的窗口的两个方法:
1、self.view.window;
2、[UIApplication sharedApplication].keyWindow;
六、应用开发的时候,通常都会做一些全局的宏定义,如:
// 1.判断是否为iPhone5的宏
#define iPhone5 ([UIScreen mainScreen].bounds.size.height == 568)
// 2.日志输出宏定义
#ifdef DEBUG
// 调试状态
#define MyLog(...) NSLog(__VA_ARGS__)
#else
// 发布状态
#define MyLog(...)
#endif
七、为适配不同的屏幕尺寸,加载全屏图片的方法可以写成一个UIImage的分类来实现,代码如下
UIImage+Pofabs.h文件内容:
#import <UIKit/UIKit.h>
@interface UIImage (MJ)
#pragma mark 加载全屏的图片
+ (UIImage *)fullscrennImage:(NSString *)imgName;
@end
UIImage+Pofabs.m文件内容:
#import "UIImage+Pofabs.h"
@implementation UIImage (MJ)
#pragma mark 加载全屏的图片
// new_feature_1.png
+ (UIImage *)fullscrennImage:(NSString *)imgName
{
// 1.如果是iPhone5(宏定义中已定义)对文件名特殊处理
if (iPhone5) {
// 1.1.获得文件拓展名
NSString *ext = [imgName pathExtension];
// 1.2.删除最后面的扩展名
imgName = [imgName stringByDeletingPathExtension];
// 1.3.拼接-568h@2x
imgName = [imgName stringByAppendingString:@"-568h@2x"];
// 1.4.拼接扩展名
imgName = [imgName stringByAppendingPathExtension:ext];
}
// 2.加载图片
return [self imageNamed:imgName];
}
@end
八、控制器的view是延迟加载的,在需要显示或者使用的时候才会加载,所以显示状态栏的操作:application.statusBarHidden = NO;一般放在控制器创建之前,以免出现view的frame为全屏的情况(通常我们要考虑出去状态栏),如
#pragma mark - 监听按钮点击
#pragma mark 开始
- (void)start
{
MyLog(@"开始微博");
// [UIApplication sharedApplication].keyWindow;
/*
有显示状态栏时创建控制器,控制器view的高度:460
没有显示状态栏时创建控制器,控制器view的高度:480
*/
// 显示状态栏
[UIApplication sharedApplication].statusBarHidden = NO;
// 控制器的view是延迟加载:需要显示的\用到的时候才会加载
self.view.window.rootViewController = [[MainController alloc] init];
}
九、按钮的设置
// 高亮状态下不更改图片的颜色
self.adjustsImageWhenHighlighted = NO;
// 是否选中状态
self.selected = YES;
// 是否可用状态
self.enabled = YES;
相关文章推荐
- arcims开发经验总结(4) (arcIMS 客户端 连接器的选择)
- asterisk 客户端开发总结
- Eclipse rap 富客户端开发总结(5)- RAP国际化之路
- Eclipse rap 富客户端开发总结(10) -Rap不同系统间的差异和处理方式
- Eclipse rap 富客户端开发总结(9) - rap上传与下载
- arcims开发经验总结(4) (arcIMS 客户端 连接器的选择)
- Eclipse rap 富客户端开发总结(13) -Rap/Rcp保存按钮处理方式
- Eclipse rap 富客户端开发总结(3)- rcp/rap目前界面上的一些差异
- Eclipse rap 富客户端开发总结(2)- rap项目目前的进度和存在的问题
- Eclipse rap 富客户端开发总结(12) -Rap 优化之组件的销毁
- 传智播客--AJAX知识点和实用练习总结
- Android手机游戏开发知识点总结
- Android开发知识点总结
- Eclipse rap 富客户端开发总结(4)- 如何搭建 rap 中文开发环境
- Windows Phone 7微博客户端开发之项目总结升级篇
- arcims开发经验总结(4) (arcIMS 客户端 连接器的选择)
- Android开发知识点总结
- Windows phone 微博客户端 开发之项目总结
- Eclipse rap 富客户端开发总结(7) - 如何修改rap的样式
- Objective-C开发——数据类型知识点总结