IOS开发学习笔记021-练习2
只是简单练习一下,主要是学习里面的思想,处理问题的方法。
不过还有一个问题没想到解决方法。
那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊。(知道怎么办了,原来是方法addTarget)
segmentControll 控件和imageView 控件
总体效果如下,点击3列,表情按照3列显示,点击4列表情按照4列显示。

界面也很简单,只有一个segmentedControll控件,表情是通过代码生成的,自动排序。
一、先将界面做好,将表情资源添加到工程里,具体方法可以看上一篇。

1、segmentControll 控件只需设置几个列显示就行,然后绑定事件

2、绑定valueChanged事件
- (IBAction)segmentValue:(UISegmentedControl *)sender; // 值改变后相应事件 - (IBAction)segmentValue:(UISegmentedControl *)sender // 值改变后相应事件
{
}
可以在方法中测试是否正常, 可以使用属性selectedSegmentIndex
- (IBAction)segmentValue:(UISegmentedControl *)sender
{
NSLog(@"%d",sender.selectedSegmentIndex); // 获取改变的值
}
二、加载表情资源到视图中
1、首先将加载表情资源的过程封装到一个 方法中。其中WIDTH_HIGHT是一个宏表示表情的宽度和高度
#define WIDTH_HIGHT 60
参数是表情的名称和位置。
- (void)addImageWithName:(NSString *)name x:(CGFloat)x y:(CGFloat)y
{
// 通过代码加载图片
UIImageView *ima = [[UIImageView alloc] init]; // 初始化图片对象
ima.image = [UIImage imageNamed:name]; // 获取名称
ima.frame = CGRectMake(x, y, WIDTH_HIGHT, WIDTH_HIGHT); // 设置位置和尺寸
[self.view addSubview:ima]; // 添加到view
}
2、其次才是添加事件,将过程封装到另一个函数中。默认显示的是2列
COUNT是另一个宏,表示默认表情的数量
#define COUNT 10
参数是要设置的列数
- (void)adjustImagePosWithColumns:(int)col //add:(BOOL)add
{ // 是否是第一次添加图片,第一次只有一个子控件
int first = self.view.subviews.count;
//NSLog(@"%ld",self.view.subviews.count);
int columns = col; // 列数
// 间距 = (view宽度 - 列数 * 表情宽度) / (列数 + 1)
CGFloat margin = (self.view.frame.size.width - columns *WIDTH_HIGHT)/(columns + );
// 第一个表情位置
CGFloat oneY = ;
CGFloat oneX = margin;
// for循环,遍历所有的子控件
for (int i = ; i < COUNT ; i ++)
{
int col = i % columns;
int row = i / columns;
// 计算xy,列数决定x,行数决定y
CGFloat x = oneX + col * (WIDTH_HIGHT + margin);
CGFloat y = oneY + row * (WIDTH_HIGHT + margin);
// 判断是重新排序还是添加图片,如果子控件个数为1则进行添加,否则进行重新排序
if ( == first) // 添加图片
{
int no = i % ; // 保证图片显示在制定 内
NSString *name = [NSString stringWithFormat:@"01%d.png",no];
[self addImageWithName:name x:x y:y]; // 添加控件到view
if( (++no) == )
{
// 在末尾添加一个按钮,这里不知道怎么给按钮添加响应事件
_btnAdd = [[UIButton alloc] init];
[_btnAdd setBackgroundImage:[UIImage imageNamed:@"019.png"] forState:UIControlStateNormal];
_btnAdd.frame = CGRectMake(x,y, WIDTH_HIGHT, WIDTH_HIGHT);
[self.view addSubview:_btnAdd];
}
}
else // 进行重新排序,要忽略segmented的位置
{
// 取出i+1位置对应的表情,设置x、y值
UIView *child = self.view.subviews[i + ]; // +1是为了跳过segmentControll控件
// 获取子控件的frame
CGRect rect = child.frame;
// 设置起始坐标位置
rect.origin = CGPointMake(x, y);
// 重新赋值
child.frame = rect; } // end of if } // end of for }
3、然后在viewDidLoad加载表情
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. // 调用方法,添加表情到视图
[self adjustImagePosWithColumns:];
}
4、在valueChanged事件中相应改变
- (IBAction)segmentValue:(UISegmentedControl *)sender
{
// NSLog(@"%d",sender.selectedSegmentIndex);
// 开始动画
[UIView beginAnimations:nil context:nil];
// 设置动画事件
[UIView setAnimationDuration:0.5];
int columns = sender.selectedSegmentIndex + ; // 要显示的列数从2列开始
[self adjustImagePosWithColumns:columns]; // 调用方法
// 执行动画
[UIView commitAnimations];
}
所有代码如下
SLQViewController.h 文件
//
// SLQViewController.h // Created by Christian on 15/4/27.
// Copyright (c) 2015年 itcast. All rights reserved.
// #import <UIKit/UIKit.h> @interface SLQViewController : UIViewController // 函数名:segmentValue:
// 返回值: void
// 参数: (UISegmentedControl *)sender
// 描述: segmentedControll控件的值改变响应事件
- (IBAction)segmentValue:(UISegmentedControl *)sender; @end
SLQViewController.m 文件
//
// SLQViewController.m
// 练习01_1
//
// Created by Christian on 15/4/27.
// Copyright (c) 2015年 itcast. All rights reserved.
// #import "SLQViewController.h"
#define WIDTH_HIGHT 60 // 表情默认宽度和高度
#define COUNT 10 // 默认子控件数量 @implementation SLQViewController {
UIButton *_btnAdd; // 添加表情按钮
} - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. // 调用方法,添加表情到视图
[self adjustImagePosWithColumns:];
}
// 函数名:addImageWithName: x: y:
// 返回值: void
// 参数: (NSString *)name (CGFloat)x (CGFloat)y
// 描述: 添加图片到视图
- (void)addImageWithName:(NSString *)name x:(CGFloat)x y:(CGFloat)y
{
// 通过代码加载图片
UIImageView *ima = [[UIImageView alloc] init]; // 初始化图片对象
ima.image = [UIImage imageNamed:name]; // 获取名称
ima.frame = CGRectMake(x, y, WIDTH_HIGHT, WIDTH_HIGHT); // 设置位置和尺寸
[self.view addSubview:ima]; // 添加到view
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// 函数名:segmentValue:
// 返回值: void
// 参数: (UISegmentedControl *)sender
// 描述: segmentedControll控件的值改变响应事件
- (IBAction)segmentValue:(UISegmentedControl *)sender
{
// NSLog(@"%d",sender.selectedSegmentIndex);
// 开始动画
[UIView beginAnimations:nil context:nil];
// 设置动画事件
[UIView setAnimationDuration:0.5];
int columns = sender.selectedSegmentIndex + ; // 列数从2开始
[self adjustImagePosWithColumns:columns]; // 调用方法
// 执行动画
[UIView commitAnimations];
}
// 函数名:adjustImagePosWithColumns:
// 返回值: void
// 参数: (int)col
// 描述: 根据列数添加或者排序表情
- (void)adjustImagePosWithColumns:(int)col //add:(BOOL)add
{ // 是否是第一次添加图片,第一次只有一个子控件
int first = self.view.subviews.count;
//NSLog(@"%ld",self.view.subviews.count);
int columns = col; // 列数
// 间距 = (view宽度 - 列数 * 表情宽度) / (列数 + 1)
CGFloat margin = (self.view.frame.size.width - columns *WIDTH_HIGHT)/(columns + );
// 第一个表情位置
CGFloat oneY = ;
CGFloat oneX = margin;
// for循环,遍历所有的子控件
for (int i = ; i < COUNT ; i ++)
{
int col = i % columns;
int row = i / columns;
// 计算xy,列数决定x
CGFloat x = oneX + col * (WIDTH_HIGHT + margin);
CGFloat y = oneY + row * (WIDTH_HIGHT + margin);
// 判断是重新排序还是添加图片,如果子控件个数为1则进行添加,否则进行重新排序
if ( == first) // 添加图片
{
int no = i % ; // 保证图片显示在指定范围内
NSString *name = [NSString stringWithFormat:@"01%d.png",no];
[self addImageWithName:name x:x y:y]; // 添加控件到view
if( (++no) == )
{
// 在末尾添加一个按钮,这里不知道怎么给按钮添加响应事件
_btnAdd = [[UIButton alloc] init];
[_btnAdd setBackgroundImage:[UIImage imageNamed:@"019.png"] forState:UIControlStateNormal];
_btnAdd.frame = CGRectMake(x,y, WIDTH_HIGHT, WIDTH_HIGHT);
[self.view addSubview:_btnAdd];
}
}
else // 进行重新排序,要忽略segmented的位置
{
// 取出i+1位置对应的表情,设置x、y值
UIView *child = self.view.subviews[i + ]; // +1是为了跳过segmentControll控件
// 获取子控件的frame
CGRect rect = child.frame;
// 设置起始坐标位置
rect.origin = CGPointMake(x, y);
// 重新赋值
child.frame = rect; } // end of if } // end of for } @end
效果如下:按钮已经添加上了,但是如何响应事件呢?

IOS开发学习笔记021-练习2的更多相关文章
- iOS开发学习笔记:基础篇
iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...
- ios开发学习笔记(1)
objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...
- iOS开发学习笔记
1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...
- ios开发学习笔记(这里一定有你想要的东西,全部免费)
1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...
- IOS开发学习笔记017-第一个IOS应用
第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...
- (ios开发学习笔记一)ios项目文件结构
转自:http://www.cnblogs.com/macroxu-1982/archive/2012/07/31/2616389.html 下面是单个窗体项目例子,我们从这个项目开始,说明ios项目 ...
- ios开发学习笔记040-autolayout 第三方框架Masonry
不管是是界面创建约束还是代码创建约束,苹果官方提供的方式都比较繁琐.所以出现了第三方框架. Masonry 在github地址如下: https://github.com/SnapKit/Masonr ...
- IOS开发学习笔记026-UITableView的使用
UITableView的简单使用过程 简单介绍 两种样式 UITableViewStylePlain UITableViewStyleGrouped 数据显示需要设置数据源,数据源是符合遵守协议 &l ...
- IOS开发学习笔记016-Foundation框架
Foundation 框架的学习 一.Foundation 常用结构体 1.NSRange(location,length) typedef struct _NSRange { NSUIntege ...
随机推荐
- Java static修饰符小记
首先我们明确一点:java是一个纯面向对象的编程语言,它的每一个文件都视为一个类,当我们创建一个对象的时候,就是在调用一个文件,那么这个时候,这个文件(类)里的一些东西,它是需要通过对象来使用或访问, ...
- OpenSSL context 的几个参数
NAME SYNOPSIS DESCRIPTION NOTES BUGS RETURN VALUES EXAMPLES SEE ALSO NAME SSL_CTX_set_verify, SSL_se ...
- codeblocks winsock配置
在codeblocks进行Socket编程遇到如下情况: undefined reference to WSAStartup@8 解决方法: 右击工程,选择 build options,选择 Link ...
- 解决 Unable to convert MySQL date/time value to System.DateTime
C#读取MySql时,如果存在字段类型为date/datetime时的可能会出现以下问题“Unable to convert MySQL date/time value to System.DateT ...
- POJ 3050 Hopscotch(dfs,stl)
用stack保存数字,set判重.dfs一遍就好.(或者编码成int,快排+unique #include<cstdio> #include<iostream> #includ ...
- UVA 12161 Ironman Race in Treeland (树分治)
题意:求树上的一条费用不超过m的路径,使得总长度尽量大. 人参第一发树分治,紫书上思路讲得比较清晰,这里不再赘述. 实现的时候,用一个类似时间戟的东西,记录结点首次访问的时间,并保存结点序列. 合并的 ...
- 索引属性 name指定
创建索引时的格式: db.collection.ensureIndex({param},{param}) 其中,第一个是索引的值,之前一直只用到了第一个,第二个参数便是索引的属性 比较重要的属性有: ...
- python基础一 day17 复习
# 迭代器# 生成器进阶 # 内置函数 # 55个 # 带key的 max min filter map sorted # 思维导图上红色和黄色方法必须会用 # 匿名函数 # lambda 参数,参数 ...
- matlplotlib 为折线图填充渐变颜色
概要 本篇记录绘图时填充颜色时的一些常用设置,主要用到了 imshow,fill 函数. 填充图实例 填充的效果图如下: 图 1:渐变色效果图 可根据下方给出的代码进行自定义. #!/us ...
- 基于CXF开发crm服务
1 基于CXF开发crm服务 1.1 数据库环境搭建 1.2 web项目环境搭建 第一步:创建动态web项目 第二步:导入CXF相关jar包 第三步:配置web.xml <context-par ...