iOS_4_表情排列

最终效果图:

BeyondViewController.h

//
//  BeyondViewController.h
//  04_表情排列
//
//  Created by beyond on 14-7-22.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface BeyondViewController : UIViewController
@property (weak, nonatomic) IBOutlet UISegmentedControl *segment;
- (IBAction)segmentValueChanged:(UISegmentedControl *)sender;

@end

BeyondViewController.m

//
//  BeyondViewController.m
//  04_表情排列
//
//  Created by beyond on 14-7-22.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondViewController.h"
// 添加按钮的tag,因为segment值改变时,要将按钮置于数组最后面
#define kAddButton_Tag 99
@interface BeyondViewController ()

@end

@implementation BeyondViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"view did load");

    int colsNum = _segment.selectedSegmentIndex + 2;
    // 调用自定义方法  添加images
    [self alinmentWithCols:colsNum];
    // 添加一个 按钮放到最后面,目的是:点击按钮就可以添加一个imageView到最后
    [self addBtn];
}

// 添加一个 按钮放到最后面,目的是:点击按钮就可以添加一个imageView到最后
- (void)addBtn
{
    // sg_btn 代码生成按钮 1,实例化
    UIButton *btn = [[UIButton alloc]init];
    // 2,设定详情
    // 正常状态
    btn.tag = kAddButton_Tag;
    [btn setTitle:@"normal" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

    [btn setBackgroundImage:[UIImage imageNamed:@"sub_black_add.png"] forState:UIControlStateNormal];
    // 点击时高亮状态
    [btn setTitle:@"highlighted" forState:UIControlStateHighlighted];
    [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    [btn setBackgroundImage:[UIImage imageNamed:@"sub_blue_add.png"] forState:UIControlStateHighlighted];
    // 为按钮添加点击事件
    [btn addTarget:self action:@selector(addBtnClick:) forControlEvents:UIControlEventTouchUpInside];

#warning 下面全是通过i 计算i的排列坐标
    NSArray *array = self.view.subviews;
    // 按钮的排号为i,通过 i 算出行号,列号,坐标x y
    int i = array.count-1;
    // 调用自定义的方法,通过控件在格子中的索引即排号,算出其应该在哪一行,哪一列,从而得到其坐标
    CGPoint btn_pos = [self getPositionByIndexInCell:i];
    btn.frame = CGRectMake(btn_pos.x, btn_pos.y, 60, 60);

    // 3,添加按钮到self.view
    [self.view addSubview:btn];
}
// 通过控件位于格子里面的i,即排号,得到它位于哪一行哪一列,从而返回其x,y
- (CGPoint)getPositionByIndexInCell:(int)i
{
    int colsNum = _segment.selectedSegmentIndex + 2;
    //NSLog(@"在格子里面的排号i为 %d",i);
    // 第0个即排头的表情的y
    int firstImgY = 60;
    // 表情之间的净间距
    int imgMargin = (self.view.frame.size.width-60*colsNum)/(colsNum+1);
    // 第0个即排头的表情的x
    int firstImgX = imgMargin;

    // 第i个表情(这儿是按钮) 所在的行号
    int row = i/colsNum;
    // 第i个表情(这儿是按钮) 所在的列号
    int cols = i%colsNum;
    int x = cols * (60+imgMargin)+firstImgX;
    int y = row * (60+imgMargin)+firstImgY;
    return CGPointMake(x, y);
}
// 当点击 + 号按钮的时候,创建 一个随机的imgView,并添加到self.view里面,注意imgView位置,以及btn的位置
- (void)addBtnClick:(UIButton *)sender
{
    // 1,类方法创建控件
    UIImageView *imgView = [[UIImageView alloc]init];
    // 2,控件细节
    int rand = arc4random_uniform(9);
    NSString *imgName = [NSString stringWithFormat:@"01%d.png",rand];
    imgView.image = [UIImage imageNamed:imgName];
    // 屏幕宽高
    CGSize winSize = self.view.bounds.size;
    int orgin_x = arc4random_uniform(winSize.width);
    int orgin_y = arc4random_uniform(winSize.height);
    imgView.frame = CGRectMake(orgin_x, orgin_y, 0, 0);
    // 3,将控件添加到当前控制器的view
    [self.view addSubview:imgView];
    [UIView animateWithDuration:1 animations:^{
        // 动画实现2个要求:1,为新添加的imgView设置x y 2,为按钮重新设置x y
        NSArray *array = [self.view subviews];
        // 排号为i,通过 i 算出行号,列号,坐标x y
        int imgView_i = array.count-3;
        int sender_i = array.count-2;
        // 调用自定义的方法,通过控件在格子中的索引即排号,算出其应该在哪一行,哪一列,从而得到其坐标
        CGPoint imgView_pos = [self getPositionByIndexInCell:imgView_i];
        CGPoint sender_pos = [self getPositionByIndexInCell:sender_i];

        // 重新设置新添加的imgview的位置 以及 添加按钮的位置
        imgView.frame = CGRectMake(imgView_pos.x, imgView_pos.y, 60, 60);
        sender.frame = CGRectMake(sender_pos.x, sender_pos.y, 60, 60);
    }];
}
// 自定义方法,参数:图片名 010.png ~ 018.png x坐标 y坐标
- (void) addImg:(NSString *)imgName x:(CGFloat)x y:(CGFloat)y
{
    // 1,实例化
    UIImageView *imgView = [[UIImageView alloc]init];
    // 2,设置细节
    UIImage *img = [UIImage imageNamed:imgName];
    imgView.image = img;
    imgView.frame = CGRectMake(x, y, 60, 60);
    // 3,添加到self的view里面,以便显示
    [self.view addSubview:imgView];

}

- (IBAction)segmentValueChanged:(UISegmentedControl *)sender {
    // 索引的值为0 1 2 3 -------2列 3列 4列 5列
    // NSLog(@"%d",sender.selectedSegmentIndex);
    int segmentIndex = sender.selectedSegmentIndex;
    int colsNum = segmentIndex + 2;

    // 在调整位置之前,先要在self.view.subViews数组里面,将添加按钮放到最一个位置
    // 通过tag取到addButton
    UIButton *addBtn = [self.view viewWithTag:kAddButton_Tag];
    // 为了能够始终让addBtn在self.view的最后一个,先将其移出父控件,再加到父控件
    [addBtn removeFromSuperview];
    [self.view addSubview:addBtn];
    // 调用自定义方法  调整原来的位置
    [self alinmentWithCols:colsNum];

}
// 抽取出来的方法,分为添加和取出重新调整2种处理方式,判断方法是 view中的子控件数目是否只有一个segmentControl
- (void) alinmentWithCols:(int)colsNum
{
    // 如果子控件个数为 1 即只有 segmentControl这一个控件,那么添加,否则,重新调整位置
    int subViewsCount = [[self.view subviews] count];
    //NSLog(@"子控件个数:%d---",subViewsCount);
    // 抽取出来的共同代码

    int n = subViewsCount - 1;
    // 如果 n = 0,说明只有一个segment,此时要添加3个imageView
    // 否则,取出所有的子控件,重新 设置位置
    for (int i=0; i<=(n==0?3:n-1); i++) {

        // 调用自定义的方法,通过控件在格子中的索引即排号,算出其应该在哪一行,哪一列,从而得到其坐标
        CGPoint pos = [self getPositionByIndexInCell:i];

        // 不同处理方式
        if (subViewsCount == 1) {
            NSString *imgName = [NSString stringWithFormat:@"01%d.png",i];
            [self addImg:imgName x:pos.x y:pos.y];
        } else {            // 当点击 segment的时候,不应该再次添加imageView,而是应该取出,重新设置xy
            // [self addImg:imgName x:x y:y];
            NSArray *array = [self.view subviews];
            NSLog(@"正在重新设置%@的位置",[array[i+1] class]);
            UIView *view = array[i+1];
            [UIView animateWithDuration:1 animations:^{
                // 以下三步为OC标准代码,因为OC中不允许直接修该对象中结构体属性的成员的值,要通过中间的临时结构体变量
                CGRect frame = view.frame;
                frame.origin = CGPointMake(pos.x, pos.y);
                view.frame=frame;
            }];
        } // end of if else
  } // end  of  for 循环

} // end of function

@end

效果图1

效果图2

时间: 2024-08-05 15:25:49

iOS_4_表情排列的相关文章

IOS学习—表情的排列

// // ViewController.m // 表情排列 // // Created by on 15/4/15. // Copyright (c) 2015年 apple. All rights reserved. // #import "ViewController.h" #define kImageWidth 40 @interface ViewController () { UIButton *_addImage; NSInteger _imageCount; NSInte

IOS 学习记录

表情排列 // // MJViewController.m // 01-表情排列 // // Created by apple on 13-11-24. // Copyright (c) 2013年 itcast. All rights reserved. // #import "MJViewController.h" /* 1.adjust....方法去掉第2个参数----add:(BOOL)add (不能增加全局变量或者成员变量) 2.在表情最后面增加一个“+”按钮,添加按钮在尾部

html打造动画【系列2】- 可爱的蛙蛙表情

先感受一下全部表情包: 在开始之前先安利一个知识点:Flex弹性布局 我们一般做水平三列布局都是用的float方法,将每一块浮动显示在同一行.这种方法会导致元素没有原来的高度属性,要用清除浮动来解决空间占据问题.对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了几乎所有浏览器的支持,这意味着,现在就能很安全地使用这项功能.基本语法查看博客:Flex 布局教程:语法篇

获取系统的emoji表情定制键盘

首先 ,想要获取系统的表情,要首先知道表情对应的UTF8 的编码方式,我将其中一部分的图片展示出来 ,然后用UIButton 排列,iOS 7后又增加了300多个表情符号,这些都可以百度查到,现在上代码: //将数字转为 #define EMOJI_CODE_TO_SYMBOL(x) ((((0x808080F0 | (x & 0x3F000) >> 4) | (x & 0xFC0) << 10) | (x & 0x1C0000) << 18)

【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升

[UOJ#278][UTR #2]题目排列顺序 试题描述 "又要出题了." 宇宙出题中心主任 -- 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这些题目的难度,然后再在汪洋大海中寻找符合该难度的题目. 题目的难度可以用一个 1 到 n 的排列 a1,-,an 表示,其中 ai 表示第 i 道题目在这 n 道题目中是第 ai 简单的题目,即恰有 ai?1 道题目比第 i 道题目简单. 经验丰富的吉米多出题斯基早就悟出了一种科学地决定难

iOS_仿QQ表情键盘

当UITextFiled和UITextView这种文本输入类控件成为第一响应者时,弹出的键盘由他们的一个UIView类的inputView属性来控制,当inputView为nil时会弹出系统的键盘,想要弹出自定义的键盘,将我们自定义的UIView对象给inputView属性赋值即可.表情键盘重点在于排列各个表情和删除键,以及表情键盘上的各种回调设置: 下面为键盘预览图,兼容了竖屏各版本适配,横屏没有兼顾.横屏适配参见这篇博客iOS之自定义表情键盘 图1为6的常用表情,图2为6的全部表情,图3为5

iOS开发之自定义表情键盘(组件封装与自动布局)

下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情键盘的.下面的内容会比较多,这篇博文还是比较有料的. 还是那句话写技术博客是少不了代码的,下面会结合代码来回顾一下iOS的知识,本篇博文中用到的知识点在前面的博客中都能找到相应的内容,本篇算是一个小小的功能整合.先来张图看

【Qt UI】仿QQ表情选择控件

表情选择控件在聊天应用中经常要用到,做起来虽然不复杂但是很繁琐,特别是有些图标需要按顺序排列.每次重做必然是很费时,所以我将聊天表情选择控件封装成一个独立的类QFaceSelectWidget,方便直接应用到自己的项目中. 先来看看效果图: 测试程序是一个对话框,里面放有一个QPushButton和一个QLabel,水平布局.点击按钮弹出"表情选择框",选择表情后"表情选择框"关闭,QLabel中显示刚才选择的表情."表情选择框"中的表情都是gi

测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现

以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察无非是检验 是否可以理解给定的需求 是否有设计测试用例的能力是否熟悉各种测试方法 是否有灵活的发散思维 以下给大家列举 登录功能 购物车模块 QQ收藏表情包 网上银行转账 支付宝充值 支付宝提现 6大常见的测试用例设计面试题 Q: 一.登录功能,设计测试用例. A: 功能测试: 1.输入正确的账号和