IOS开发学习笔记021-练习2
只是简单练习一下,主要是学习里面的思想,处理问题的方法。
不过还有一个问题没想到解决方法。
那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊。(知道怎么办了,原来是方法addTarget)
segmentControll 控件和imageView 控件
总体效果如下,点击3列,表情按照3列显示,点击4列表情按照4列显示。
界面也很简单,只有一个segmentedControll控件,表情是通过代码生成的,自动排序。
一、先将界面做好,将表情资源添加到工程里,具体方法可以看上一篇。
1、segmentControll 控件只需设置几个列显示就行,然后绑定事件
2、绑定valueChanged事件
1 - (IBAction)segmentValue:(UISegmentedControl *)sender; // 值改变后相应事件 2 3 4 5 6 - (IBAction)segmentValue:(UISegmentedControl *)sender // 值改变后相应事件 7 { 8 }
可以在方法中测试是否正常, 可以使用属性selectedSegmentIndex
1 - (IBAction)segmentValue:(UISegmentedControl *)sender 2 { 3 NSLog(@"%d",sender.selectedSegmentIndex); // 获取改变的值 4 }
二、加载表情资源到视图中
1、首先将加载表情资源的过程封装到一个 方法中。其中WIDTH_HIGHT是一个宏表示表情的宽度和高度
#define WIDTH_HIGHT 60
参数是表情的名称和位置。
1 - (void)addImageWithName:(NSString *)name x:(CGFloat)x y:(CGFloat)y 2 { 3 // 通过代码加载图片 4 UIImageView *ima = [[UIImageView alloc] init]; // 初始化图片对象 5 ima.image = [UIImage imageNamed:name]; // 获取名称 6 ima.frame = CGRectMake(x, y, WIDTH_HIGHT, WIDTH_HIGHT); // 设置位置和尺寸 7 [self.view addSubview:ima]; // 添加到view 8 }
2、其次才是添加事件,将过程封装到另一个函数中。默认显示的是2列
COUNT是另一个宏,表示默认表情的数量
#define COUNT 10
参数是要设置的列数
1 - (void)adjustImagePosWithColumns:(int)col //add:(BOOL)add 2 { 3 4 // 是否是第一次添加图片,第一次只有一个子控件 5 int first = self.view.subviews.count; 6 //NSLog(@"%ld",self.view.subviews.count); 7 int columns = col; // 列数 8 // 间距 = (view宽度 - 列数 * 表情宽度) / (列数 + 1) 9 CGFloat margin = (self.view.frame.size.width - columns *WIDTH_HIGHT)/(columns + 1); 10 // 第一个表情位置 11 CGFloat oneY = 100; 12 CGFloat oneX = margin; 13 // for循环,遍历所有的子控件 14 for (int i = 0 ; i < COUNT ; i ++) 15 { 16 int col = i % columns; 17 int row = i / columns; 18 // 计算xy,列数决定x,行数决定y 19 CGFloat x = oneX + col * (WIDTH_HIGHT + margin); 20 CGFloat y = oneY + row * (WIDTH_HIGHT + margin); 21 // 判断是重新排序还是添加图片,如果子控件个数为1则进行添加,否则进行重新排序 22 if (1 == first) // 添加图片 23 { 24 int no = i % 9; // 保证图片显示在制定 内 25 NSString *name = [NSString stringWithFormat:@"01%d.png",no]; 26 [self addImageWithName:name x:x y:y]; // 添加控件到view 27 if( (++no) == 9) 28 { 29 // 在末尾添加一个按钮,这里不知道怎么给按钮添加响应事件 30 _btnAdd = [[UIButton alloc] init]; 31 [_btnAdd setBackgroundImage:[UIImage imageNamed:@"019.png"] forState:UIControlStateNormal]; 32 _btnAdd.frame = CGRectMake(x,y, WIDTH_HIGHT, WIDTH_HIGHT); 33 [self.view addSubview:_btnAdd]; 34 } 35 } 36 else // 进行重新排序,要忽略segmented的位置 37 { 38 // 取出i+1位置对应的表情,设置x、y值 39 UIView *child = self.view.subviews[i + 1]; // +1是为了跳过segmentControll控件 40 // 获取子控件的frame 41 CGRect rect = child.frame; 42 // 设置起始坐标位置 43 rect.origin = CGPointMake(x, y); 44 // 重新赋值 45 child.frame = rect; 46 47 } // end of if 48 49 } // end of for 50 51 }
3、然后在viewDidLoad加载表情
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 // Do any additional setup after loading the view, typically from a nib. 5 6 // 调用方法,添加表情到视图 7 [self adjustImagePosWithColumns:2]; 8 }
4、在valueChanged事件中相应改变
1 - (IBAction)segmentValue:(UISegmentedControl *)sender 2 { 3 // NSLog(@"%d",sender.selectedSegmentIndex); 4 // 开始动画 5 [UIView beginAnimations:nil context:nil]; 6 // 设置动画事件 7 [UIView setAnimationDuration:0.5]; 8 int columns = sender.selectedSegmentIndex + 2; // 要显示的列数从2列开始 9 [self adjustImagePosWithColumns:columns]; // 调用方法 10 // 执行动画 11 [UIView commitAnimations]; 12 }
所有代码如下
SLQViewController.h 文件
1 // 2 // SLQViewController.h 3 4 // Created by Christian on 15/4/27. 5 // Copyright (c) 2015年 itcast. All rights reserved. 6 // 7 8 #import <UIKit/UIKit.h> 9 10 @interface SLQViewController : UIViewController 11 12 13 // 函数名:segmentValue: 14 // 返回值: void 15 // 参数: (UISegmentedControl *)sender 16 // 描述: segmentedControll控件的值改变响应事件 17 - (IBAction)segmentValue:(UISegmentedControl *)sender; 18 19 20 @end
SLQViewController.m 文件
1 // 2 // SLQViewController.m 3 // 练习01_1 4 // 5 // Created by Christian on 15/4/27. 6 // Copyright (c) 2015年 itcast. All rights reserved. 7 // 8 9 #import "SLQViewController.h" 10 #define WIDTH_HIGHT 60 // 表情默认宽度和高度 11 #define COUNT 10 // 默认子控件数量 12 13 @implementation SLQViewController 14 15 { 16 UIButton *_btnAdd; // 添加表情按钮 17 } 18 19 - (void)viewDidLoad 20 { 21 [super viewDidLoad]; 22 // Do any additional setup after loading the view, typically from a nib. 23 24 // 调用方法,添加表情到视图 25 [self adjustImagePosWithColumns:2]; 26 } 27 // 函数名:addImageWithName: x: y: 28 // 返回值: void 29 // 参数: (NSString *)name (CGFloat)x (CGFloat)y 30 // 描述: 添加图片到视图 31 - (void)addImageWithName:(NSString *)name x:(CGFloat)x y:(CGFloat)y 32 { 33 // 通过代码加载图片 34 UIImageView *ima = [[UIImageView alloc] init]; // 初始化图片对象 35 ima.image = [UIImage imageNamed:name]; // 获取名称 36 ima.frame = CGRectMake(x, y, WIDTH_HIGHT, WIDTH_HIGHT); // 设置位置和尺寸 37 [self.view addSubview:ima]; // 添加到view 38 } 39 40 - (void)didReceiveMemoryWarning 41 { 42 [super didReceiveMemoryWarning]; 43 // Dispose of any resources that can be recreated. 44 } 45 // 函数名:segmentValue: 46 // 返回值: void 47 // 参数: (UISegmentedControl *)sender 48 // 描述: segmentedControll控件的值改变响应事件 49 - (IBAction)segmentValue:(UISegmentedControl *)sender 50 { 51 // NSLog(@"%d",sender.selectedSegmentIndex); 52 // 开始动画 53 [UIView beginAnimations:nil context:nil]; 54 // 设置动画事件 55 [UIView setAnimationDuration:0.5]; 56 int columns = sender.selectedSegmentIndex + 2; // 列数从2开始 57 [self adjustImagePosWithColumns:columns]; // 调用方法 58 // 执行动画 59 [UIView commitAnimations]; 60 } 61 // 函数名:adjustImagePosWithColumns: 62 // 返回值: void 63 // 参数: (int)col 64 // 描述: 根据列数添加或者排序表情 65 - (void)adjustImagePosWithColumns:(int)col //add:(BOOL)add 66 { 67 68 // 是否是第一次添加图片,第一次只有一个子控件 69 int first = self.view.subviews.count; 70 //NSLog(@"%ld",self.view.subviews.count); 71 int columns = col; // 列数 72 // 间距 = (view宽度 - 列数 * 表情宽度) / (列数 + 1) 73 CGFloat margin = (self.view.frame.size.width - columns *WIDTH_HIGHT)/(columns + 1); 74 // 第一个表情位置 75 CGFloat oneY = 100; 76 CGFloat oneX = margin; 77 // for循环,遍历所有的子控件 78 for (int i = 0 ; i < COUNT ; i ++) 79 { 80 int col = i % columns; 81 int row = i / columns; 82 // 计算xy,列数决定x 83 CGFloat x = oneX + col * (WIDTH_HIGHT + margin); 84 CGFloat y = oneY + row * (WIDTH_HIGHT + margin); 85 // 判断是重新排序还是添加图片,如果子控件个数为1则进行添加,否则进行重新排序 86 if (1 == first) // 添加图片 87 { 88 int no = i % 9; // 保证图片显示在指定范围内 89 NSString *name = [NSString stringWithFormat:@"01%d.png",no]; 90 [self addImageWithName:name x:x y:y]; // 添加控件到view 91 if( (++no) == 9) 92 { 93 // 在末尾添加一个按钮,这里不知道怎么给按钮添加响应事件 94 _btnAdd = [[UIButton alloc] init]; 95 [_btnAdd setBackgroundImage:[UIImage imageNamed:@"019.png"] forState:UIControlStateNormal]; 96 _btnAdd.frame = CGRectMake(x,y, WIDTH_HIGHT, WIDTH_HIGHT); 97 [self.view addSubview:_btnAdd]; 98 } 99 } 100 else // 进行重新排序,要忽略segmented的位置 101 { 102 // 取出i+1位置对应的表情,设置x、y值 103 UIView *child = self.view.subviews[i + 1]; // +1是为了跳过segmentControll控件 104 // 获取子控件的frame 105 CGRect rect = child.frame; 106 // 设置起始坐标位置 107 rect.origin = CGPointMake(x, y); 108 // 重新赋值 109 child.frame = rect; 110 111 } // end of if 112 113 } // end of for 114 115 } 116 117 118 @end
效果如下:按钮已经添加上了,但是如何响应事件呢?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。