UIView 面面观
原创:转载请注明出处
1.UIView: 一个视图对象控制该区域的渲染,同时也控制内容的交互。
2.UIView的功能就是:展示、渲染、交互
3.UIView 和很多其他视图控件的默认tag值是0,所以我们设定tag值时一定不能取0 ,实际应用中一般使用宏定义设定tag值以方便管理
4.UIViewController 的功能倾向于管理、切换、传递
5.视图也可以客串视图控制器的角色,但对于复杂的功能,使用视图控制器能更好地掌控视图的层次和生命周期。尤其是很多视图控制器封装了各自独特的功能
6.UIViewController 生命周期
- (void)viewDidLoad{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
}
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
}
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
}
- (void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
}
//支持转屏
- (BOOL)shouldAutorotate{
return YES;
}
//支持转屏的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
7.视图控制中期的切换由一个视图控制器切换到另一个视图控制器有很多种方法;如:[self addChildViewController: test]; 如果参数中的视图控制器已经有了父控制器,它将先从父控制器中移除 。一般情况下,我们在切换视图控制器的同时进行视图的切换
8.每个导航控制器都有一个根视图控制器,推送到一个视图控制器,会进行界面的控制权的移交,但是上一个控制器存在于栈中,不会释放
9.直接在AppDelegate中构建导航控制器是一个不错的选择,这样我们就可以在程序的任何视图控制器中做推送,并且使用UINavigationController自带的动画
[(UINavigationController *) [UIApplication sharedApplication].keyWindow.rootViewController pushViewController:viewController animated:YES];
10.UIView 类定义了几个内在支持动画的属性声明,当这些属性发生改变时,视图为其变化提供内建的动画支持
frame ————视图的边框矩形,位于父视图的坐标系中
bounds ———— 视图的边界矩形,位于视图的坐标系中
center ————— 边框的中心,位于父视图的坐标系中
transform —————视图上的转换矩阵,相对于视图边界的中心
alpha———————视图的alpha值 ,用于确定视图的透明度
11.UIView动画作为一个完整的事务一次性运行,它不会阻塞主线程,它是在独立的线程中执行 的。正在执行动画的视图是无法交互的,若想实现交互,可改变UIViewAnimationOptionAllowUserInteraction的值
动画快可以被嵌套,但是在最外层的动画块提交之前,被嵌套的动画不会被执行
UIView类方法配置动画参数
+ (void)setAnimationStartDate:(NSDate *)startDate; //设置动画在commitAnimation方法返回之后的发生日期。缺省行为是使动画立即在动画线程中执行
实例:
/**
* 调用UIGraphicsGetCurrentContext() 会返回当前视图堆栈顶部的图形上下文,图形上下文在抽象的绘图调用和屏幕(或图像)实际的像素之间建立一种虚拟的链接,传递一个nil给这个函数,也不会产生错误的结果 */
CGContextRef context = UIGraphicsGetCurrentContext();
//动画块调用开始
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:2.0];
[self.view setAlpha:0.9f];
//动画块提交——--> > UIKit执行动画
[UIView commitAnimations];
注:UIKit在一个独立的和应用程序的主事件循环分离的线程中执行动画。commitAnimations 方法将动画发送到该线程,动画随之进入线程中的队列,直到被执行。缺省情况下,只有在当前正在运行的动画块执行完成后,Core Animation 才会启动队列中的动画。但可通过动画块中+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; 方法重载这个行为,使动画立即启动。这样会停止当前正在执行的动画,从而使新动画在当前状态下开始执行; + (void)setAnimationsEnabled:(BOOL)enabled; 方法可暂时禁止动画
12.动画回调:视图动画可通知其委托:当前状态的改变,即动画已经开始或结束。在需要捕获动画结束事件并开始序列中下一段动画时这个功能非常有用。
+ (void)setAnimationDelegate:(nullable id)delegate; 设置委托方法
注:
默认情况下动画结束后会会触发下面的方法
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; //finished这个参数表示动画是否正常结束
动画开始时会触发下面的方法
- (void)animationDidStart:(CAAnimation *)anim;
若要设置手动回调就要提供要发送给委托的选择器
+ (void)setAnimationWillStartSelector:(nullable SEL)selector;
+ (void)setAnimationDidStopSelector:(nullable SEL)selector;
13.过渡动画
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // current limitation - only one per begin/commit block —>指定该动画块的过渡效果
14.触摸
所有视图类都可以对触摸做出响应,触摸事件从视图最外层往下传递,直到某个视图接受并处理该事件。触摸事件将会触发如下5个回调方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //用户开始触摸屏幕
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //用户在屏幕上移动手指
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //用户手指离开屏幕
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //触摸事件意外中断,(如程序退出)
- (void)touchesEstimatedPropertiesUpdated:(NSSet * _Nonnull)touches NS_AVAILABLE_IOS(9_1); //9.1之后加入的3D触摸事件
15.手势 UIGestureRecognizer的衍生类
UITapGestureRecognizer — 点击手势
UIPinchGestureRecognizer — 两个手指往内或往外波动手势
UIRotationGestureRecognizer —旋转手势
UISwipeGestureRecognizer —-滑动、快速移动手势
UIPanGestureRecognizer —- 拖动。慢速移动手势
UILongPressGestureRecognizer — 长按手势
16.手势状态:
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, //>>默认,尚未识别
UIGestureRecognizerStateBegan, //>>手势开始,已被识别(瞬间)
UIGestureRecognizerStateChanged, //>>手势状态发生变化
UIGestureRecognizerStateEnded, //>>手势识别操作完成(已松开手指)
UIGestureRecognizerStateCancelled, //>>手势被取消,恢复默认
UIGestureRecognizerStateFailed, //>>手势识别失败,恢复默认
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
注:有不对和不足的地方请多留言指教!
UIView 面面观的更多相关文章
- UIView的layoutSubviews和drawRect方法何时调用
首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubvi ...
- iOS 自定义方法 - UIView扩展
示例代码 //#import <UIKit/UIKit.h>@interface UIView (LPCView)/** 上 */@property CGFloat top;/** 下 * ...
- UIView上的控件使用push方法跳转
有时候在项目中,为了保持前后页面的推进方式跳转方式一致,会在通过UIview上的控件跳到另一个Controller上,所以,这时候就需要用到这种方式了,当然,present方法可以实现跳转但是样式可能 ...
- IOS 杂笔-11(实现在外部无法改变UIView的size)
我想题目说的或许不是很清楚,那么现在我详细介绍一下这篇随笔内容. 在外部无法改变UIVIew控件的size. 这里说是UIView,但是事实上,是大多数控件而绝非仅UIView. 想要实现在外部无法改 ...
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
- 5. UIView
1. UIView 的初认识 官方文档 UIView class defines a rectangular area on the screen and the interfaces for man ...
- Swift - UIView,UItableView,Cell设置边框方法
// 设置边框的宽度 cell.layer.borderWidth = 1 // 设置边框的颜色 cell.layer.borderColor = UIColor.blackColor().CGCol ...
- iOS 使点击事件穿透透明的UIView
如图: 悬浮的三个按钮下方有一个可以点击的灰色区域,但是点击按钮之间的透明区域, 这三个按钮的contentView会响应这个点击事件,这时候需要让这个contentView不响应这个点击事件. 解决 ...
- iOS----自定义UIView,绘制一个UIView
绘制一个UIVIew最灵活的方式就是由它自己完成绘制.实际上你不是绘制一个UIView,你只是子类化了UIView并赋予子类绘制自己的能力.当一个UIVIew需要执行绘图操作的时,drawRect:方 ...
随机推荐
- Kmeans算法与KNN算法的区别
最近研究数据挖掘的相关知识,总是搞混一些算法之间的关联,俗话说好记性不如烂笔头,还是记下了以备不时之需. 首先明确一点KNN与Kmeans的算法的区别: 1.KNN算法是分类算法,分类算法肯定是需要有 ...
- iOS模拟器沙盒使用推荐
iOS沙盒路径的查看和使用 1.模拟器沙盒目录文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library.因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制 ...
- zen cart global $db 这噶哒
zen cart $db变量是mysql数据库类的对象,是一个全局变量.在zen cart系统里面的任何一个地方都可以使用这个对象来查询数据库获取数据库的内容.只要需要用到查询数据库,都可以使用这个对 ...
- /usr 的由来及/usr目录结
/usr 的由来及/usr目录结构 本文转自Delectat.com讨论中,大部分观点认为: usr 是 unix system resources 的缩写: usr 是 user 的缩写: us ...
- Storm官方帮助手册翻译(上)
Storm作为当前最流行的实时计算框架,自Twitter将其开源后就一直备受关注.由于其具有先天的稳定性以及便捷性,目前被许多大公司所采用,国外像雅虎.雅虎日本.Twitter.OOYALA.Spot ...
- java web 项目如何部署到互联网中 通过输入域名访问?
https://segmentfault.com/q/1010000000710271
- sysbench使用教程【转载】
水晶命匣 2016-08-16 20:02 一.环境描述 此次使用的虚拟机环境如下所示: CPU:双核 2.4GHz 内存:4 GB 硬盘:120 GB IP:192.168.21.129 操作系统: ...
- jquery完美实现textarea输入框限制字数
<html> <head> <title> jquery完美实现textarea输入框限制字数</title> <meta http-equiv= ...
- php常用命令大全
1.php -v 查看版本号 [root@rs-2 lib]# php -v PHP 5.5.11 (cli) (built: Apr 29 2014 12:35:52) Copyrigh ...
- windows下使用git管理github项目
1. 下载安装msysgithttp://code.google.com/p/msysgit/downloads/list2. 注册github账号3. 生成ssh公钥和私钥ssh-keygen -C ...