UI进阶--01

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];

时间: 2024-08-03 09:55:48

UI进阶--01的相关文章

UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天

这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 1 #pragma mark - 管理好友 2 // 获取管理好友的单例对象 3 XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance]; 4 // 用管理好友的单例对象初始化Roster花名册 5 // 好友操

UI进阶 XML解析适配 &#39;libxml/tree.h&#39;file not found 错误解决办法

Xcode 'libxml/tree.h'file not found 错误解决办法 在工程的"Build Settings"页中找到"Header Search Path"项,添加"/usr/include/libxml2".在"Other Linker Flags"项,添加"-lxml2" UI进阶 XML解析适配 'libxml/tree.h'file not found 错误解决办法

Android更新Ui进阶精解(二)

<代码里的世界> 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45115047 Android更新Ui进阶精解(一) android ui线程检查机制 Android更新Ui进阶精解(二) android 线程更新UI机制 1.回顾 第一篇讲了对Ui线程更新的方法和见解,然后接着讲了线程检查机制,这里来详细分析下更新Ui的核心--Android中消息系统模型.当然,这里要

IOS之--UI进阶-- 多控制器管理第一天

 iOS之--UI进阶-- 多控制器管理第一天 01-项目中常见的文件(LaunchScreen) Xcode5 框架是苹果事先已经导入进去的.在项目的结构当中就能够看到导入的框架. Xcode6 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架. LaunchScreen.xib:用来设置启动界面. Xcode7 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架. LaunchScreen.storyBoard LaunchScreen原理: 会自动加载Launch

UI进阶 XML解析适配 引入GDataXML文件时候 &#39;libxml/tree.h&#39;file not found 错误解决办法

在工程的"Build Settings"页中找到"Header Search Path"项,添加"/usr/include/libxml2". 在"Other Linker Flags"项,添加"-lxml2" 同理引入别的类型文件不匹配的时候也可以用这种方法 UI进阶 XML解析适配 引入GDataXML文件时候 'libxml/tree.h'file not found 错误解决办法

android UI进阶之实现listview中checkbox的多选与记录

今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个清单页面,我们需要记录用户勾选了哪些条目.这个的实现并不太难,但是有很多朋友来问我如何实现,他们有遇到各种各样的问题,这里就一并写出来和大家一起分享. ListView的操作就一定会涉及到item和Adapter,我们还是先来实现这部分内容. 首先,写个item的xml布局,里面放置一个TextView和一个CheckBox.要注意的时候,这里我设置了C

android UI进阶之实现listview的分页加载

 分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一下子全部加载用户未读的微薄这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了.通过分页分次加载数据,用户看多少就去加载多少. 通常这也分为两种方式,一种是设置一个按钮,用户点击即加载.另一种是当用户滑动到底部时自动加载.今天我就和大家分享一下这个功能的实现. 首先,

ios开发-UI进阶-核心动画-时钟动画小案例

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 今天使用CALayer的"定位点(锚点)"实现了一个时钟动画,其实就是一个小的时钟,只是实现了功能,没有做出绚丽的效果.使用UIView实现的,其实只是单纯的使用layer也可以实现.主要用到了 Quartz2D画图\ 事件处理\核心动画方面的知识. 代码不是很多,直接附上源码,注释比较详细,在源码后面再进行解释其中的一些知识点和注意点. 下图为应用截图,使用gif,没有制作

IOS开发——UI进阶篇(十七)CALayer,核心动画基本使用

一.CALayer简介 1.CALayer在iOS中,文本输入框.一个图标等等,这些都是UIView你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 @property(nonatomic,readonly,retain) CALayer *layer; 当UIView需