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

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

那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊。(知道怎么办了,原来是方法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. C/C++ sort函数的用法

    sort函数的用法(#include<algorithm>) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比 ...

  2. ADO数据库编程详解(C++)----初级入门篇

    一.概述 ADO即Microsoft ActiveXData Object,是Microsoft继ODBC之后,基于OLE DB技术的一种数据库操作技术,使您能够编写通过 OLE DB提供者对在数据库 ...

  3. Merge更新同步一个表

    merge T2   --目标表using T1    --源表 on T1.id=T2.id   --匹配条件 when matched then    --匹配update set [name]= ...

  4. cms-帖子管理

    mapper: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC & ...

  5. Windows底层开发前期学习准备工作

    1.若对Windows底层开发没有兴趣,不建议继续深究, 若有些兴趣可以继续. 2. 先广泛打基础,比如C/ASM/C++/MFC,再学习Windows核心编程,对R3上的一些开发有所熟悉,再系统的学 ...

  6. kafka 开机启动脚本

    /etc/init.d$ vi kafka-start-up.sh #!/bin/bash #export KAFKA_HOME=$PATH export KAFKA_HOME=/opt/Kafka/ ...

  7. 在RichTextBox控件中显示RTF格式文件

    实现效果: 知识运用:    RichTextBox控件的LoadFile方法 //将文件内容加载到RichTextBox控件中 public void LoadFile(string path,Ri ...

  8. 如何更改VirtualBox虚拟电脑内存大小

  9. 移动端rem匹配

    Rem是相对于根元素font-size大小的单位 记inphone5屏幕宽度是 320px font-size16px 1rem=16px <html>   <head>    ...

  10. Mac 系统 + Chrome浏览器 网页前端出现中文文字反转或顺序错乱

    问题背景 React开发的系统,收到一个BUG反馈,*"号个人统计"文字不正确,应为"个人号统计"*. 收到BUG后,打开浏览器查验是什么情况,难道犯了最基本的 ...