前言:
UIButton是我们在做项目中最常用到的控件之一, 所以我们必须得熟悉使用它的一些方法和属性.
在这个小项目中, 我们使用的是纯代码编写, 不使用StoryBoard.
编程思想:
1. 创建被虐的按钮
2. 新建两个子视图作为两个操控板的容器视图
3. 使用NSArray定义按钮,以方便代码创建按钮
4. 在容器视图中添加按钮,并定义按钮的监听事件
5. 按钮事件的响应
开始:
首先, 我们得创建一个空的项目, 并且创建我们需要的Button, 下面使用for循环创建我们的控制按钮, 我这里使用的是iPhone5s的屏幕分辨率.
- (void)addButtonsActionToView:(UIView *)view image:(NSArray *)images action:(SEL)action
{
for (NSInteger i = 0; i < 4; i++) {
//1. 实例化按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
//2. 设置按钮边框
[button setFrame:CGRectMake((i % 2) * 80, (i / 2) * 80, 80, 80)];
//3. 设置按钮的普通图像
NSString *textNormal = [NSString stringWithFormat:@"sub_black_%@", images[i]];
UIImage *imageNorml = [UIImage imageNamed:textNormal];
[button setImage:imageNorml forState:UIControlStateNormal];
//4. 设置按钮的长按图像
NSString *textHigh = [NSString stringWithFormat:@"sub_blue_%@", images[i]];
UIImage *imageHigh = [UIImage imageNamed:textHigh];
[button setImage:imageHigh forState:UIControlStateHighlighted];
//5. 设置监听的方法
[button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
//6. 设置按钮的tag, 以区分按钮
[button setTag:i];
//7. 将按钮添加到容器视图
[view addSubview:button];
}
}把创建好的按钮添加到视图上.
- (void)myButtonsView
{
// 2. 创建两个容器视图
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 408, 160, 160)];
// [view1 setBackgroundColor:[UIColor redColor]];
// 2.1 需要添加4个按钮
// 有一个问题,就图片的文件名好像没有什么规律
// 想法:可不可以用NSArray记录住图像的文件名,然后通过循环的方式创建按钮
// 初始化一个按钮文件名的数组
[self.view addSubview:view1];
NSArray *imageName1 = @[@"up", @"down", @"prev", @"next"];
[self addButtonsActionToView:view1 image:imageName1 action:@selector(translationView:)];
UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(view1.frame.size.width, 408, 160, 160)];
// [view2 setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:view2];
NSArray *imageName2 = @[@"rotate_ccw", @"rotate_cw", @"add", @"remove"];
[self addButtonsActionToView:view2 image:imageName2 action:@selector(transformAction:)];
// 3. 分别将4个按钮加入不同的容器视图
}给每个按钮设置它们的操作方法
#pragma mark 按钮操作
// 按钮的上下左右操作
- (void)translationView:(UIButton *)sender{
NSLog(@"哈哈哈 %ld", sender.tag);
CGPoint point = [_button center];
switch (sender.tag) {
case 0: //上
point.y -= 20;
if (point.y <= -60)
{
point.y = 610;
}
break;
case 1: //下
point.y += 20;
if (point.y >= 580) {
point.y = 100;
}
break;
case 2: //左
point.x -= 20;
if (point.x <= -80) {
point.x = 420;
}
break;
case 3: //右
point.x += 20;
if (point.x >= 420) {
point.x = 0;
}
break;
default:
break;
}
[UIView animateWithDuration:1.5f animations:^{
// 设置中心点
[_button setCenter:point];
NSLog(@"%f", _button.frame.origin.y);
}];
}
// 按钮的形变操作
- (void)transformAction:(UIButton *)sender{
NSLog(@"哈哈哈 %ld", sender.tag);
CGAffineTransform transform;
switch (sender.tag) {
case 0: //逆时针
transform = CGAffineTransformRotate(_button.transform, -M_PI / 6);
break;
case 1: //顺时针
transform = CGAffineTransformRotate(_button.transform, M_PI / 6);
break;
case 2: //放大
transform = CGAffineTransformScale(_button.transform, 1.1, 1.1);
break;
case 3: //缩小
transform = CGAffineTransformScale(_button.transform, 1.0 / 1.1, 1.0 / 1.1);
break;
default:
break;
}
// 设置按钮的形变.
[UIView animateWithDuration:1.5f animations:^{
[_button setTransform:transform];
}];
}
创建被操作的Button
- (void)yellowButton{
// 1. 创建黄色按钮
// 1.1 实例化按钮
_button = [UIButton buttonWithType:UIButtonTypeCustom];
// 1.2 设置按钮文字
[_button setTitle:@"我是按钮" forState:UIControlStateNormal];
// 1.3 设置按钮背景颜色
[_button setBackgroundColor:[UIColor orangeColor]];
// 1.4 设置按钮监听事件
[_button addTarget:self action:@selector(tapButton) forControlEvents:UIControlEventTouchUpInside];
// 1.5 设置按钮位置
[_button setFrame:CGRectMake(110.0, 100.0, 100.0, 100.0)];
// 1.6 将按钮添加到视图
[self.view addSubview:_button];
}
设置被操作的Button方法
// 按钮监听
- (void)tapButton
{
NSLog(@"我被摸了");
//初始化按钮的所有属性
[UIView animateWithDuration:1.5f animations:^{
_button.transform = CGAffineTransformIdentity;
}];
}
最后在viewDidLoad方法里调用
- (void)viewDidLoad {
[super viewDidLoad];
//添加黄色按钮
[self yellowButton];
//添加上下左右, 放大缩小, 顺逆旋转按钮
[self myButtonsView];
}
效果图
关于项目里所使用到的图片, 我会放到网盘里, 方便各位的下载
链接: http://pan.baidu.com/s/1jG88x7K 密码: lh0l
总结:
这里所展示的小Demo有涉及到一定的封装思想, 应该会有朋友问到, 为什么你的viewDidLoad里只写了两行的代码? 因为viewDidLoad方法是在视图一创建之后就会调用, 并且只会调用一次, 如果把所有的东西都放到viewDidLoad里, 会有一定的局限性, 不方便我们进一步的操作, 所以我们必须得分开来写, 等到以后熟练了之后, 我们就必须得使用设计模式来封装各个方法, 使用设计模式来封装项目好处多多呢, 等到大家学到设计模式的时候, 就会知道设计模式到底有多酷了.
PS:
这个项目除了我所使用的方法之外, 还有其他方法可以做到效果和我完全一样, 大家喜欢的可以自行去尝试一下.
这次就到里, 下次我们继续~