一、UIView详解
Command+Alt+Enter -> 显示ViewController
按住Ctrl直接把UIView拖到ViewController
1.1 UIView的常见属性
@property(nonatomic,readonly) UIView *superview;
获得自己的父控件对象
@property(nonatomic,readonly,copy) NSArray *subviews;
获得自己的所有子控件对象
@property(nonatomic) NSInteger tag;
控件的ID,父控件可以通过tag来找到对应的字控件
@property(nonatomic) CGAffineTransform transform;
控件的形变属性(可以设置旋转角度、比例缩放、平移)
@property(nonatomic) CGRect frame;
控件矩形框在父控件中的位置和尺寸(以父控件的左上角为坐标原点)
@property(nonatomic) CGRect bounds;
控件矩形框的位置和尺寸(以自己左上角为坐标原点,所以bounds的x,y一般为0)
@property(nonatomic) CGPoint center;
控件中点的位置(以父控件的左上角为坐标原点)
二、UIViewController详解
2.1 UIViewController
//当控制器加载完毕时调用
- (void) viewDidLoad;
//当控制器的view即将显示的时候调用
- (void) viewWillAppear:(BOOL) animated;
//当控制器的view显示完毕时调用
- (void) viewDidAppear:(BOOL) animated;
//当控制器view将要布局子控件时调用
- (void) viewWillLayoutSubviews;
//当控制器的view布局子控件完毕时调用
- (void) viewDidLayoutSubviews;
//当控制器的view即将消失时调用
- (void) viewWillDisapper:(BOOL) animated;
//当控制器的view消失完毕时调用
- (void) viewDidDisappear;
//当控制器受到内存警告时调用
- (void) didReceiveMemoryWarning;
2.2 多控制器
一个iOS的app很少只由一个控制器组成
当app中有很多个控制器的时候,我们就需要对这些控制器进行管理
有多个view时,可以用1个大的view去管理一个或多个小view
控制器也是如此,用1个控制器去管理其他多个控制器
为了便于管理控制器,iOS提供了2个比较特殊的控制器
UINavigationController和UITabBarController
<1> UINavigationController
view结构
导航条
栈顶控制器的view
UINavigationController的简单使用
>初始化UINavigationController
>设置UIWindow的rootViewController为UINavigationController
>根据具体情况,通过push方法添加对应个数的字控制器
UINavigationController的子控制器
>UINavigationController以栈的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
>使用push方法能将某个控制器压入栈
- (void) pushViewController:(UIViewController*):viewController animated:(BOOL)animated;
>使用pop方法可以移除控制器
将栈顶的控制器移除
- (UIViewController*) popViewControllerAnimated:(BOOL)animated;
回到指定的子控制器
- (NSArray*) popToViewController:(UIViewController*) viewController animated:(BOOL)animated;
回到根控制器(栈底控制器)
- (NSArray*) popToRootViewControllerAnimated:(BOOL)animated;
如何修改导航条的内容
导航条的内容由栈顶控制器的navigationItem属性决定
UINavigationItem有以下属性影响着导航条的内容
>左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
>中间的标题视图
@property(nonatomic,retain) UIView *titleView;
>中间的标题文字
@property(nonatomic,copy) NSString *title;
>左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
>右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
<2> UITabBarController
使用步骤
> 初始化
> 设置UIWindow的rootViewController为UITabBarController
> 根据具体情况,通过addChildViewController方法添加对应个数的子控制器
添加子控制器的方式有2种:
> 添加单个子控制
- (void)addChildViewController:(UIViewController*)childController;
> 设置子控制器数组
@property(nonatomic,copy) NSArray *viewControllers;
view结构
UITabBarController默认显示第一个子控制器
三、程序框架原理及工程文件概念
3.1 LaunchScreen文件
用来设置启动页面,如果不设置,默认它的屏幕大小是4s的尺寸
也可以不从LaunchScreen.storyboard加载启动图
把启动图添加到LaunchImage里的
指定LaunchImage 启动图里的各个尺寸
3.2 info.plist文件
设置app的配置信息,它是一个字典
Bundle name : 应用程序的名称
Bundle identifier : 应用程序的唯一标识
Bundle versions string,short : 版本号
Bundle version : 应用程序打包版本号
3.3 PCH文件
首先在工程新建一个PCH文件
然后 在Build Settings 下
设置 Apple LLVM - Language 的 Precompile Prefix Header 和 Prefix Header
a.存放一些公有的宏
#define ScreenW [UIScreen mainScreen].bounds.size.width
b.导入公用的头文件
#import "UIView+frame.h"
c.自定义log
#ifdef DEBUG
#define LOG(...) NSLog(__VA_ARGS_)
#else
#define LOG(...)
#endif
3.4 UIApplication
每一个应用都有自己的UIApplication ,而且是单例的
通过[UIApplication sharedApplication] 可以获得这个单例对象
一个iOS程序启动后创建的第一个对象就是UIApplication对象
> 设置应用程序图标右上角的红色提醒数字
iOS 8之后需要先注册用户通知
@property(nonatomic) NSInteger applicationIconBadgeNumber;
UIApplication *app = [UIApplicationsharedApplication];
UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadgecategories:nil];
[app registerUserNotificationSettings:notice];
app.applicationIconBadgeNumber =1;
> 设置联网指示器的可见性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible)
BOOL networkActivityIndicatorVisible;
> 设置状态栏
从iOS7开始,系统提供了2种管理状态栏的方式
> 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)
> 通过UIApplication管理 (一个应用程序的状态栏由它统一管理)
在iOS7中,默认情况下,状态栏都是由UIViewController管理的
UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式
> 状态栏的样式
- (UIStatusBarStyle)preferredStatusBarStyle;
> 状态栏的可见性
- (BOOL)preferredStatusBarHidden;
设置通过UIApplication管理状态栏,需要在Info.plist中添加 设置为NO
app.statusBarHidden =YES;
app.statusBarStyle =UIStatusBarStyleLightContent;
> 打开网页openURL
- (BOOL)openURL:(NSURL*)url;
>打电话
[app openURL:[NSURL URLWithString:@"tel://10086"]];
>发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];
>发邮件
[app openURL:[NSURL URLWithString:@"mailto:[email protected]"]];
>打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
> UIApplication和delegate
所有的移动操作系统都有个致命的缺点:
app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止。
在app受到干扰时,会产生一些系统事件,
这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
delegate可处理的事件包括:
> 应用程序的生命周期事件(如程序启动,关闭)
> 系统事件 (如来电)
> 内存警告
3.5 UIWindow
UIWindow是一种特殊的UIView,通常在一个app中至少有一个UIWindow
iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view
最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
窗口创建流程:
1> 如果Info.plist中的Main storyboard file base name 设置为 Main
它会加载Main.storyboard,如果为空,不加载Main.storyboard
2> 先创建一个窗口UIWindow
3> 把Main.storyboard箭头指向的控制器,设为根控制器
4> 显示窗口(把控制器的view,添加到窗口)