1 #import "ViewController.h" 2 3 @interface ViewController () 4 { 5 UILabel *lable; 6 BOOL moveFlag; 7 NSInteger length; 8 UIButton *btn; 9 NSTimer *timer; 10 } 11 12 @end 13 14 @implementation ViewController 15 16 - (void)viewDidLoad { 17 [super viewDidLoad]; 18 moveFlag = NO; 19 length = 10; 20 21 self.view.backgroundColor = [UIColor darkGrayColor]; 22 lable = [[UILabel alloc] init]; 23 lable.frame = CGRectMake(50, 100, 280, 50); 24 lable.text = @"点我啊"; 25 lable.backgroundColor = [UIColor whiteColor]; 26 [self.view addSubview:lable]; 27 28 // 按钮UIButton 29 btn = [UIButton buttonWithType:UIButtonTypeCustom]; 30 // 设置按钮坐标、大小 31 btn.frame = CGRectMake(170, 250, 50, 50); 32 // 设置背景图 33 [btn setImage:[UIImage imageNamed:@"fire_down.png"] forState:UIControlStateNormal]; 34 [btn setImage:[UIImage imageNamed:@"blue_down.png"] forState:UIControlStateHighlighted]; 35 36 37 // 设置标题(状态标题) 38 // [btn setTitle:@"开始" forState:UIControlStateNormal]; 39 // [btn setTitle:@"按下" forState:UIControlStateHighlighted]; 40 41 // 给按钮添加 [关联事件] 42 [btn addTarget:self action:@selector(touchMe) forControlEvents:UIControlEventTouchUpInside]; 43 // 添加背景色 44 [btn setBackgroundColor:[UIColor cyanColor]]; 45 46 // 按钮变圆 47 btn.layer.cornerRadius = 20; 48 // 添加按钮到视图上 49 [self.view addSubview:btn]; 50 51 } 52 53 -(void) touchMe 54 { 55 //判断完了小球动没有动 56 if (moveFlag ==NO) { 57 moveFlag = YES; 58 } 59 else 60 moveFlag = NO; 61 62 //当小球没有动得时候,点小球-变动 63 if (moveFlag) { 64 timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(bollMove) userInfo:nil repeats:YES]; 65 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 66 } 67 else 68 [timer invalidate]; 69 //当小球动得时候,点小球-不动 70 71 } 72 73 -(void) bollMove 74 { 75 76 if (btn.frame.origin.y>600) { 77 length = -10; 78 79 } 80 else if (btn.frame.origin.y<0) 81 { 82 length = 10; 83 } 84 85 CGRect rect = btn.frame; 86 rect.origin.y += length; 87 btn.frame = rect; 88 89 }
一、手写控件
在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力!
设置控件监听方法的示例代码如下:
[btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
提示:
1> addTarget方法定义在UIControl类中,这意味着可以给所有继承自UIControl类的对象添加监听方法
2> 监听方法的第一个参数就是对象本身
3> 监听方法的第二个参数是监听控件的事件
二、frame,center和bounds属性
(1)通过以下属性可以修改控件的位置
frame.origin
center
(2)通过以下属性可以修改控件的尺寸
frame.size
bounds.size
三、简单的动画效果
// beginAnimations表示此后的代码要“参与到”动画中
[UIView beginAnimations:nil context:nil];
// setAnimationDuration用来指定动画持续时间
[UIView setAnimationDuration:2.0];
self.headImageView.bounds = rect;
......
// commitAnimations,将beginAnimation之后的所有动画提交并生成动画
[UIView commitAnimations];
四、补充笔记
1. IBAction的参数
- (IBAction)left:(UIButton *)button
(1) 在OC中,绝大多数的控件监听方法的第一个参数就是控件本身
(2) 默认连线时的参数类型是id
(3) 如果要在监听方法中,方便控件的使用,可以在连线时或者连线后,修改监听方法的参数类型
2. 修改对象的结构体成员
在OC中,不允许直接修改“对象”的“结构体属性”的“成员”,但是允许修改“对象”的“结构体属性”
修改结构体属性的成员方法如下:
(1)使用临时变量记录对象的结构体属性
(2) 修改临时变量的属性
(3)将临时变量重新设置给对象的结构体属性
3. 在程序开发中需要避免出现魔法数字(Magic Number)
使用枚举类型,可以避免在程序中出现魔法数字
(1)枚举类型实质上就是一个整数,其作用就是用来替代魔法数字
(2)枚举类型中,指定了第一个整数之后,后面的数字会递增
五、transform
1. transform属性
在OC中,通过transform属性可以修改对象的平移、缩放比例和旋转角度
常用的创建transform结构体方法分两大类
(1) 创建“基于控件初始位置”的形变
CGAffineTransformMakeTranslation(平移)
CGAffineTransformMakeScale(缩放)
CGAffineTransformMakeRotation(旋转)
(2) 创建“基于transform参数”的形变
CGAffineTransformTranslate
CGAffineTransformScale
CGAffineTransformRotate
CGAffineTransformIdentity 回到原来位置
补充:
在OC中,所有跟角度相关的数值,都是弧度值,180° = M_PI
正数表示顺时针旋转
负数表示逆时针旋转
提示:由于transform属性可以基于控件的上一次的状态进行叠加形变,例如,先旋转再平移。因此在实际动画开发中,当涉及位置、尺寸形变效果时,大多修改控件的transform属性,而不是frame、bounds、center 。