UIView详解
MVC架构模式
MVC(Model-View-Controller)是实现数据和显示数据的视图分离的架构模式(有一定规模的应用都应该实现数据和显示的分离)。其中,M代表模型,就是程序中使用的数据和状态,它不理会用户界面或表现方式,只负责数据和状态的存储;V代表视图,是呈现给用户看的东西,当然用户也可以通过视图来表达想要进行的操作;C代表控制器,它负责协调模型和视图,当模型更改时要刷新视图,这通常会包含一些逻辑。
UIView的常用属性和方法
之前我们说过,UIView可以代表屏幕上的一块矩形区域,它负责内容的显示、定位以及响应用户的触摸事件,是用户和应用进行交互的主要方式,我们再来看看UIView的属性和方法。
绘制和更新视图的方法
- -drawRect:方法:绘图(可以使用贝塞尔曲线进行绘图)
- -setNeedsDisplay方法:让整个视图重绘
- -setNeedsDisplayInRect:方法:让视图指定的矩形区域重绘
管理手势操作的方法
- -addGestureRecognizer:方法:添加手势识别器
- -removeGestureRecognizer:方法:删除手势识别器
使用Block语法设置动画的类方法
- +animateWithDuration:animations:类方法:用指定的持续时间完成通过Block指定的动画
为视图添加动画效果的类方法
- beginAnimations:context:类方法:开始一个动画
- commitAnimations类方法:执行动画
- setAnimationStartDate:类方法:设置动画开始时间
- setAnimationDuration:类方法:设置动画持续时间
- setAnimationDelay:类方法:设置延迟多少时间播放动画
- setAnimationRepeatCount:类方法:设置动画重复播放次数
- setAnimationRepeatAutoreverses:类方法:设置是否反向执行动画
- setAnimationTransition:forView:cache:类方法:设置动画的执行效果以及作用于哪个视图
说明:UIView动画只能修改关于坐标系统的属性以及色彩和透明度。
下面的例子演示了一个扯日历的动画效果。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.superview cache:YES];
[self removeFromSuperview];
[UIView commitAnimations];
与运动视觉效果相关的方法
- addMotionEffect:方法:添加运动视觉效果
- removeMotionEffect:方法:删除运动视觉效果
通过标识获得UIView
- viewWithTag:方法:通过指定的标识值获取视图
转换坐标系统的方法
- convertPoint:toView:方法:将当前视图上的坐标转换为指定视图上的坐标,如果第二个参数为nil,则转换成窗口坐标
- convertPoint:fromView:方法:将指定视图上的坐标转换为当前视图的坐标
视图碰撞检测方法
- hitTest:withEvent:方法:获得一个点所在的视图上,如果当前视图包含这个点则返回点所在的最远子视图,如果当前视图不包括这个点则返回nil
- pointInside:withEvent:方法:判断一个点有没有在当前视图上
视图相关的回调方法
- didAddSubview:方法:添加子视图的回调方法
- willRemoveSubview:方法:移除子视图的回调方法
- willMoveToSuperview:方法:视图将要移到某个父视图的回调方法
- didMoveToSuperview:方法:视图已经移到某个父视图的回调方法
- willMoveToWindow:方法:视图将要移到UIWindow对象的回调方法
- didMoveToWindow:方法:视图已经移到UIWindow对象的回调方法
下面的例子演示了将一个视图伸缩后再旋转的动画效果。
// 横向拉伸1.5倍,纵向拉伸0.5倍
view.transform = CGAffineTransformMakeScale(1.5, 0.5);
// 在刚才的变换的基础上再旋转30度
view.transform = CGAffineTransformRotate(view.transform, M_PI / 6);
提示:每一个子视图只能有一个父视图,当我们将一个子视图添加到另一个父视图上面时,它会脱离原来的父视图。另外,我们指定子视图的frame、bounds等属性时,它的值是相当于父视图的相对值,而不是屏幕的绝对值,如果父视图改变了位置,那么这些子视图也会跟着改变。父视图如果设置了隐藏或者透明效果,肯定也会影响到子视图。子视图超出父视图的部分,是不能够接受事件的。
如果需要从父视图中批量删除子视图,可以使用下面的代码:
NSArray *subViews = self.subViews;
if([subViews count] != 0) {
[subViews makeObjectPerformSelector:@selector(removeFromSuperview)];
}
CALayer
UIView和CALayer的关系
UIView和CALayer是相互依赖的关系,UIView依赖与CALayer提供的内容,CALayer依赖UIView提供的容器来显示绘制的内容。CALayer基于图像管理内容并允许你在这些内容上创建动画。如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。一言以蔽之,UIView来自CALayer,高于CALayer,是CALayer高层实现与封装;UIView的很多特性都源于CALayer对它的支持。
通过CALayer改变UIView的形状
- borderColor属性:边框颜色。
- borderWidth属性:边框宽度。
- cornerRadius属性:边框转角半径(实现圆角效果)。
通过CALayer添加动画效果
- transforms属性:指定对CALayer中的内容做怎样的变换,支持3D效果和动画。
UIImageView的使用
UIImageView对象提供了一个基于视图的容器来展示一张或者一系列图像,同时也支持以动画的方式来呈现一组图像(可以指定播放间隔和频率)。简单的说,UIImageView就是UIImage对象的承载者,当需要将UIImage呈现在UIView上时就需要UIImageView。二者的关系就像UILabel和NSString之间的关系。
UIImageView的创建和使用
- initWithImage:方法:这种方式适合创建小图片,尤其是素材类图片。
UIImageView的常用属性和方法
- contentMode属性:图片的填充模式。(继承自UIView)
- clipsToBounds属性:修剪超出边界的部分。(继承自UIView)
- animationImages属性:装在用于动画的图像的数组。
- animationDuration属性:动画播放的持续时间。
- animationRepeatCount属性:动画的重复次数,0表示循环播放。
- startAnimating方法:开始播放动画。
- stopAnimating方法:停止播放动画。
- isAnimating方法:返回BOOL值表示动画是否正在播放中。
下面用UIImageView来实现一个动画,完成后的效果如下图所示。
#import "ViewController.h"
@interface ViewController () {
NSTimer *timer;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 用一个数组来装构成动画的所有图片
NSMutableArray *imageArray = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
[imageArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"runner%d.jpg", i]]];
}
// 创建UIImageView对象并指定相关的动画图片
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 150, 75, 100)];
imageView.animationImages = [imageArray copy];
// 设置图片切换的时间间隔
imageView.animationDuration = 0.5;
imageView.tag = 101;
// imageView.animationRepeatCount = 10;
// 开始动画
[imageView startAnimating];
[self.view addSubview:imageView];
// 启动一个计时器让UIImageView向右移动
timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(runAhead) userInfo:nil repeats:YES];
}
// 修改UIImageView的x坐标使其向右移动并在到达边界时返回
- (void) runAhead {
UIImageView *currentView = (id)[self.view viewWithTag:101];
CGRect rect = currentView.frame;
rect.origin.x += 1;
if(rect.origin.x > self.view.bounds.size.width) {
rect.origin.x = -75;
}
currentView.frame = rect;
}
@end
原文链接 http://my.oschina.net/Steller/blog/601531
UIView详解的更多相关文章
- UI第三节——UIView详解
- (void)viewDidLoad { [super viewDidLoad]; UIView *redView = [[UIView alloc] initWithFrame:CGRectMak ...
- UIView详解1
一个UIView的实例就是一个视图,表示的是屏幕上的一块矩形区域,负责这块矩形区域的描绘以及和用户的交互. 第一.UIView的可视化属性 1. backgroundColor 背景属性 2. hi ...
- UIView详解2
第三.Configuring the Event-Related Behavior 1. userInteractionEnabled property A Boolean value that ...
- 《iOS 7 应用开发实战详解》
<iOS 7 应用开发实战详解> 基本信息 作者: 朱元波 管蕾 出版社:人民邮电出版社 ISBN:9787115343697 上架时间:2014-4-25 出版日期:2014 年5 ...
- 详解CALayer 和 UIView的区别和联系
详解CALayer 和 UIView的区别和联系 前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 CALayer 的区别和联系的时候,被喵神指出没有切中要点,所以这里就 CALay ...
- 【好程序员笔记分享】——UIView与CALayer详解
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ UIView与CALayer详解 研究Core Animation已经有段时间了,关于Core Animati ...
- 【iOS自定义键盘及键盘切换】详解
[iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...
- iOS开发——加载、滑动翻阅大量图片解决方案详解
加载.滑动翻阅大量图片解决方案详解 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清 ...
- UI第六节——UINavigationController 详解
1. UINavigationController 是一个容器类.里面盛放的是UIViewController. 容器的意思是,如果你不放入UIViewController,里面就是空的,什么也没有. ...
随机推荐
- JSTL标签库的使用
首先是四大标签库 核心 标签库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core"%> 格式标签库 <%@ ta ...
- clip:rect矩形剪裁
clip:rect(top right bottom left);依据上-右-下-左的顺序提供自图片左上角为(0,0)坐标计算的四个偏移数值,其中任一数值都可用auto替换. 矩形剪裁 还需要绝对定位 ...
- 《Eclipse中的一些快捷键》
1,window--首选项--Java--templates 自定义模板. 2,快捷键. 2.1 alt+/ 内容辅助. 2.2 ctrl+1 : 对小红×的提供解决法案.大红×(代码错误)必须修改代 ...
- Python学习路程day21
本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个群有管理员可以审批用户的加群请求,群管理员可以用多个,群管理员可以 ...
- 安装PLSQL,登录报“无法解析指定的连接标识符的错误”
安装PLSQL,本地不需要安装oracle服务器,但要安装oracle客户端. 一.安装客户端需要配置服务命名,tnsnames.oRA文件和监听(因为我开始没有配置监听,所以一直报无法解析制定的连接 ...
- soj1001算法分析
题目简单描述: 给定一个长数串,输出可能的字母串解个数.(A对应1,Z对应26) 样例输入:25114 样例输出:6 样例解释:可能的字母串解:YJD.YAAD.YAN.BEJD.BEAAD.BEAN ...
- JAVAWEB学习总结 SERVLET开发(二)
一.ServletConfig对象 1.1.配置servlet初始化参数 在servlet的配置文件中web.xml中,可以使用一个或多个<init-param>标签为servlet配置一 ...
- IE6,IE7文档模式下 按钮type=submit在页面打开时会有一条黑线边框的处理方法。(转)
一:按钮border:none:同时使用背景图片来实现border效果. 二:在按钮外面嵌套一层label标签,里面的按钮input[type="submit"]的border:n ...
- WebStorm里面配置运行React Native的方案
以前开发react native项目总是需要打开WebStorm编写代码,Xcode跑项目.显得有点多余. 今天教大家如何直接使用WebStorm这个IDE直接完成编码+运行项目工作.这样就可以不用打 ...
- android Intent的常用flags
首先,我们常见的由MainActivity跳转到另外一个Main1Acticity的代码: Intent mIntent=new Intent(MainActivity.this, Main1Acti ...