码迷,mamicode.com
首页 > 其他好文 > 详细

UI进阶--01

时间:2015-12-01 01:36:29      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

 

01-项目中常见的文件(LaunchScreen)

  • Xcode5

    • 框架是苹果事先已经导入进去的.在项目的结构当中就能够看到导入的框架.
  • Xcode6

    • 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架.
  • LaunchScreen.xib:用来设置启动界面.
  • Xcode7

    • 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架. LaunchScreen.storyBoard
  • LaunchScreen原理:

    • 会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file,
    • 如果没有指定的话,就不会去加载LaunchScreen作为启动界面.

    • 如果没有设置启动图片,模拟器默认的尺寸大小是4s的尺寸大小.(可以打印屏幕尺寸验证.)

    • 模拟器默认的尺寸是由启动界面决定的.
    • 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片.
  • 可以进入沙盒当中查看, -查看方法,找到应用程序根目录.
    • 获取方法: NSLog(@"%@",NSHomeDirectory());
    • 打印出来,后前往文件夹.找到Library->Caches->Snapshots目录下面.最后一层就是程序自动生成的图片.

02-项目中常见的文件(info.plist)

1.Supporting file一般都是放些资源文件,像一些plist这些等

2.xcode5当中也有info.plist,只不过它的名字很长.是工程的名称.

3.在xcode5当中,会自动生成一个pch文件,在Xcode6当中不会帮我们生成PCH文件.

4.info.plist当中保存着整个应用当中基本的配置.它是一个字典.查看它的类型.

这个当中,主要掌握三个Key

Bundle Name:应用程序的名称.

Bundle version string,short:应用程序的版本.在开发当中都是迭代开发.苹果要求下一次提交的版本必须得要比上一次提交的版本要高.

Bundle Version:应用程序编译的版本.

Bundle identifier:应用程序标识符.保证应用程序的唯一性

如果两个应用同一个标识符, 那么之前的那个应用会被覆盖.

当应用上传到AppStore的时候必须得要有标识符.当做推送的时候也必须得要Bundle identifier.Targets对应者info.plist.文件.

03-项目中常见的文件(PCH)

  • PCH也是一个文件.一般PCH的名称跟项目的名称相同.
  • PCH的作用:
    • 存放一些公用的宏.
    • 存放一些公用的文件.
  • 只要在pch当中定义的东西, 会被整个应用程序共享.
  • PCH它是一个预编译文件,要告诉系统要提前编译它.要去做一些配置. 在Buld Setting 当中找perfix 找到Precomplie prefix Header 为yes. 设完这些后,再进行prefix Header的路径配置.路径从根层开始.
技术分享
 
 
  • 1.定义一些常用公用的宏. 经常做一些系统的版本号的宏, 和一些屏幕的宏.
  • 2.存放公用的头文件.分类的头文件
  • 3.pch可以自定义Log.

    • 在宏当中,三个点...表示可变参数.
    • 在函数当中,表示可变参数用:__VA_ARGS__
    • Log(...) NSLog(__VA__ARGS__) 可以手动管理,直接注释掉.
  • PCH:注意PCH会把它当中的所有内容导入到工程当中所有的文件.但如果工程当中有C语言文件的时候,它也是会把它给导入到C语言的文件当中.如果这样的话, 就会发生错误.?

  • 解决办法:每一个OC文件都会定义一个__OBJC__宏,只要判断有没有定义这样一个宏,就能看出是不是C语言的文件,如果没有定义这样的宏, 那就不需要导入这些东西.就不会报错.

04-UIApplication单例.

  • 什么是UIApplication?

    • UIApplication对象是应用程序的象征.
    • 每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它是一个单例对象.
    • 一个iOS程序启动后创建的第一个对象就是UIApplication对象
    • 我们只能通过[UIApplication sharedApplication]获得这个单例对象,不能够手动去创建它.
  • UIApplication作用?

    • 利用UIApplication对象,能进行一些应用级别的操作.
    • 可以设置应用程序图标右上角的红色提醒数字
    • 设置联网指示器的可见性
    • 可以设置应用程序的状态栏
    • 进行应用之间的跳转.
  • 模仿UIApplication单例.

