您的位置:首页 > 移动开发 > IOS开发

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: