一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
Xcode5与Xcode7的区别
1.Xcode5有个FrameWorks,存放框架。 Xcode7 自动导入框架,用到什么框架时,自动导入框架。 2.Xcode7当中多了一个LaunchScreen.storyboard,用来设置启动页面,如果没有设置启动页面,默认它的屏幕的大小是4s大小。 LaunchScreen底层实现:把LaunchScreen.storyboard当中内容,生成一张图片。 3. info.plist,名称发生了变化,而且放到了外面。 4. 在Xcode7当中没有了PCH文件
PCH 文件
iOS_test/PrefixHeader.pch
UIApplication
一个iOS程序启动后创建的第一个对象就是UIApplication对象。 他是一个单例 利用它可以,进行一些应用级别的操作。
UIApplication 的常用属性
设置应用程序图标右上角的红色提醒文字 applicationIconBadgeNumber;
设置联网指示器的可见性 networkActivityIndicatorVisible;
iOS7中的状态栏 从iOS7开始,系统提供了2种管理状态栏的方式 通过UIViewController管理,每一个UIViewController都可以拥有自己不同的状态栏。 通过UIApplication管理(一个应用程序的状态栏都由他统一管理)
在iOS7中,默认情况下,状态栏都由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式。 状态栏的样式
preferredStatusBarStyle;
状态栏的可见性 prefersStatusBarHidden;
UIApplication 和 delegate
所有的移动操作系统都有个致命的缺点:app很容易受到打扰,比如一个 来电或者锁屏会导致app进入后台甚至被终止。
还有很多其他类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。
delegate可处理的事件包括: 应用程序的生命周期(如程序启动和关闭) 系统事件(如来电) 内存警告
// 应用程序启动完成时调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
\
NSLog(@"%s",__func__);
return YES;
}
// 应用程序将要失去焦点时调用
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"%s",__func__);
}
// 应用程序进入后台时调用
- (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__);
}
应用程序启动原理
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
// 第三个参数:设置是应用程序对象的名称UIApplication
// 或者是它的子,如果是nil,默认是UIApplication
// 第四个参数:
// NSStringFromClass: 将类名转成字符串。
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
/**
1. 执行main函数
2. 执行UIApplicationMain, 创建UIApplication对象,并设置UIApplication它的代理。
3. 开启一个事件循环,(主运行循环,死循环:保证用户不退出)
4. 去加载info.plist文件(判断info.plist文件中有没有Main,如果有,去加载Main.storyboard)
5.应用程序启动完毕。(通知代理应用程序启动完毕)
*/
}
UIWindow
UIWindow 是一种特殊的UIView,通常在一个app中至少有一个UIWindow iOS程序启动完毕后,创建的第一个试图控件就是UIWindow,接着创建控制器的view, 最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了。
一个iOS 程序之所以能显示到屏幕上,完全是因为它有UIWindow
也就是说,没有UIWindow,就看不见任何UI界面。
- 如果有Main,他会加载Main.storyBoard。
- 先创建一个窗口
- 把Main.storyBoard,箭头指向的控制器,设为窗口的跟控制器。
- 显示窗口(把窗口的跟控制器的View,添加到窗口)
#import "AppDelegate.h"
@interface AppDelegate ()
@property (strong, nonatomic) UIWindow *window1;
@end
@implementation AppDelegate
// 应用程序启动完成时调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1. 创建窗口
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
// 2. 一个窗口必须得有跟控制器(设置窗口的跟控制器)
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = vc;
// 3. 显示
[self.window makeKeyAndVisible];
NSLog(@"%s",__func__);
/**
makeKeyAndVisible
1. 设置应用程序的主窗口
2. 让窗口显示,把窗口hidden = no
3. 把窗口的跟控制器的view添加到窗口上
[self.window addsubView:rootViewController.view];
*/
// 键盘状态栏,其实都是UIWindow
self.window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 20, 375, 40)];
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor blueColor];
self.window1.rootViewController = vc1;
[self.window1 makeKeyAndVisible];
// 设置窗口层级
//UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal
self.window1.windowLevel = UIWindowLevelStatusBar;
self.window.windowLevel = UIWindowLevelAlert;
return YES;
}
@end