要求:程序一启动就创建创建对象创建的对象只能通过share的方式获取对象.不能够进行alloc 操作,当执行alloc时, 程序发生崩溃

  • 1.程序一启动的时候就创建对象.当类被加载到内存的时候就会调用load的方法,它会比main优先调用
  • 2.保证调用alloc时会产生异常.重写系统的是alloc方法
  • 3.通过share方式获取对象

#import "Person.h"

@implementation Person

// 保证只创建一次,所以static修饰,让其保存到静态区
static Person *_person;

// 当类加载到内存中就会调用这个方法, 在main函数之前调用
+ (void)load {
    // 当类加载完毕就创建一个对象
    _person = [[self alloc] init];
}
+ (instancetype)sharedPerson {

    return _person;
}

+ (instancetype)alloc {

    // 如果_person有值.直接让程序挂掉,并输出异常信息
    if (_person) {

        // 创建异常
        NSException *exc = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one UIApplication instance." userInfo:nil];

        // 抛出异常
        [exc raise];
    }
    // 如果没有值.调用 [super alloc]按照系统默认处理
    return [super alloc];
}
@end

05-UIApplication功能

  • 1.设置应用提醒数字
// 取得UIApplication对象
    UIApplication *app = [UIApplication sharedApplication];
    // 从iOS8之后,需要自己先注册用户通知,才能接受提醒
    UIUserNotificationSettings *user = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
    // 注册通知
    [app registerUserNotificationSettings:user];
    // 设置提醒数量
    app.applicationIconBadgeNumber = 15;

技术分享
 
 
  • 2.设置连网状态
app.networkActivityIndicatorVisible = YES;

技术分享
 
  • 3.设置状态栏
    • 从iOS7之后,状态栏默认是交给控制器来管理
    • 需要修改工程的info.plist文件的View controller-based status bar appearance 为 NO
 
技术分享
 
  • 通常在开发当中都是应用程序来管理状态栏的.来做统一管理,不然的话, 会有很多个控制器.会非常的麻烦.
  • 想要让应用程序管理状态栏,要在info.plist当中进行配置,
  • 添加一个key值:是最后一个,View controller-based status bar appearance
  • 设置为NO.就是应用程序来管理了.
  • 通过UIApplication来管理状态.
// 隐藏状态栏
//    app.statusBarHidden = YES;

    // UIStatusBarStyleDefault        默认样式 黑色
    // UIStatusBarStyleLightContent   白色
    app.statusBarStyle = UIStatusBarStyleLightContent;

  • 控制器管理
// 控制器设置状态栏样式和隐藏状态栏
- (UIStatusBarStyle)preferredStatusBarStyle {

    return UIStatusBarStyleLightContent;
}

- (BOOL)prefersStatusBarHidden {

    return YES;
}

4.openURL

    // 打电话 tel:// 协议头 10010 指定电话
    NSURL *url = [NSURL URLWithString:@"tel://10010"];
    [app openURL:url];

     // 发短信
    NSURL *url2 = [NSURL URLWithString:@"sms://10010"];
    [app openURL:url];

    // 打开网页......邮件等等
    NSURL *url3 = [NSURL URLWithString:@"http://www.king129.com"];
    [app openURL:url3];

06- UIApplication代理和程序的启动流程.

  • 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。
  • 比如一个来电或者锁屏会导致app进入后台甚至被终止
  • 还有很多其它类似的情况会导致app受到干扰,在app受到干扰会产生一些系统事件,
  • 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件

  • delegate可处理的事件包括:

    • 应用程序的生命周期事件(如程序启动和关闭)
    • 系统事件(如来电)
    • 内存警告....等等
  • UIApplication会在程序一启动时候创建一个遵守UIApplicationDelegate代理.

  • 这个就是我们程序一创建时的AppDelegate类.AppDelegate就是遵守了UIApplicationDelegate协议.
  • 在这个类中很定义很多监听系统事件的方法.同时也定义了一些应用程序的生命周期方法.

主要方法有:

/**
 *  当程序启动完毕时,就会调用这个方法
 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    NSLog(@"%s", __func__);
    return YES;
}
/**
 *  当获失去焦点是就会调用
 */
- (void)applicationWillResignActive:(UIApplication *)application {

    NSLog(@"%s", __func__);
}
/**
 *  当程序进入后台时调用(比如按了 Home键)
 */
- (void)applicationDidEnterBackground:(UIApplication *)application {

    NSLog(@"%s", __func__);
}
/**
 *  当程序从后台切换到前台时
 */
