首页 > 代码库 > UI零碎知识

UI零碎知识

 

 
2、
修改一个视图的bounds,可以在滑动视图中使用(比如新闻的下滑获取更多内容),通过修改父视图的bounds,来达到修改子视图位置的目的(相对位置)
 
3、
左上角为视图的起始点
 
view.frame是指:这个视图在父视图坐标系中的起始点坐标(x,y)和大小(height,wide)
修改(x,y)时改变了自己的在父视图坐标系统(bounds坐标系统)的位置,自身位置和子视图位置都会被改变。
view.bound是指:这个视图在自己产生的坐标系中的起始点的坐标(x,y)和大小(height,wide)一般一个视图以自己左上角为自己产生的坐标系的原点
     修改(x,y)时只影响“子视图”相对屏幕的位置,修改时不会影响自身相对屏幕的位置
4、
如果一个视图执行了removeFromSuperview方法,那么这个视图的子视图也将被移除
5、
【UI概述】

UI(User Interface):用户界面,用户能看到的各种各样的页面元素。iOS App = 各种各样的UI控件 + 业务逻辑和算法。想要开发出一款精美的应?程序,需要熟练掌握各种UI控件的用法。

6、      【UIWindow】

window是窗口,每个app都需要借助window将内容展现给用户看。

在iOS中,使用UIWindow类来表示窗口,通常一个应?程序只创建 一个UIWindow对象。

 

window的主要作用是呈现内容给用户,我们不会对window做太多操作。

7、

当一个button的透明度变成0后,他就不能点了。

8、

基类和抽象的类(比如UIControl)一般不创建自己的对象,而通过其子类创建子类的对象。
 
9、
  self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
类似这样的格式,需要在以后再执行一次[_window release];因为alloc以后那块内存0->1,self.window调用了setter方法,那块内存1->2.
 
 
24、
在类的内部重写的dealloc方法是本类对象的dealloc方法,而不是本类实例变量的dealloc方法,实例变量有自己的dealloc方法,并在系统内部实现。
25
 
UI中AppDelegate.m中自动生成各个方法的作用
 
当应用程序加载完成时触发
 
- ( BOOL )application:( UIApplication *)application didFinishLaunchingWithOptions:( NSDictionary *)launchOptions
 
当应用程序将要取消活跃状态时触发
 
- ( void )applicationWillResignActive:( UIApplication *)application
 
当前应用程序已经进入后台时触发 ( 应用程序在后台挂起
 
)
 
- ( void )applicationDidEnterBackground:( UIApplication
 
*)application
 
当应用程序将要进入前台时触发 ( 程序将要成为活跃状态时触发
 
)
 
- ( void )applicationWillEnterForeground:( UIApplication
 
*)application
 
应用程序已经是活跃状态 ( 当前正在运行 )
 
- ( void )applicationDidBecomeActive:( UIApplication *)application
 
应用程序将要结束时触发
 
- ( void )applicationWillTerminate:( UIApplication
 
*)application
 
各个方法执行顺序的例子
 
如例,手机正在运行一个程序时,突然来电话
 
当有电话进入时程序流程 :applicationWillResignActive:
 
1. 拒绝时
 
应用程序状态 : applicationDidBecomeActive:
 
2. 接通电话
 
应用程序状态
 
: applicationDidEnterBackground:
 
处理屏幕旋转时常用方法
 
当对视图控制器的 view 重新布局时 , 触发
 
- ( void )viewWillLayoutSubviews
 
用来设置当前视图控制器 ,
 
是否支持旋转
 
- ( BOOL
 
)shouldAutorotate
 
设置屏幕旋转的方向 , 支持三个方向 , 竖直方向 , 左横屏 , 右横屏
 
- ( NSUInteger )supportedInterfaceOrientations
 
 
25 【ios程序启动流程】
 
任何一个程序,无论是基于Mac OS还是iOS,程序都是从main.m文件的main函数开始执行的。
 
int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
    }
}
?执行UIApplicationMain函数时做了跳转,转到了AppDelete中
 
UIApplicationMain在程序入口函数main函数中调用,主要实现了3个功能: 创建应?程序(UIApplication)实例, 创建应用程序代理实例。
建立事件循环(runloop:死循环,不断检测程序运?行状态,是否被触 摸、晃动等)
 
 
 
 
26
 
【UIApplicationMain剖析】
int UIApplicationMain (!
   int argc,!
   char *argv[],!
   NSString *principalClassName,!
   NSString *delegateClassName!
);!
 
1、principalClassName:应用程序对象的类名(UIApplication或其?子类)
2、delegateClassName:应?用程序delegate的类名。(任何接受了 UIApplicationDelegate的类)! UIApplicationMain根据上述两个类名创建应?用程序实例、应用程序代理实例。然后建立事件循环(runloop),检测程序的各种事件(程序开始启动,接收到触摸等等)
27
    type和Mode通常都是枚举类型的
28
导航控制器可以认为是管理控制器的控制器,主要管理有层级关系的控制器
29
UINavigationController继承于UIViewController,以栈的方式管理所控制的视图控制器,至少要有一个被管理的视图控制器,这个控制器我们称作,导航控制器的根视图控制器。
30
UINavigationController通过栈的?方式管理控制器的切换,控制?入栈和出栈
来展?示各个视图控制器。 UINavigationController的ContentView?里始终显?示栈顶控制器的view。
viewControllers属性存储了栈中的所有被管理的控制器
navigationController属性,?父类中的属性,每个在栈中的控制器,都能通 过此属性,获取?自?己所在的UINavigationController对象。
 
ushViewController:animated //进?入下?一个视图控制器
 popViewControllerAnimated: //返回上?一个视图控制器
 popToViewController:animated //返回到指定的视图控制器
 popToRootViewControllerAnimated //返回到根视图控制器
 
viewControllers //所有处于栈中的控制器 
topViewController //位于栈顶的控制器 
visibleViewController //当前正在显?示的控制器
 navigationBar //导航条
 
navigationBar—导航条,iOS7之后默认是透明的,iOS7之前默认是不
透明的。 navigationBar在透明情况,与contentView会重合?一部分区域。
navigationBar在不透明情况,contentView跟在navigationBar的下?面。 navigationBar竖屏下默认?高度44,横屏下默认?高度32.
 
UINavigationBar除了能定义?自?身的样式外,还管理?一组
UINavigationItem。 与UINavigationController相似,UINavigationBar也是以栈的?方式管
理?一组UINavigationItem。提供push和pop操作item。
每个视图控制器都有?一个navigationItem属性。navigationItem中设 置的左按钮、右按钮、标题等,会随着控制器的显?示,也显?示到 navigationBar上
 
UINavigationItem属于MVC中的M。封装了要显?示在UINavigationBar上
的数据。
title //标题
titleView //标题视图 leftBarButtonItem //左按钮 rightBarButtonItem //右按钮
 
使?用属性传值解决从前往后传值的问题 使?用delegate解决从后往前传值的问题
 
 


 
1、
实现一个功能,不是难事。写出高质量的代码却不是任何程序员都能做到的事。高质量代码特点:可复用,可移植,精炼等。
2、 【自定义视图】
自定义视图:系统标准UI之外,自己组合而出的新的视图。
iOS提供了很多UI组件,借助它们,我们可以做各种程序。
尽管如此,实际开发中,我们还需自定义视图。积累自己的代码库。 方便开发。自己封装的视图,能像系统UI控件?样,用于别的项目 中,能?大降低开发成本,提高开发效率。
 
自定义视图的创建步骤
根据需求的不同,自定义视图继承的类也有所不同。一般自定义的视图会继承于UIView。以下是自定义视图的要点: 
1、创建一个UIView子类
2、在类的初始化方法中添加子视图 
3、类的.h?文件提供一些接口(方法),便于外界操作?视图。
 
假设我们使用LTView类代表label-textfield视图。 我们创建一个LTView类继承于UIView。 我们将LTView作为一个容器,在LTView的初始化方法中创建并添加 label和textField。 此时的LTView就变成了一个具有label和textField的视图了。
把Label和Textfield封装到LTView中,在一定程度上简化了我们的代码。
往往我们需要对LTView中的Label或者Textfield进行一定的控制,比如:设置Label的text,获取Textfield的text,给Textfield指定 delegate,设置textColor等。
为了方便外界操作Label和Textfield,因此我们要为外界提供一些?法。
 
自定义LTView使用了一种设计模式:复合设计模式。
复合设计模式:A类中,使用B类(或者更多类)作为自己的成员(实例变量)。
iOS中复合是特别常见的设计模式。iOS新控件往都是?已有控件组合而成的。
3、
【视图控制器】
UIViewController:视图控制器。
 控制视图显示,响应事件。
 分担AppDelegate的?作。 
实现模块独?,提高复用性。
视图控制器的功能
控制视图大小变换、布局视图、响应事件。
检测以及处理内存警告。
检测以及处理屏幕旋转。
检测视图的切换。
4、
【MVC】
UIViewController是MVC设计模式的核心。
MVC是一个框架级的设计模式。
 M是Model,主要用于建立数据模型(即数据的结构) 
V是View,我们能看到的所有控件都是view,view主要的功能是展?数据。
 C是控制器,主要是控制M和V的通信。
技术分享
 
5、
 
 
 
 
【使用视图控制器】
定义UIViewController的子类
创建视图控制器对象,作为window的根视图控制器 
在viewDidLoad中使?用默认创建好的视图对象view
 
6、
【视图控制器指定自定义view】
 
为什么使用自定义视图
UIViewController自带一个空的view,与需求不符合。 
视图控制器只负责控制视图显示,响应事件。
?
如何设置
自定义视图类继承UIView。在初始化方法中添加子视图控件。
重写controller的loadView?方法。创建自定义视图对象,并指定为controller 的view。
将子视图控件对象设置为自定义视图类的属性,在viewDidLoad方法中进 行设置:添加action、设置delegate等。
在controller中添加按钮点击事件实现和代理方法的实现。
7、
【检测屏幕旋转】
 
视图控制器本身能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写几个方法:
1. supportedInterfaceOrientations(设置设备?支持旋转的?方向)
2. willRotateToInterfaceOrientation:duration:(暂停?音乐、关闭视图交互等)
3. willAnimateRotationToInterfaceOrientation:duration:(添加?自定义动画 等)
4. didRotateFromInterfaceOrientation:(播放?音乐、打开视图交互等)。
【视图处理】
注意视图控制器会?自动调整view的大小以适应屏幕旋转,bounds被修改,触发view的layoutSubviews方法。
view重写layoutSubviews?方法,根据设备?方向,重新布局。
[UIApplication shareApplication].statusBarOrientation提供设备当前方向。
8、
【处理内存警告】
 
控制器能监测内存警告,以便我们避免内存不够引起的crash。 在定义的controller?类中重写didReceiveMemoryWarning方法。 释放暂时不使用的资源。(数据对象、图像)
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
!
//根视图已经加载过,根视图未显示
   if (!self.view.superview && self.isViewLoaded)
    {
        self.view = nil;
        self.view = nil;
        self.titleLabel = nil;
        self.button = nil;
    }
 
9、
【视图控制器容器】
 
self.view显?示:viewWillAppear: 和 viewDidAppear:
self.view消失:viewWillDisappear: 和 viewDidDisappear:
当self.view添加到?父视图上时,执?行appear?方法: 当self.view从?父视 图上移除时,执?行disappear?方法。
 
演示执行顺序
定义FirstViewController、SecondViewController类,first作为window 的根视图控制器。
将SecondViewController的view添加到FirstViewController的view上。 将SecondViewController的view移除。 查看SecondViewController中4个?方法的执?行顺序。
 
10、
【总结】
iOS提供了很多标准组件,标准组件完成我们的需要,但是适当的 封装,组合?一个新的控件?无疑能给我们带来效率上的提?高。学会?自
定义控件是你成为?高?手的关键?一步。 视图控制器是MVC中的C,?用于处理视图触发的事件。 
处理旋转和内存警告


 
 
6、
应用程序代理
应?程序代理,主要检测应用程序的状态并做出相应的处理。
应用程序的状态有很多,比如:程序启动、进?活跃状态、进到后台、内存警告、收到远程消息等等
任何接受了UIApplicationDelegate协议的对象都可以成为应?用程序代理。
 一旦应用程序的某种状态触发,就会执行相应的代理方法。
技术分享
 
7、
【UIWindow】
UIWindow作为应用程序的窗口,在应用程序启动的时候就要加载,
各种UI界面都是借助window来呈现的。 UIWindow在创建的时候,应该和屏幕一样大。通过[UIScreenmainScreen].bounds可以获得屏幕大小。
[self.window makeKeyAndVisible];//让window变的可视,即显示 window。
 
8、 总结
UILabel、UITextField、UIButton都是特别常用的控件。
他们都是直接或者间接继承于UIView,只是外观和功能不同。 熟悉各种控件的特点和方法是我们后期做项?的保障。 delegate是iOS重要的设计模式,理解它的原理,有助于写出优质代码
main函数是程序的入口。UIApplicationMain函数创建了应用程序实例,应用程序代理实例,建立事件循环。
 
 
 
 
 

 1
事件的基本概念
UIEvent:事件,是由硬件捕捉的?个表示用户操作设备的对象。
分三类:触摸事件、晃动事件、远程控制事件
2、
【触摸事件】
触摸事件:用户通过触摸设备屏幕操作对象、输入数据。支持多点触摸,包含1个到多个触摸点
UIView支持触摸事件(因为继承于UIResponder),而且支持多点触摸。
需要定义UIView子类,实现触摸相关的方法。
touches..began、touches..moved、touches...ended、 touches..canceled。
 
UITouch代表触摸在屏幕上的一根手指。可以获取触摸时间和触摸位置。
如何获取touch对象。touches集合中包含了视图上的所有手势。
3、
【响应者链】
由多个响应者对象组成的链。
 
