UIView学习笔记

10th,May,2016

前言

UIView职责:

(1). 绘制和动画

(2). 布局和子视图管理

(3). 事件处理

初始化方法Method to override

- initWithFrame:  从代码加载视图

- initWithCoder:  从xib文件加载视图.(先调用initWithCoder,然后发送-awakeFromNib消息给nib中的每个对象)

- layerClass:if you want your view to use a different Core Animation layer for its backing store.

frame , bounds 与 center

(1). frame: 当前视图在父视图中的位置和大小

(2). bounds: 当前视图在自身坐标系统中的位置和大小

(3).  center: 当前视图的中心店在父视图中的位置

一般来说,通过frame属性设置视图的大小和位置,使用center或者frame改变视图的位置。

- (CGRect)frame {

return CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height)

}

- (CGRect)bounds {

return CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)

}

setNeedsLayout 与 setNeedsDisplay

setNeedsLayout: 可让视图主动更新布局,默认调用layoutSubViews,可以处理子视图中的一些数据

setNeedsDisplay/ setNeedsDisplayInRect:  异步执行, 会调用drawRect,就可以拿到UIGraphicsGetCurrentContext就可以画画了

ps: 该函数为图层设置了一个标识,显示的还是原来的内容。(所以多次调用该函数并不会造成性能损失)

渲染系统准备好,图层会装配它的后备存储。 然后建立一个Core Graphics上下文(CGContextRef),将后备存储对应内存中的数据恢复出来,绘图会进入对应的内存区域,并使用 CGContextRef绘制。

CGContextref使用方法: UIKit将后备存储的CGContextRef推进graphics context stack,UIGraphicsGetCurrent()会返回对应的上下文,绘图将会进入涂层的后备存储。

layoutSubviews被调用的情况:

1) . addSubview会出发layoutSubviews,init初始化不会调用layoutSubviews;

2). 修改view的frame会出发layoutSubviews;

3). 滚动UIScrollView会出发layoutSubviews;

4). 旋转会出发父UIView的layoutSubviews事件; (?2. 子UIView的layoutSubviews事件为什么不会触发)

5). 改变UIView大小也会触发父UIView的layoutSubviews事件;

6). 调用setLayoutSubviews.

drawRect是在loadView,viewDidLoad两方法后调用。该方法无法手动调用,只有通过调用其他方法触发

drawRect会被调用的情况:

1) 调用sizeToFit后被调用(ps: 调用sizeToFit计算出size,然后系统自动调用drawRect方法);[提倡]

2) 通过设置contentMode属性值为UIViewContentModeRedraw,则在每次设置或更改frame的时候自动调用drawRect:。[不提倡]

3) 调用setNeedsDisplay/setNeedsDisplayInRect: 会触发drawRect: ,前提是rect不为0;[不提倡]

观察视图相关的变化Observing View-related Changes

didAddSubview: 该方法的默认实现中does nothing. 子类可以重写该方法实现在子视图被添加的时候实现额外的操作。response to adding a subview using any of the relevant view methods

willRemoveSubview: default implementation of this method does nothing. 当子视图的父视图修改或者子视图从视图层次结构中被移除时会被调用。

willMoveToSuperview: 同上,does nothing。its superview is about to change to the specified superview. 当视图的父视图改成指定的视图时调用。[子视图将要被添加到另一个视图的时候发送此消息]

didMoveToSuperview: default implementation does nothing .  its superview changed.

willMoveToWindow: its window object is about to change. [子视图将要被添加到window的时候发送次消息]

didMoveToWindow:

The window property may be nil by
the time that this method is called, indicating that the receiver does not currently reside in any window. This occurs when the receiver has just been removed from its superview or when the receiver has just been added to a superview that is not attached to
a window. Overrides of this method may choose to ignore such cases if they are not of interest.

弹出键盘: willMoveToWindow -> willMoveToSuperview -> didMoveToWindow -> didMoveToSuperview

return隐藏键盘: willMoveToSuperview -> willMoveToWindow -> didMoveToWindow -> didMoveToSuperview

参考资料:

苹果官方文档;

UIView(包括子类)的几个初始化时执行动作的时机

UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout

时间: 2024-08-02 21:29:20

UIView学习笔记的相关文章

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE

iOS学习笔记(1)— UIView 渲染和内容管理

iOS学习笔记(1)— UIView 渲染和内容管理 iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口.在运行时,一个视图对象控制该区域的渲染:UIView继承自UIResponder,UIResponder是用来响应事件的类,UIView也具有响应事件的能力.所以说UIView具有三个基本的功能,绘制内容并管理内容的布局,响应用户交互,动画.正是

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

学习笔记-quartz2D

一.简介                                                                            quartz2D是属于core Graphic框架,该框架是基于C的API.quartz2D用于绘制平面图形. 二.例程步骤 添加UIView的子类MyView,在MyView.m中实现如下方法: 1 #pragma mark 在这个方法内部进行绘图 2 - (void)drawRect:(CGRect)rect { 3 4 } 在该方法

UI学习笔记---第一天

一.iOS概述 iOS是Apple公司的移动操作系统,主要?用于iPhone.iPad.iPad Mini.iPod Touch等移动产品. 借助iOS,我们可以开发视频类.美图类.新闻类.?音乐类.团购类.电商类.阅读类.出?行类.?生活服务类.游戏类等应?用程序. 除此之外,iOS还可以与外部设备通信,开发出更多改变?活的产品,?比 如:智能家居(iOS App控制电视.空调等).健?产品(将人体健康 状况通过App直观的展现出来)等. 二.UI概述 UI(User Interface):?

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

iOS: 学习笔记, 用代码驱动自动布局实例

iOS自动布局是设置iOS界面的利器. 本实例展示了如何使用自动布局语言设置水平布局, 垂直布局 1. 创建空白iOS项目 2. 添加一个控制器类, 修改YYAppDelegate.m文件 #import "YYAppDelegate.h" #import "YYViewController.h" @implementation YYAppDelegate - (BOOL)application:(UIApplication *)application didFin

iOS: 学习笔记, 用代码驱动自动布局实例(swift)

iOS自动布局是设置iOS界面的利器.本实例展示了如何使用自动布局语言设置水平布局, 垂直布局1. 创建空白iOS项目(swift)2. 添加一个控制器类, 修改YYAppDelegate.swift文件 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFi

【学习笔记】响应者链条

自学iOS有一两个月了,一直没有好好整理学习笔记,打算今天开始慢慢补上,就当是复习和补缺补漏吧. iOS的事件大致分为三种:触摸事件.加速计事件.远程控制事件 首先要理解以下几个概念: 一.响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”. UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. 二.UIRespon