• IOS开发学习笔记021-练习2


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

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

    那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊。(知道怎么办了,原来是方法addTarget

    segmentControll 控件和imageView 控件

    总体效果如下,点击3列,表情按照3列显示,点击4列表情按照4列显示。

      

    界面也很简单,只有一个segmentedControll控件,表情是通过代码生成的,自动排序。

    一、先将界面做好,将表情资源添加到工程里,具体方法可以看上一篇。

      1、segmentControll 控件只需设置几个列显示就行,然后绑定事件

      2、绑定valueChanged事件

    1 - (IBAction)segmentValue:(UISegmentedControl *)sender; // 值改变后相应事件
    2 
    3 
    4 
    5 
    6 - (IBAction)segmentValue:(UISegmentedControl *)sender // 值改变后相应事件
    7 {
    8 }

       可以在方法中测试是否正常, 可以使用属性selectedSegmentIndex

    1 - (IBAction)segmentValue:(UISegmentedControl *)sender
    2 {
    3     NSLog(@"%d",sender.selectedSegmentIndex); // 获取改变的值
    4 } 

    二、加载表情资源到视图中

      1、首先将加载表情资源的过程封装到一个 方法中。其中WIDTH_HIGHT是一个宏表示表情的宽度和高度

      #define WIDTH_HIGHT 60

      参数是表情的名称和位置。

    1 - (void)addImageWithName:(NSString *)name x:(CGFloat)x y:(CGFloat)y
    2 {
    3     // 通过代码加载图片
    4     UIImageView *ima = [[UIImageView alloc] init]; // 初始化图片对象
    5     ima.image = [UIImage imageNamed:name]; // 获取名称
    6     ima.frame = CGRectMake(x, y, WIDTH_HIGHT, WIDTH_HIGHT); // 设置位置和尺寸
    7     [self.view addSubview:ima]; // 添加到view
    8 }

      2、其次才是添加事件,将过程封装到另一个函数中。默认显示的是2列

      COUNT是另一个宏,表示默认表情的数量

      #define COUNT 10

      参数是要设置的列数

     1 - (void)adjustImagePosWithColumns:(int)col //add:(BOOL)add
     2 {
     3 
     4     // 是否是第一次添加图片,第一次只有一个子控件
     5     int first = self.view.subviews.count;
     6    //NSLog(@"%ld",self.view.subviews.count);
     7     int columns = col; // 列数
     8     // 间距 = (view宽度 - 列数 * 表情宽度) / (列数 + 1)
     9     CGFloat margin = (self.view.frame.size.width - columns *WIDTH_HIGHT)/(columns + 1);
    10     // 第一个表情位置
    11     CGFloat oneY = 100;
    12     CGFloat oneX = margin;
    13     // for循环,遍历所有的子控件
    14     for (int i = 0 ; i < COUNT ; i ++)
    15     {
    16         int col = i % columns;
    17         int row = i / columns;
    18         // 计算xy,列数决定x,行数决定y
    19         CGFloat x = oneX + col * (WIDTH_HIGHT + margin);
    20         CGFloat y = oneY + row * (WIDTH_HIGHT + margin);
    21         // 判断是重新排序还是添加图片,如果子控件个数为1则进行添加,否则进行重新排序
    22         if (1 == first) // 添加图片
    23         {
    24             int no = i % 9; // 保证图片显示在制定 内
    25             NSString *name = [NSString stringWithFormat:@"01%d.png",no];
    26             [self addImageWithName:name x:x y:y]; // 添加控件到view
    27             if( (++no) == 9)
    28             {
    29                 // 在末尾添加一个按钮,这里不知道怎么给按钮添加响应事件
    30                 _btnAdd = [[UIButton alloc] init];
    31                 [_btnAdd setBackgroundImage:[UIImage imageNamed:@"019.png"] forState:UIControlStateNormal];
    32                 _btnAdd.frame = CGRectMake(x,y, WIDTH_HIGHT, WIDTH_HIGHT);
    33                 [self.view addSubview:_btnAdd];
    34             }
    35         }
    36         else // 进行重新排序,要忽略segmented的位置
    37         {
    38             // 取出i+1位置对应的表情,设置x、y值
    39             UIView *child = self.view.subviews[i + 1]; // +1是为了跳过segmentControll控件
    40             // 获取子控件的frame
    41             CGRect rect = child.frame;
    42             // 设置起始坐标位置
    43             rect.origin = CGPointMake(x, y);
    44             // 重新赋值
    45             child.frame = rect;
    46 
    47         } // end of if
    48         
    49     } // end of for
    50 
    51 }

      3、然后在viewDidLoad加载表情

    1 - (void)viewDidLoad
    2 {
    3     [super viewDidLoad];
    4     // Do any additional setup after loading the view, typically from a nib.
    5 
    6     // 调用方法,添加表情到视图
    7     [self adjustImagePosWithColumns:2];
    8 }

      4、在valueChanged事件中相应改变

     1 - (IBAction)segmentValue:(UISegmentedControl *)sender
     2 {
     3     // NSLog(@"%d",sender.selectedSegmentIndex);
     4     // 开始动画
     5     [UIView beginAnimations:nil context:nil];
     6     // 设置动画事件
     7     [UIView setAnimationDuration:0.5];
     8     int columns = sender.selectedSegmentIndex + 2; // 要显示的列数从2列开始
     9     [self adjustImagePosWithColumns:columns]; // 调用方法
    10     // 执行动画
    11     [UIView commitAnimations];
    12 }

    所有代码如下

    SLQViewController.h 文件
     1 //
     2 //  SLQViewController.h
     3 
     4 //  Created by Christian on 15/4/27.
     5 //  Copyright (c) 2015年 itcast. All rights reserved.
     6 //
     7 
     8 #import <UIKit/UIKit.h>
     9 
    10 @interface SLQViewController : UIViewController
    11 
    12 
    13 // 函数名:segmentValue:
    14 // 返回值: void
    15 // 参数: (UISegmentedControl *)sender
    16 // 描述: segmentedControll控件的值改变响应事件
    17 - (IBAction)segmentValue:(UISegmentedControl *)sender;
    18 
    19 
    20 @end
    SLQViewController.m 文件
      1 //
      2 //  SLQViewController.m
      3 //  练习01_1
      4 //
      5 //  Created by Christian on 15/4/27.
      6 //  Copyright (c) 2015年 itcast. All rights reserved.
      7 //
      8 
      9 #import "SLQViewController.h"
     10 #define WIDTH_HIGHT 60 // 表情默认宽度和高度
     11 #define COUNT 10    // 默认子控件数量
     12 
     13 @implementation SLQViewController
     14 
     15 {
     16     UIButton *_btnAdd;  // 添加表情按钮
     17 }
     18 
     19 - (void)viewDidLoad
     20 {
     21     [super viewDidLoad];
     22     // Do any additional setup after loading the view, typically from a nib.
     23 
     24     // 调用方法,添加表情到视图
     25     [self adjustImagePosWithColumns:2];
     26 }
     27 // 函数名:addImageWithName: x: y:
     28 // 返回值: void
     29 // 参数: (NSString *)name (CGFloat)x (CGFloat)y
     30 // 描述: 添加图片到视图
     31 - (void)addImageWithName:(NSString *)name x:(CGFloat)x y:(CGFloat)y
     32 {
     33     // 通过代码加载图片
     34     UIImageView *ima = [[UIImageView alloc] init]; // 初始化图片对象
     35     ima.image = [UIImage imageNamed:name]; // 获取名称
     36     ima.frame = CGRectMake(x, y, WIDTH_HIGHT, WIDTH_HIGHT); // 设置位置和尺寸
     37     [self.view addSubview:ima]; // 添加到view
     38 }
     39 
     40 - (void)didReceiveMemoryWarning
     41 {
     42     [super didReceiveMemoryWarning];
     43     // Dispose of any resources that can be recreated.
     44 }
     45 // 函数名:segmentValue:
     46 // 返回值: void
     47 // 参数: (UISegmentedControl *)sender
     48 // 描述: segmentedControll控件的值改变响应事件
     49 - (IBAction)segmentValue:(UISegmentedControl *)sender
     50 {
     51     // NSLog(@"%d",sender.selectedSegmentIndex);
     52     // 开始动画
     53     [UIView beginAnimations:nil context:nil];
     54     // 设置动画事件
     55     [UIView setAnimationDuration:0.5];
     56     int columns = sender.selectedSegmentIndex + 2; // 列数从2开始
     57     [self adjustImagePosWithColumns:columns]; // 调用方法
     58     // 执行动画
     59     [UIView commitAnimations];
     60 }
     61 // 函数名:adjustImagePosWithColumns:
     62 // 返回值: void
     63 // 参数: (int)col
     64 // 描述: 根据列数添加或者排序表情
     65 - (void)adjustImagePosWithColumns:(int)col //add:(BOOL)add
     66 {
     67 
     68     // 是否是第一次添加图片,第一次只有一个子控件
     69     int first = self.view.subviews.count;
     70    //NSLog(@"%ld",self.view.subviews.count);
     71     int columns = col; // 列数
     72     // 间距 = (view宽度 - 列数 * 表情宽度) / (列数 + 1)
     73     CGFloat margin = (self.view.frame.size.width - columns *WIDTH_HIGHT)/(columns + 1);
     74     // 第一个表情位置
     75     CGFloat oneY = 100;
     76     CGFloat oneX = margin;
     77     // for循环,遍历所有的子控件
     78     for (int i = 0 ; i < COUNT ; i ++)
     79     {
     80         int col = i % columns;
     81         int row = i / columns;
     82         // 计算xy,列数决定x
     83         CGFloat x = oneX + col * (WIDTH_HIGHT + margin);
     84         CGFloat y = oneY + row * (WIDTH_HIGHT + margin);
     85         // 判断是重新排序还是添加图片,如果子控件个数为1则进行添加,否则进行重新排序
     86         if (1 == first) // 添加图片
     87         {
     88             int no = i % 9; // 保证图片显示在指定范围内
     89             NSString *name = [NSString stringWithFormat:@"01%d.png",no];
     90             [self addImageWithName:name x:x y:y]; // 添加控件到view
     91             if( (++no) == 9)
     92             {
     93                 // 在末尾添加一个按钮,这里不知道怎么给按钮添加响应事件
     94                 _btnAdd = [[UIButton alloc] init];
     95                 [_btnAdd setBackgroundImage:[UIImage imageNamed:@"019.png"] forState:UIControlStateNormal];
     96                 _btnAdd.frame = CGRectMake(x,y, WIDTH_HIGHT, WIDTH_HIGHT);
     97                 [self.view addSubview:_btnAdd];
     98             }
     99         }
    100         else // 进行重新排序,要忽略segmented的位置
    101         {
    102             // 取出i+1位置对应的表情,设置x、y值
    103             UIView *child = self.view.subviews[i + 1]; // +1是为了跳过segmentControll控件
    104             // 获取子控件的frame
    105             CGRect rect = child.frame;
    106             // 设置起始坐标位置
    107             rect.origin = CGPointMake(x, y);
    108             // 重新赋值
    109             child.frame = rect;
    110 
    111         } // end of if
    112         
    113     } // end of for
    114 
    115 }
    116 
    117 
    118 @end

    效果如下:按钮已经添加上了,但是如何响应事件呢?

  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/songliquan/p/4463834.html
Copyright © 2020-2023  润新知