UIResponder。响应者类。
iOS中所有能响应事件(触摸、晃动、远程事件)的对象都是响应者。
系统定义了一个抽象的父类UIResponder来表示响应者。其子类都是响应者。
检测触碰视图
硬件检测到触摸操作,会将信息交给UIApplication,开始检测。
UIApplication -> window -> viewController -> view(视图控制器的view) -> 检测所有子视图
 最终确认触碰位置,完成响应者链的查询过程。
处理触碰事件
检测到响应者后,实现touchesBegan:withEvent:等方法,即处理事件。
如果响应者没有处理事件,事件会向下传递。如果没有响应者处理,则丢弃触摸事件。
事件处理的顺序与触摸检测查询相反。
触摸的子视图 -> view(视图控制器的view) -> viewController -> window -> UIApplication
 
响应者链可以被打断。无法完成检测过程。
例如:视图类的属性 : userInteractionEnabled。关闭后能阻断查询过程。
4、
一个类 可以有 多个 初始化方法 其中一定会被调用的初始化方法 称为 指定初始化方法
 
 


1、
耦合是衡量一个程序写的好坏的标准之一, 耦合是衡量模块与模块之间关联程度的指标 “高内聚,低耦合”是面向对象编程的核心思想,便于后期开发维护。
2、
代理设计模式
当一个类的某些方法需要被别的类来实现,但是既不明确是些什么方法,又不明确谁来实现这些方法的时候,代理模式就可以派上?场。目的是为了降低模块之间的耦合性。
3、
delegate也是用来解耦的,它不再简简单单让目标去执行一个动作了而是delegate去处理一些列事件、就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑、return按钮点击等等。
 
代理使用场景
控件有一些列时间点,控制器可以实现这个代理?方法,以便在适当的时机做适当的事
    
5、
uiimage 是图片,不是控件;他的父类为NSObject;UIImageView是加载图片的控件,父类为UIView
6、
【手势识别器】
手势识别器是对触摸事件做了封装,我们无需?己去判断某个手势是否触发,手势识别器本身起到了识别作用,我们把重心放在识别之后要做什么操作上面。 手势识别器是iOS中比较抽象的一个类,用于识别一个手势,所谓手势:有规律的触摸。
UITapGestureRecognizer是轻拍手势识别器,能识别轻拍操作
UILongPressGestureRecognizer是长按手势识别器,能识别长按操作。
UIRotationGestureRecognizer是旋转手势识别器,能识别旋转操作。               
UIPinchGestureRecognizer是捏合手势识别器,能识别捏合操作。
UIPanGestureRecognizer是平移?势识别器,能识别拖拽操作。
UISwipeGestureRecognizer是轻扫手势识别器,能识别拖拽操作。
UIScreenEdgePanGestureRecognizer是屏幕边缘轻扫识别器,是iOS7中新增的?手势。
手势识别器的使用
我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象。
 
【记住这五步】
1、创建UIxxxGestureRecognizer对象,使用initWithTarget:action:?法;
2、配置要识别的手势的相关信息;
3、将?势添加到某个视图上;
4、实现手势识别器里定义的方法
5、将对象release掉
7、
view的transform属性
transform是view的一个重要属性,它在矩阵层面上改变view的显?状态,能实现view的缩放旋转平移等等功能。
8、
【总结】
target...action和delegate是很重要的设计模式,务必理解原理以及熟练使用 ,手势识别器是很常用的类,在日常开发中经常使用,需要牢记每个手势识别器的特点以及注意事项 transform是view的重要属性,在屏幕旋转?面用的比较多。
9、
 
  为了降低一个类的耦合性,我们通常可以使用target/action设计模式或者Delegate设计模式,他们都有自己显著的特征和不同点
 
1.target/action设计模式:为一个类绑定对象以及其响应方法,其灵活之处在于响应方法可以完成全自定义,当该类的对象需要做出相关操作或者响应时,就由绑定的对象去执行对应的方法,Target-action----这个设计模式用按钮,等控件把用户的交互变成代码,让程序可以执行; 
 
2.delegate设计模式:通过为一个类提供相关协议,并指定代理对象来完成解耦,即当该类的对象需要做出响应时,会去判断自己的代理对象是否存在并且判断是否能够响应指定的协议方法,若条件成立,则让代理对象执行该协议方法,相比较target/action,处理操作的方法是固定的协议方法,但是多参方法可以通过参数传递更多的数据给代理对象
 
 
 
栈内存的管理方式
 
地址:从低到高分配
从高到低存取(即从当前最高的地址往低开始取数据) 
 
 
10想要使用一个类的私有变量,可以在本类中#import这个类的.h文件

UI零碎知识