年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3801|回复: 0

[实用控件] ios实战开发之UISegmentedControl

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-3-27 21:38:50 | 显示全部楼层 |阅读模式
    1、效果演示:



    2、需求分析:

    1、创建一个Segmented control,并设置4列,创建若干个表情到view;
    2、点击segment上的按钮,对表情进行调整成不同的列展示;
    3、功能简单

    3、设计过程:

    首先利用storyboard添加一个Segmented Control

    QQ20140327-1@2x.png

    关键代码:
    SAViewController.h
    1. //
    2. //  SAViewController.h
    3. //  Segment
    4. //
    5. //  Created by yusian on 14-3-27.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <UIKit/UIKit.h>
    9. @interface SAViewController : UIViewController
    10. - (IBAction)segmentControl:(UISegmentedControl *)sender;
    11. @end
    复制代码
    SAViewController.m
    1. //
    2. //  SAViewController.m
    3. //  Segment
    4. //
    5. //  Created by yusian on 14-3-27.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "SAViewController.h"
    9. // 宏定义,尽量避免直接将数字写在代码中
    10. #define kImageCount 20
    11. #define kDefaultSize 75
    12. #define kImageTypes 3
    13. @interface SAViewController ()
    14. @end
    15. @implementation SAViewController
    16. // 系统界面加载完之后调用的函数
    17. - (void)viewDidLoad
    18. {
    19.     [super viewDidLoad];
    20.    
    21.     // 调用adjustImageWithColumns:(int)columns函数初始列数为3列
    22.     [self adjustImageWithColumns:3];
    23.    
    24. }
    25. // 该函数主要功能为在界面上生成/自动排列UIImageView表情元素 (重构优化过后的代码)
    26. - (void)adjustImageWithColumns:(int)columns
    27. {
    28.     // 获得UIView上subview的个数,后面需要用到
    29.     int count = self.view.subviews.count;
    30.    
    31.     // 定义png图标大小,为实现3列、5列、7列、9列时图片大小分别不一样加个算法,列数越少图标越大
    32.     CGFloat imgWidth =  kDefaultSize - (columns * 5);
    33.    
    34.     // 将高度和宽度设置与一样大小,表情会有小小的拉伸
    35.     CGFloat imgHeight = imgWidth;
    36.    
    37.     // 定义一个变量用来存储表情之间间隔值大小
    38.     CGFloat imgSpacing = (self.view.frame.size.width - imgWidth * columns) / (columns + 1);
    39.    
    40.     // 一切准备就绪可以开始for循环了,循环次数为创建表情的个数,也为排列表情的个数,将这个值定义为宏,方便全局统一与修改
    41.     for (int i = 0; i < kImageCount; i++) {
    42.         
    43.         // 定义表情坐标位置,这是这个项目的核心点,当前循环次数、当前表情x值、当前表情y值,最关键的是当前表情在当前行的序号正好为(i % columns)、而当前行数正好为(i / columns);
    44.         
    45.         // 同一排两个表情x值相差(表情宽度 + 表情间隔),第一表情的x值也应该等于两表情的间隔宽度
    46.         CGFloat imgX = imgSpacing + (i % columns) * (imgWidth + imgSpacing);
    47.         
    48.         // y值也一样,不同的是y值的基准从70开始,70=segment的y值加segment的高度再加20做为间隔
    49.         CGFloat imgY = 70 + (i / columns) * (imgHeight + imgSpacing);
    50.         
    51.         // 无论是创建表情还是表情重新排列,算法基本一致,第一次加载界面调用该函数是为创建表情,后续再调用该函数是为重新排列,所以后续要先进行判断再执行相关代码
    52.         
    53.         // 函数开始定义了一个count变量,取UIView上subview的个数,如果该值为1则说明面手机面板上只有segment一个subview,如果(count > 1)说明主面板上不止一个subview,说明表情已经创建好了,此时应该只排列,不创建;
    54.         if (count > 1) {
    55.             
    56.             // 调整UIImageView
    57.             // 取出subview数组中的值赋值给一个UIView变量
    58.             UIView *temp = self.view.subviews[i + 1];
    59.             
    60.             // 将上述循环计算得到的各个值(主要是x坐标与y坐标),重新分配给表情(UIImageView.frame)
    61.             temp.frame = CGRectMake(imgX, imgY, imgWidth, imgHeight);
    62.         
    63.         // count = 1则执行以下代码创建表情
    64.         } else {
    65.             
    66.             // 创建UIImageView
    67.             // 创建一个UIImageView并初始化
    68.             UIImageView *img = [[UIImageView alloc] init];
    69.             
    70.             // UIImageView上显示的图片利用循环i值,分别从 1.png ~ n.png,当循环次数超过表情个数时,可以通过对表情个数进行取余操作再从1开始
    71.             img.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png", (i % kImageTypes) + 1]];
    72.             
    73.             // 将上述循环计算得到的各个值(主要是x坐标与y坐标),赋值给刚刚创建好的UIImageView
    74.             img.frame = CGRectMake(imgX, imgY, imgWidth, imgHeight);
    75.             
    76.             // 将该UIImageView添加到view
    77.             [self.view addSubview:img];
    78.             
    79.         }// END IF
    80.         
    81.     }// END FOR
    82.    
    83. }// END FUN
    84. // 接收segment按键的事件,
    85. - (IBAction)segmentControl:(UISegmentedControl *)sender {
    86.    
    87.     // 动画效果开始
    88.     [UIView beginAnimations:nil context:nil];
    89.    
    90.     // 动画时长
    91.     [UIView setAnimationDuration:1];
    92.    
    93.     // 将列数与segment传进来的值对应起来,segment上面的按键传进来的值分别为0、1、2、3、4...
    94.     int columns = (sender.selectedSegmentIndex * 2) + 3;
    95.    
    96.     // 调用上面函数并将这个columns值传进去
    97.     [self adjustImageWithColumns:columns];
    98.    
    99.     // 动画提交
    100.     [UIView commitAnimations];
    101. }
    102. @end
    复制代码
    源代码下载:
    游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0


    参考链接:ios实战开发之图片展示
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-4-27 15:05 , Processed in 0.058469 second(s), 26 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表