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 ...
随机推荐
- Cocos2d-x v3.1 Hello world程序(四)
Cocos2d-x v3.1 Hello world程序(四) 在上一篇文章中我们我们已经使用Cocos-Console工具生成了工程,本机生成的目录为:"D:\CocosProject\T ...
- pat乙级1045
从左到右扫描时记录扫描到当前下标为止的最大值,如果当前元素大于这个最大值,那么它就大于它左边的所有值.同理,从右到左扫描记录扫描到当前下标为止的最小值,如果当前元素小于这个最大小值,那么它就小于它右边 ...
- JavaScript:理解worker事件api
如果你不是很了解Event事件,建议先看我上一篇随文javascript:理解DOM事件.或者直接看下文worker api. hack 首先,我们需要实例一个Worker的对象,浏览器会根据新创建的 ...
- IOS 获取文本焦点 主动召唤出键盘(becomeFirstResponder) and 失去焦点(退下键盘)
主动召唤出键盘 - (void)viewDidAppear:(BOOL)animated { // 3.主动召唤出键盘 [self.nameField becomeFirstResponder]; / ...
- React后台管理系统-用户列表页面
1.页面的结构 //遍历list, 返回数据 let listBody= this.state.list.map((user,index)=> { return ...
- windows下安装Linux虚拟机
一.下载ios 下载网址:https://wwww.centos.org 选择一个.iso下载 二.安装一个vmware workstation或者Hyper-v的虚拟机 2.1.Hyper-v 2. ...
- Oracle 字符串处理函数
字符串处理函数 ① substr(string,a,b)/substr(string,a) string 为字符串,string 表示需要截取的字符串. a.b 均为整型数字,a 表示开始截取的位置, ...
- Dynemic Web Project中使用servlet的 doGet()方法接收来自浏览器客户端发送的add学生信息形成json字符串输出到浏览器并保存到本地磁盘文件
package com.swift.servlet; import java.io.FileOutputStream;import java.io.IOException;import java.io ...
- A1020 Tree Traversals (25 分)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
- 认识mysql(1)
---恢复内容开始--- 1.MySQL概述 1.什么是数据库? 存储数据的仓库 2.都有哪些公司在用数据库? 金融机构.游戏公司.购物网站.论坛网站... 3.提供数据库服务的软件? 1.软件分类 ...