- (void)applicationWillEnterForeground:(UIApplication *)application {

    NSLog(@"%s", __func__);
}
/**
 *  当程序获取焦点时调用
 */
- (void)applicationDidBecomeActive:(UIApplication *)application {

    NSLog(@"%s", __func__);
}
/**
 *  程序已经退出时调用
 */
- (void)applicationWillTerminate:(UIApplication *)application {

    NSLog(@"%s", __func__);
}
/**
 *  收到内存警告时调用.....
 */
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {

    NSLog(@"%s", __func__);
}

2.应用程序的程动原理

  • 底层原理为:
// 1.执行main --> UIApplicationMain
// 2.创建UIApplication对象,并设置他的代理
// 3.开启一个事件循环(主运行循环,死循环),保证程序一直运行
// 4.加载项目的info.plist文件,检查文件中是否有 Main ,如果有则加载 Main.storyboard,如果没有则执行\
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  程序启动完毕

int main(int argc, char * argv[]) {
    @autoreleasepool {

        // 第三个参数: 设置UIApplication对象的名称
        // 第四个参数: 创建代理对象, 遵守UIApplicationDelegate协议,并把这个对象设置为程序(UIApplication)的代理对象
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

07-UIWindow

  • UIWindow是一种特殊的UIView,通常在一个app中至少有一个UIWindow
  • iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,
  • 最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
  • 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

  • 在加载info.plist,判断下是否指定main,如果指定了,就会去加载StoryBoard.

    • 1.创建一个窗口
    • 2.加载MainStoryBoard,初始化一个控制器.
    • 3.把初始化出来的控制器设置为窗口的根控制器.让窗口显示到屏幕上.
  • 如果没有指定Mian话, 那这个时候就需要我们手动的去创建窗口.

  • 当info.plist文件没有找到的时候,那么程序就加载完毕,那么在程序加载完毕时要自己手动去创建窗口.
  • 在开发当中,通常都是手动去创建窗口.
  • 创建窗口,要有窗口显示,必须要有强引用.窗口也是控件,要想展示出来.必须得要有尺寸.
  • 在设置rootViewController的时候,会把控制器的View添加到窗口上面.
  • 在程序当中,状态栏和键盘,它都属性是一个窗口.可以通过打印的方式来验证.
  • 设置window的层级.
    • UIWindowLevelNormal它是一个CGFloat类型.
self.window.windowLevel = UIWindowLevelNormal;
// 层级关系
UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert

08-从StoryBoard加载控制器

//1.创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    //2.设置窗口根控制器
    //从StoryBoard当中加载控制器.
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    //加载StoryBoard当中剪头指向的控制器
     //UIViewController *vc =  [storyBoard instantiateInitialViewController];

    //加载指定标识的控制器.
    UIViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"VC"];


    self.window.rootViewController = vc;
    //3.显示窗口
    [self.window makeKeyAndVisible];

  • 设置storyboard的标示
 
技术分享
09-能过Xib加载控制器的View
  • 加载的步骤为:
    • 1.创建Xib
    • 2.往xib当中拖入一个控制器.
    • 3.设置Xib的file‘s owner类型为要设置的那个控制器.
    • 4.把View与file‘s owner连线. (注意, 只有设置了file‘s owner类型才能够进行拖线.)
 
 技术分享
// 1.创建window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    // 2.设置根控制器
    // 从xib中加载控制器
//    UIViewController *vc = [[SJViewController alloc] initWithNibName:@"SJViewController" bundle:nil];
//    self.window.rootViewController = vc;

    //指定名称为nil时.
    //1.如果指定名称.会先去加载指定名称的Xib.
    //2.如果没有指定xib名称,它会第一个先去找,跟它同名的xib.
    //如果没有同名,它会去找同名,去掉Controller的xib.
    //如果没有的话, 它会创建背景颜色为透明的View.
    //3.如果没有指定xib名称,它会自动加载SJViewController去掉Controller的xib.

//    UIViewController *vc = [[SJViewController alloc] initWithNibName:nil bundle:nil];

    UIViewController *vc = [[SJViewController alloc] init];

    // 控制器的init方法,底层实现原理就是调用 initWithNibName:
    self.window.rootViewController = vc;

    // 3.显示窗口
    [self.window makeKeyAndVisible];

技术分享

UI进阶--01

标签:

原文地址:http://www.cnblogs.com/king129/p/5008935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!