第二天
*******图片的放大,和缩小 (去掉自动的布局) -(IBAction ) zoomFrame:(UIbutton *) button{ CGRect frame= self.iconButton.frame; // CGRect frame= self.iconButton.bounds; 用bounds的放大 if(button.tag){ //1 //放大 frame.size.width+=20; frame.size.height+=20; }else { frame.size.width-=20; frame.size.height-=20; } self.iconButton.bounds=frame; }
***首尾式动画 设置动画执行的时长 */ // 1> 准备开始一个动画 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0]; //时间 // 重新设置bounds self.iconButton.bounds = frame; // 3> 提交动画 [UIView commitAnimations];
***位移行变 - (IBAction)move1:(UIButton *)button { // self.delta -= 20.0; // // CGAffineTransformMakeTranslation的位移形变是相对按钮"初始"位置来变化的 // self.iconButton.transform = CGAffineTransformMakeTranslation(0, self.delta); // CGAffineTransformTranslate 的位移形变是对按钮的上次形变的累加 CGFloat dx = 0, dy = 0; if (button.tag == kMovingDirTop || button.tag == kMovingDirBottom) { dy = (button.tag == kMovingDirTop) ? -kMovingDelta : kMovingDelta; } if (button.tag == kMovingDirLeft || button.tag == kMovingDirRight) { dx = (button.tag == kMovingDirLeft) ? -kMovingDelta : kMovingDelta; } self.iconButton.transform = CGAffineTransformTranslate(self.iconButton.transform, dx, dy); NSLog(@"%@", NSStringFromCGAffineTransform(self.iconButton.transform)); }
***放大,和缩小 /** 放大缩小 */ - (IBAction)zoom:(UIButton *)button { CGFloat scale = (button.tag) ? 1.2 : 0.8; self.iconButton.transform = CGAffineTransformScale(self.iconButton.transform, scale, scale); NSLog(@"%@", NSStringFromCGAffineTransform(self.iconButton.transform)); }
***旋转 /** 旋转 */ - (IBAction)rotate:(UIButton *)button { // 在OC的开发中,关于角度统一都使用弧度值,逆时针是负值,顺时针是正值 // 180° = M_PI CGFloat angle = (button.tag) ? -M_PI_4 : M_PI_4; [UIView beginAnimations:nil context:nil]; //行变 self.iconButton.transform = CGAffineTransformRotate(self.iconButton.transform, angle); [UIView commitAnimations]; // NSLog(@"%@", NSStringFromCGAffineTransform(self.iconButton.transform)); NSLog(@"%@", NSStringFromCGRect(self.iconButton.frame)); }
***代码创建按钮 /** 加载完成被调用 */ - (void)viewDidLoad { // 千万不要忘记调用父类的实现方法 [super viewDidLoad]; // 用代码创建按钮 // 使用alloc init方法实例化的按钮,就是custom类型的,按钮的类型一旦指定,不能修改 // 如果创建其他类型的按钮 UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeContactAdd]; btn1.center = CGPointMake(20, 40); [self.view addSubview:btn1]; UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(110, 300, 100, 100)]; self.iconButton = btn; btn.backgroundColor = [UIColor redColor];//背景颜色 // 设置背景图片 [btn setBackgroundImage:[UIImage imageNamed:@"btn_01"] forState:UIControlStateNormal]; [btn setBackgroundImage:[UIImage imageNamed:@"btn_02"] forState:UIControlStateHighlighted]; // 设置按钮文字 [btn setTitle:@"点我啊" forState:UIControlStateNormal]; [btn setTitle:@"摸我" forState:UIControlStateHighlighted]; // 设置文字颜色 [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted]; // 文字垂直对齐方式 btn.contentVerticalAlignment = UIControlContentVerticalAlignmentBottom; // 将按钮添加到视图 [self.view addSubview:btn]; }
******图片查看器 #import "HMViewController.h" /** 用纯代码开发的过程 1. 确定界面元素,要有什么内容 2. 用代码来搭建界面 3. 编写代码 */ @interface HMViewController () /** @proerty 1. 创建了getter & setter方法 2. 生成一个带_的成员变量,直接读取成员变量不会经过getter方法&setter方法 */ @property (nonatomic, strong) UILabel *noLabel; @property (nonatomic, strong) UIImageView *iconImage; @property (nonatomic, strong) UILabel *descLabel; @property (nonatomic, strong) UIButton *leftButton; @property (nonatomic, strong) UIButton *rightButton; /** 当前显示的照片索引 */ @property (nonatomic, assign) int index; @end @implementation HMViewController /** 在viewDidLoad创建界面 */ - (void)viewDidLoad { [super viewDidLoad]; // 1. 序号 _noLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, self.view.bounds.size.width, 40)]; // _noLabel.text = @"1/5"; _noLabel.textAlignment = NSTextAlignmentCenter; [self.view addSubview:_noLabel]; // 2. 图像 CGFloat imageW = 200; CGFloat imageH = 200; CGFloat imageX = (self.view.bounds.size.width - imageW) * 0.5; CGFloat imageY = CGRectGetMaxY(self.noLabel.frame) + 20; _iconImage = [[UIImageView alloc] initWithFrame:CGRectMake(imageX, imageY, imageW, imageH)]; // _iconImage.image = [UIImage imageNamed:@"biaoqingdi"]; [self.view addSubview:_iconImage]; // 3. 描述文字 CGFloat descY = CGRectGetMaxY(self.iconImage.frame); _descLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, descY, self.view.bounds.size.width, 100)]; // _descLabel.text = @"神马表情"; _descLabel.textAlignment = NSTextAlignmentCenter; [self.view addSubview:_descLabel]; // 4. 左边的按钮 _leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; CGFloat centerY = self.iconImage.center.y; CGFloat centerX = self.iconImage.frame.origin.x * 0.5; _leftButton.center = CGPointMake(centerX, centerY); [_leftButton setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal]; [_leftButton setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted]; [self.view addSubview:_leftButton]; _leftButton.tag = -1; [_leftButton addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside]; // 5. 右边的按钮 _rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; _rightButton.center = CGPointMake(self.view.bounds.size.width - centerX, centerY); [_rightButton setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal]; [_rightButton setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted]; [self.view addSubview:_rightButton]; _rightButton.tag = 1; [_rightButton addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside]; // 显示照片信息 [self showPhotoInfo]; } /** 重构的目的:让相同的代码只出现一次 */ - (void)showPhotoInfo { // 设置序号 self.noLabel.text = [NSString stringWithFormat:@"%d/%d", self.index + 1, 5]; // 设置图像和描述 switch (self.index) { case 0: self.iconImage.image = [UIImage imageNamed:@"biaoqingdi"]; self.descLabel.text = @"表情"; break; case 1: self.iconImage.image = [UIImage imageNamed:@"bingli"]; self.descLabel.text = @"病例"; break; case 2: self.iconImage.image = [UIImage imageNamed:@"chiniupa"]; self.descLabel.text = @"吃牛扒"; break; case 3: self.iconImage.image = [UIImage imageNamed:@"danteng"]; self.descLabel.text = @"蛋疼"; break; case 4: self.iconImage.image = [UIImage imageNamed:@"wangba"]; self.descLabel.text = @"王八"; break; } // 控制按钮状态 // if (self.index == 4) { // self.rightButton.enabled = NO; // } else { // self.rightButton.enabled = YES; // } self.rightButton.enabled = (self.index != 4); //可以点击 和不可以点击 self.leftButton.enabled = (self.index != 0); } // 在OC中,很多方法的第一个参数,都是触发该方法的对象! - (void)clickButton:(UIButton *)button { // 根据按钮调整当前显示图片的索引? self.index += button.tag; // +1或者-1 [self showPhotoInfo]; } ///** 上一张照片 */ //- (void)prePhoto //{ // NSLog(@"%s", __func__); // self.index--; // // [self showPhotoInfo]; //} // ///** 下一张照片 */ //- (void)nextPhoto //{ // NSLog(@"%s", __func__); // self.index++; // // [self showPhotoInfo]; //} @end
******* 懒加载(延迟加载),通过getter实现 /** 效果:让对象在最需要的时候才创建! */ - (NSArray *)imageList { NSLog(@"读取图像信息"); if (_imageList == nil) { NSLog(@"实例化数组"); NSDictionary *dict1 = @{@"name": @"biaoqingdi", @"desc": @"表情1"}; NSDictionary *dict2 = @{@"name": @"bingli", @"desc": @"病例1"}; NSDictionary *dict3 = @{@"name": @"chiniupa", @"desc": @"吃牛扒1"}; NSDictionary *dict4 = @{@"name": @"danteng", @"desc": @"蛋疼1"}; NSDictionary *dict5 = @{@"name": @"wangba", @"desc": @"网吧1"}; _imageList = @[dict1, dict2, dict3, dict4, dict5]; } return _imageList; }
*****plist /** 懒加载(延迟加载),通过getter实现 效果:让对象在最需要的时候才创建! */ - (NSArray *)imageList { NSLog(@"读取图像信息"); if (_imageList == nil) { NSLog(@"实例化数组"); // "包" Bundle [NSBundle mainBundle]编译安装之后对应的程序包 NSString *path = [[NSBundle mainBundle] pathForResource:@"ImageList" ofType:@"plist"]; //读取plist的图片 NSLog(@"%@", path); // 在OC中ContentsOfFile,通常需要完整的路径 _imageList = [NSArray arrayWithContentsOfFile:path]; NSLog(@"%@", _imageList); } return _imageList; } /** 重构的目的:让相同的代码只出现一次 */ - (void)showPhotoInfo { // 设置序号 self.noLabel.text = [NSString stringWithFormat:@"%d/%d", self.index + 1, 5]; // 效率不高,每次都会生成数组 // 如何解决?使用属性记录字典数组 // NSDictionary *dict1 = @{@"name": @"biaoqingdi", @"desc": @"表情1"}; // NSDictionary *dict2 = @{@"name": @"bingli", @"desc": @"病例1"}; // NSDictionary *dict3 = @{@"name": @"chiniupa", @"desc": @"吃牛扒1"}; // NSDictionary *dict4 = @{@"name": @"danteng", @"desc": @"蛋疼1"}; // NSDictionary *dict5 = @{@"name": @"wangba", @"desc": @"网吧1"}; // NSArray *array = @[dict1, dict2, dict3, dict4, dict5]; // 设置图像和描述 self.iconImage.image = [UIImage imageNamed:self.imageList[self.index][@"name"]]; self.descLabel.text = self.imageList[self.index][@"desc"]; self.rightButton.enabled = (self.index != 4); self.leftButton.enabled = (self.index != 0); }
**********Tom实现 #import "HMViewController.h" @interface HMViewController () @property (weak, nonatomic) IBOutlet UIImageView *tom; @end @implementation HMViewController /** 重构-抽取代码 方法: 1> 将重复代码复制到新的方法中 2> 根据需要调整参数 关于图像的实例化 imageNamed:系统推荐使用的,但是图像实例化之后的释放由系统负责 如果要自己释放图片,不能使用imageNamed方法! 而需要使用imageWithContentsOfFile 提示:如果放在Images.xcassets中的图片,不能使用imageWithContentsOfFile Images.xcassets中不要 存放大的,不常用的图片 */ - (void)tomAnimationWithName:(NSString *)name count:(NSInteger)count { // 如果正在动画,直接退出 if ([self.tom isAnimating]) return; // 动画图片的数组 NSMutableArray *arrayM = [NSMutableArray array]; // 添加动画播放的图片 for (int i = 0; i < count; i++) { // 图像名称 NSString *imageName = [NSString stringWithFormat:@"%@_%02d.jpg", name, i]; // UIImage *image = [UIImage imageNamed:imageName];//内存不会被释放 // ContentsOfFile需要全路径 NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:nil]; UIImage *image = [UIImage imageWithContentsOfFile:path]; [arrayM addObject:image]; } // 设置动画数组 self.tom.animationImages = arrayM; // 重复1次 self.tom.animationRepeatCount = 1; // 动画时长 self.tom.animationDuration = self.tom.animationImages.count * 0.075; // 开始动画 [self.tom startAnimating]; // 动画"结束"之后,清理动画数组 // self.tom.animationImages = nil; // performSelector定义在NSObject分类中 // [self performSelector:@selector(cleanup) withObject:nil afterDelay:self.tom.animationDuration]; [self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration]; //清理内存,动画数组设置nil } - (IBAction)tomAction:(UIButton *)sender { // currentTitle 可以取出按钮当前的标题文字 [self tomAnimationWithName:sender.currentTitle count:sender.tag]; } //- (void)cleanup //{ // NSLog(@"%s", __func__); //// self.tom.animationImages = nil; // [self.tom setAnimationImages:nil]; //} - (IBAction)knockout { [self tomAnimationWithName:@"knockout" count:81]; } - (IBAction)eatBird { [self tomAnimationWithName:@"eat" count:40]; } @end