IOS新浪微博客户端开发练习知识点总结(一)

一、获得项目中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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值