说明:这个专题,是介绍了一些常用的普通空间的属性和使用,包括:UITextField、UITextView、UILabel、UIButton、UISlider、UIStepper、UIImageView、UISwitch、UISegmentedControl、UIToolBar。
0.UIView常用的属性和操作
这是ios-UI继承关系图
任何控件都继承自UIView,因此UIView里面包装了一些控件的共有属性和通过的方法。
0_1.UIView常见的属性
1.frameframe是一个CGRect
类型的成员变量,用来设置控件要显示的位置frame.origin
和尺寸frame.size
,其中位置是在父控件中的位置,以父控件的左上角为原点。
如果要修改一个控件的frame不可以直接修改内部结构体的值,如frame.origin.x = 100;
是不可以的,应该将其取出,修改之后,再重新赋值,看下面的例子:
// 1.先取出frame
CGRect tempFrame = self.btn.frame;
// 2.修改y值
tempFrame.origin.y -= 50;
// 3.重新赋值按钮的frame
self.btn.frame = tempFrame;
2.bounds
bounds也是一个CGRect
类型的成员变量,但是bounds.origin.x
和bounds.origin.y
始终为0;bounds.size.width
和bounds.size.height
的值分别等于frame.size.width
和frame.size.height
。
center是一个CGPoint
类型的成员变量,表示控件的中点在父控件中的位置,以父控件的左上角为原点。
tag是NSInteger
类型的成员变量,用于标识一个空间,以便操作这个控件,例如:当两个button都设置了同一个方法为点击的处理事件,可以设置两个按钮的tag为1和2,然后在方法中分别处理:
- (IBAction)btnClick:(id)sender
{
switch ([sender tag])
{
case 1:
NSLog(@"点击了按钮1--");
break;
case 2:
NSLog(@"点击了按钮2--");
break;
default:
break;
}
}
下面是一个让按钮可以向上、向下、向左、向右移动的例子,并为移动过程添加了动画
- (void) btnClickWithBlock:(void (^)())block{
// 0.动画(头部--开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:1.0];
block();
// 4.动画(尾部--提交动画--执行动画)
[UIView commitAnimations];
}
#pragma mark 控制按钮走动(上下左右)
- (IBAction)run:(id)sender {
[self btnClickWithBlock:^{
// 1.先取出frame
CGRect tempFrame = self.btn.frame;
// 2.修改x,y值
switch ([sender tag]) {
case 1:
tempFrame.origin.y -= kDelta;
break;
case 2:
tempFrame.origin.x += kDelta;
break;
case 3:
tempFrame.origin.y += kDelta;
break;
case 4:
tempFrame.origin.x -= kDelta;
break;
default:
break;
}
// 3.重新赋值按钮的frame
self.btn.frame = tempFrame;
}
如果使用center属性来移动位置,代码又简化了一点,因为center的值是可以直接修改的:(下面仅仅修改移动部分的代码)
#pragma mark 控制按钮走动(上下左右)
- (IBAction)run:(id)sender {
[self btnClickWithBlock:^{
// 使用center的方案
CGPoint tempCenter = self.btn.center;
switch ([sender tag]) {
case 1:
tempCenter.y -= kDelta;
break;
case 2:
tempCenter.x += kDelta;
break;
case 3:
tempCenter.y += kDelta;
break;
case 4:
tempCenter.x -= kDelta;
break;
default:
break;
}
self.btn.center = tempCenter;
}];
}
5.superview
superview是UIView *
类型的成员变量,它的值为当前控件的父控件
subviews是NSArray *
类型的成员变量,它的值为当前控件的子控件组成的数组,在数组中的顺序与加入到当前控件的顺序一致。
transform是一个CGAffineTransform
类型的成员变量,它是一个结构体类型,表示形变的参数(设置这个参数后,控件会按照这个参数进行形变,参数指定了变形后的终态),形变的类型有多种,包括旋转、放缩等,默认的值为CGAffineTransformIdentity
。下面是一些该属性的使用示例,为了使用动画,用到了前面的btnClickWithBlock:
方法
- (IBAction)leftRotate:(id)sender {
// 弧度制 角度 以顺时针为正向,负数为左旋转
[self btnClickWithBlock:^{
self.btn.transform = CGAffineTransformRotate(self.btn.transform, -M_PI_4);// 向左旋转45度 这个函数的第一个参数为形变初态,第二个参数指定了终态 注意和下面的区别
// self.btn.transform = CGAffineTransformMakeRotation(-M_PI_4);// 控件内部会记录形变初态,若执行一次这句代码会旋转一次,若再次执行不会再旋转,因为旋转一次后已经和指定的终态相同。而上面的代码,会将上次旋转后的状态设置为本次旋转的初态,因而每次执行都会旋转
}];
}
#pragma mark - 放大
- (IBAction)big:(id)sender {
[self btnClickWithBlock:^{
self.btn.transform = CGAffineTransformScale(self.btn.transform, 1.2, 1.2);// 宽和高放大为1.2倍
}];
}
#pragma mark - 重置为默认的状态
- (IBAction)reset:(id)sender {
[self btnClickWithBlock:^{
self.btn.transform = CGAffineTransformIdentity;
}];
}
0_2.UIView状态
UIView有不同的状态:以按钮UIButton
为例就有这样几种状态:默认Default
,高亮Highlighted
,选中Selected
,不可用Disabled
。不同的状态下有相同的属性,例如上面提到的几种属性,在编码时千万注意不可将不同的状态下的属性混用了。UIView通常包含上面四中状态,很多人对高亮状态和选中状态不易区分:高亮Highlighted
是正在选择时(触摸到时,或者长按时)的状态,而选中Selected
则是点选后的状态,官方有下面的解释:
UIControlStateHighlighted
Highlighted state of a control. A control enters this state when a touch enters and exits during tracking and when there is a touch up event. You can retrieve and set this value through the highlighted property.
Available in iOS 2.0 and later.
Declared in UIControl.h.
UIControlStateSelected
Selected state of a control. For many controls, this state has no effect on behavior or appearance. But other subclasses (for example, the UISegmentedControl class) may have different appearance depending on their selected state. You can retrieve and set this value through the selected property.
Available in iOS 2.0 and later.
Declared in UIControl.h.
0_3.UIView常用的方法
这部分将使用代码创建一些控件的方式展示一些UIView的常用方法。首先要明确一点代码应该添加到什么地方,通常控制器负责界面的初始化,控制器首先会加载storyboard中的界面然后执行viewDidLoad
方法,因此可以在viewDidLoad
方法中添加一些其他的控件
@implementation ViewController
#pragma mark 控制器的view加载完毕的时候会调用一次
- (void)viewDidLoad
{
[super viewDidLoad];
// 1. 创建一个按钮
// 1.1创建
UIButton *btn = [[UIButton alloc] init];
// 1.2设置按钮的尺寸和位置
btn.frame = CGRectMake(0, 0, 100, 100);
// 1.3设置按钮的普通状态下的属性
// 1.3.1设置背景图片
UIImage *normal = [UIImage imageNamed:@"btn_01.png"];
[btn setBackgroundImage:normal forState:UIControlStateNormal];
// 1.3.2 设置文字
[btn setTitle:@"normal" forState:UIControlStateNormal];
// 1.3.3 设置文字颜色
[btn setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
// 1.4设置按钮的高亮状态下的属性
// 1.4.1设置背景图片
UIImage *high = [UIImage imageNamed:@"btn_02.png"];
[btn setBackgroundImage:high forState:UIControlStateHighlighted];
// 1.4.2 设置文字
[btn setTitle:@"highlighted" forState:UIControlStateHighlighted];
// 1.4.3 设置文字颜色
[btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
// 1.5 监听按钮点击
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
// 2.添加按钮到控制器的view中
[self.view addSubview:btn];
// 3.添加文本输入框
UITextField *txtField = [[UITextField alloc] init];
txtField.backgroundColor = [UIColor redColor];
txtField.frame = CGRectMake(0, 0, 100, 100);
txtField.center = CGPointMake(self.view.frame.size.width * 0.5,