只是简单练习一下,主要是学习里面的思想,处理问题的方法。

不过还有一个问题没想到解决方法。

那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊。(知道怎么办了,原来是方法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的更多相关文章

  1. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  2. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

  3. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

  4. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  5. IOS开发学习笔记017-第一个IOS应用

    第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...

  6. (ios开发学习笔记一)ios项目文件结构

    转自:http://www.cnblogs.com/macroxu-1982/archive/2012/07/31/2616389.html 下面是单个窗体项目例子,我们从这个项目开始,说明ios项目 ...

  7. ios开发学习笔记040-autolayout 第三方框架Masonry

    不管是是界面创建约束还是代码创建约束,苹果官方提供的方式都比较繁琐.所以出现了第三方框架. Masonry 在github地址如下: https://github.com/SnapKit/Masonr ...

  8. IOS开发学习笔记026-UITableView的使用

    UITableView的简单使用过程 简单介绍 两种样式 UITableViewStylePlain UITableViewStyleGrouped 数据显示需要设置数据源,数据源是符合遵守协议 &l ...

  9. IOS开发学习笔记016-Foundation框架

     Foundation 框架的学习 一.Foundation 常用结构体 1.NSRange(location,length)  typedef struct _NSRange { NSUIntege ...

随机推荐

  1. meterpreter > sysinfo

    meterpreter > sysinfoComputer : test-VCS86VROS : Windows XP (Build 2600).Architecture : x86System ...

  2. OpenSSL context 的几个参数

    NAME SYNOPSIS DESCRIPTION NOTES BUGS RETURN VALUES EXAMPLES SEE ALSO NAME SSL_CTX_set_verify, SSL_se ...

  3. linux 命令——49 at (转)

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  4. linux 命令——29 chgrp(转)

    在 lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别 码都可以.Chgrp命令就是change grou ...

  5. 如何在ABAP Netweaver和CloudFoundry里记录并查看日志

    Netweaver 要记录日志需要有一个checkpoint group,可以自行创建也可以使用标准的.这里我重用标准的group:DEMO_CHECKPOINT_GROUP. tcode SAAB, ...

  6. cesium加载shp格式数据

    方法一: shp格式转换为GeoJson格式并加载 首先注意shp的坐标系,要转换为WGS84,使用arcgis或QGIS 工具:http://mapshaper.org/: 注意:export时,输 ...

  7. JAVA设计模式初探之桥接模式

    生活中的一个例子:    拿汽车在路上行驶的来说.既有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶.这你会发现,对于交通工具(汽车)有不同的类型,它们所行驶的环境(路)也 ...

  8. 2017.12.4 JavaWeb中EL表达式的运用

    <%@ page contentType="text/html; charset=gb2312"%> <html> <head> <tit ...

  9. pytho线程信号量

    pytho线程信号量 import threading,time def going(num,sleep_time): semaphore.acquire()#启动允许执行 print("g ...

  10. 题解 CF20A 【BerOS file system】

    对于此题,我的心近乎崩溃 这道题,注意点没有什么,相信大佬们是可以自己写出来的 我是蒟蒻,那我是怎么写出来的啊 好了,废话少说,开始进入正题 这道题,首先我想到的是字符串的 erase 函数,一边运行 ...