UIView,UIViewController的使用
上节回顾
上节课讲解了UIButton,UITextField的使用,并且综合前面讲解的UILabel的做了一个简易的登录界面。
本节内容
- UIView的介绍与使用
- UIViewController的介绍与使用
- 控件之间的继承关系
UIView
UIView表示屏幕上的一块矩形区域,它在App中占有绝对重要的地位,因为iOS中几乎所有可视化控件都是UIView的子类。负责渲染区域的内容,并且响应该区域内发生的触摸事件。
所以我们以上介绍的几个控件都是UIView的子类。我们先介绍UIView的三个结构体CGPoint,CGRect,CGSize。
- CGPoint
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
CGPoint确定了view的起始坐标。
UIView的坐标是从屏幕的左上角开始,如图所示
- CGSize
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
CGSize确定view的长宽。
- CGRect
struct CGRect {
CGPoint origin; //偏移是相对父视图的
CGSize size;
};
typedef struct CGRect CGRect
CGRect确定了整个视图位置和大小。就像前面讲到的UIButton中的初始化
UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(50, 200, 100, 20)];
这里的frame就是使用CGRect确定的。
然后是UIView的一些基本属性
- frame
//描述当前视图在父视图中的位置和大小
@property(nonatomic) CGRect frame;
- bounds
//描述当前视图在其自身坐标系统中的位置和大小
@property(nonatomic) CGRect bounds;
bounds是CGRect是告诉子视图本视图的原点位置(通俗的说就是,子视图的frame的origin与父视图的bounds的origin的差,就是子视图相对于父视图左上角的位置,如果结果为负,则子视图在父视图外)
- center
//描述当前视图中心点在父视图中的位置
@property(nonatomic)CGPoint center;
改变frame会改变center。同理改变center也会改变frame。
frame和center都是相对于父视图的,bounds是相对于自身的。
//形变属性(平移\缩放\旋转)
@property(nonatomic)CGAffineTransform transform;
//YES:支持多触点
@property(nonatomic,getter=isMultipleTouchEnabled)BOOL multipleTouchEnabled; //default is NO
//YES:超出控件边框范围的内容都剪掉
@property(nonatomic)BOOL clipsToBounds;
//YES:超出控件边框范围的内容都剪掉
@property(nonatomic)BOOL clipsToBounds;
//背景色
@property(nonatomic,copy)UIColor *backgroundColor;
//default is nil;
//YES:不透明 NO:透明
@property(nonatomic,getter=isOpaque)BOOL opaque;
//default is YES
//YES:隐藏 NO:显示
@property(nonatomic,getter=isHidden)BOOL hidden;
//内容模式
@property(nonatomic) UIViewContentMode contentMode
//default is UIViewContentModeScaleToFill
UIView中含有的元素
- UIWindow
UIWindow是UIView的子类,它相当于一个画板,UIView则是一块画布,UIView在UIWindow上,其他的控件就相当于一幅画中的各个元素(object)。
我们在一个应用起始时需要创建一个window来防止我们的UIView
window的初始化方法(在application didFinishLauchingWithOptions里面):
self.window = [[[UIWindow alloc]
initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor blueColor];
//给window设置一个背景色
[self.window makeKeyAndVisible];
//让window显示出来
- UIScreen
UIScreen意如其名,它代表了屏幕,通过它我们可以获取一些我们想要的东西,比如整个屏幕的范围等等。
UIView的常用方法
- addSubview: 添加一个子视图并让它在最上面显示出来。
(void)addSubview:(UIView *)view
//添加一个子视图到接收者并让它在最上面显示出来
比如我们之前用到的
[self.view addSubview:btn];
- bringSubviewToFront: 把指定的子视图移动到顶层
(void)bringSubviewToFront:(UIView *)view
//把指定的子视图移动到顶层
//将view往前移动一个图层(与它的前一个图层对调位置)
- initWithFrame: 初始化并返回一个新的拥有特定帧矩形的视图对象
(id)initWithFrame:(CGRect)aRect
/*参数:
aRect 一个帧矩形用来创建视图对象。原始的帧在它的父视图的坐标系中。设置这个属性用来改变中心和边界属性。
返回值: 一个初始化的视图对象,如果没有被创建那就返回nil */
- insertSubview:atIndex: 插入视图到指定的索引
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index
参数:
view 插入的视图,这个值不能是nil
index 子视图索引从0开始并且不能大于子视图的数量
- sizeToFit 调整大小并移动接收者视图大小所以他包含了他的子视图
(void)sizeToFit
以上是在UIView中常用的方法与属性。其他见开发者文档。
UIViewController
UIViewController是视图控制器,它由控制器+view组成。
它能够完成一下功能:
- 控制视图的代码逻辑,并拥有自己的视图
- 控制器与控制器之间的通信
- 视图与Model之间的传值
- 添加子控制器
- 展示界面信息
- 添加子控件
使用步骤
- 初始化
- 将view加载到视图中
- 加载完view后添加子视图或控件
- layout布局调整
- 各个控件或子视图的操作逻辑添加
- 销毁或调入下一界面
- (void)viewDidLoad {
NSLog(@"%s,视图已经加载出来了",__func__);
[super viewDidLoad];
}
我们在应用中所有的子视图或子控件的逻辑都要在视图加载完后才能实现,所以我们常用的方法就是viewDidLoad.
控件间的继承关系
首先说一下继承
- 使用继承可以实现代码的复用,减少代码冗余;
- Objective-C中一个类可以继承另一个类;
- 被继承的类称为父类或超类(基类);
- 继承的类称为子类或派生类;(孩子类);
- 子类可以直接拥有父类中所有允许子类继承的属性和方法;
- 继承关系是可以传递的)子类除了可以调用父类的方法,也可以调用父类的父类的方法,也就是说继承可以确保某个父类型之下的所有类都会有父类型所持有的全部方法;
- 子类可以有自己的成员变量、属性和方法;
- (单一继承性)Objective-C不支持多重继承。
继承的使用
继承的标识为英文的“:”冒号(),使用继承可以定义一个具有父类所有功能(成员和方法)的新类,它继承了父类的功能。
方法的重写
编写子类时,某些方法(从父类继承过来)需要自己的代码实现;
子类允许重写父类的方法,在调用子类对象的重写方法时,就会调用重写后的方法;
父类中被子类所重写的方法则在调用子类方法时被忽略;
super的使用
如果在子类中 需要调用父类的功能,可以借助super关键字;
子类中使用super发送消息时,实际上是告诉子类调用父类的方法;
如果父类没有定义该方法,则继续在继承链上查找,直到找到为止;
如果查到NSobject为止仍然未找到,则报错;
重写方法时经常会使用super关键字调用父类的方法。
控件的继承关系:
总结
本次的内容较多,首先我们分析了UIView的作用与用法,接着我们分析了UIViewConreoller的用法。最后我们讲了控件间的继承关系及继承的作用与特点。
下节预告
UIImage与UIImageView的使用