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 ...
随机推荐
- Python学习笔记-day1(while流程控制)
count = 0 while True: #print('count:',count) if count == 3: print('you guess over 3 times!fuck off!' ...
- Windows Azure 入门 -- VS 2015部署 ASP.NET网站(项目) 与 数据库
Windows Azure 入门 -- 部署 ASP.NET网站(项目) 与数据库 https://www.dotblogs.com.tw/mis2000lab/2015/12/24/windowsa ...
- iphone开发笔记
1.uiimage图片拉伸 - (void)stretchBackgroundImage { //UIImage *originalImage = [[self backgroundImageForS ...
- common-fileupload组件实现java文件上传和下载
简介:文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- 关于小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题
问题:小程序的input组件经常用到,但在使用input组件的时候会出现一种现象:明明设置了input的宽度,但是输入的内容显示的长度范围却怎么都不到一整个input组件的宽度,而且后面没显示的地方无 ...
- wepy框架构建小程序(1)
wepy框架构建小程序(1) 基本操作: # 安装脚手架工具 npm install wepy-cli -g # 创建一个新的项目 npm init standard myproject # 进入新项 ...
- 已解决: idea创建并部署SpringMVC项目时 报错 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
用IDEA创建并运行SpringMVC项目时,最初发现没有Servlet包,这个问题已在上篇解决,然而当我们尝试去运行此时的SpringMVC项目时,发现仍然有错误.ClassNotFoundExce ...
- Finders Keepers-freecodecamp算法题目
Finders Keepers 1.要求 写一个 function,它遍历数组 arr,并返回数组中第一个满足 func 返回值的元素. 举个例子,如果 arr 为 [1, 2, 3],func 为 ...
- P4747 D’s problem(d)
时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题 描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了. 这次记者招待会上,记者对 ...
- mysql中如何不重复插入,mysql 重复的不插入,mysql唯一的插入
INSERT INTO new_schedules_spider_shipsname ( ID,SCAC,VESSEL,VOYAGE,SERVICE_NAME,MD5 ) SELECT NULL,%s ...