当前位置: 首页 > article >正文

ios动态创建控件及添加事件

效果如下,就是在一个空白页面动态添加控件,给按钮添加事件,图片名字和标题放入plist文件,plist是个Array,每一项是Dictionary。Dictionary里面方icon和name两个String的key。图片都放入Assets.xcassets。如果需要使用imageWithContentsOfFile方法(无缓存)加载图片,那么就需要新建Supporting Files个Group,将文件夹托进去,使用imageNamed方法(有缓存),那么只需将图片拖入Assets.xcassets文件夹即可。

给出代码:

//
//  AddViewController.m
//  study2024
//
//  Created by zhifei  zhu on 2024/8/31.
//

#import "AddViewController.h"

@interface AddViewController ()
@property (nonatomic,strong) NSArray *iconArray;
@end

@implementation AddViewController
- (NSArray *)iconArray{
    if(_iconArray==nil){
        NSString *path=[[NSBundle mainBundle]pathForResource:@"icons.plist" ofType:nil];
        _iconArray=[NSArray arrayWithContentsOfFile:path];
    }
    return _iconArray;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSUInteger count=self.iconArray.count;
    for(int a=0;a<count;a++){
        //添加外边框
        UIView *uiView=[UIView new];
        uiView.backgroundColor=[UIColor blueColor];
        CGFloat x=50+(a%3)*(75+10);
        CGFloat y=50+(a/3)*(100+10);
        uiView.frame=CGRectMake(x, y, 75, 100);//x,y,w,h
        
        //外边框内部添加图片
        UIImageView *uiImageView=[UIImageView new];
        uiImageView.backgroundColor=[UIColor greenColor];
        CGFloat iconW=45;
        CGFloat iconH=45;
        CGFloat x1=(uiView.frame.size.width-iconW)*0.5;//相对坐标
        CGFloat y1=0;//相对坐标
        uiImageView.frame=CGRectMake(x1, y1, iconW, iconH);//x,y,w,h
        NSDictionary *dictionary=self.iconArray[a];
//        NSString *imgPath = [NSString stringWithFormat:@"%@/%@.jpg", [[NSBundle mainBundle] resourcePath], dictionary[@"icon"]];
        NSString *imgPath=[[NSBundle mainBundle]pathForResource:dictionary[@"icon"] ofType:@"jpg"];
        //照片拖入Assets.xcassets文件夹会找不到资源,注意需要项目下新建group命名为Supporting Files,再项目外新建文件夹比如icons,然后将图片放入icons,再将icons文件夹拖入Supporting Files才能找到,否则返回nil
        UIImage *uiImage=[UIImage imageWithContentsOfFile:imgPath];//imageWithContentsOfFile不会缓存,每次都重新加载图片
//        UIImage *uiImage=[UIImage imageNamed:dictionary[@"icon"]];//imageNamed会缓存,照片拖入Assets.xcassets文件夹即可,图片非常多,会占用很多内存

        uiImageView.image=uiImage;
        [uiView addSubview:uiImageView];
        
        //外边框内部标题
        UILabel *uiLabel=[UILabel new];
        uiLabel.backgroundColor=[UIColor yellowColor];
        CGFloat labelW=uiView.frame.size.width;
        CGFloat labelH=20;
        CGFloat x2=0;//相对坐标
        CGFloat y2=uiImageView.frame.size.height+5;//相对坐标
        uiLabel.frame=CGRectMake(x2, y2, labelW, labelH);//x,y,w,h
        uiLabel.text=dictionary[@"name"];
        [uiLabel setTextAlignment:NSTextAlignmentCenter];
        [uiView addSubview:uiLabel];
        
        
        //外边框内部添加按钮
        UIButton *uiButton=[UIButton new];
        uiButton.backgroundColor=[UIColor redColor];
        CGFloat buttonW=55;
        CGFloat buttonH=20;
        CGFloat x3=(75-55)*0.5;//相对坐标
        CGFloat y3=uiImageView.frame.size.height+uiLabel.frame.size.height+5+5;//相对坐标
        uiButton.frame=CGRectMake(x3, y3, buttonW, buttonH);//x,y,w,h
        [uiButton setTitle:@"下载" forState:UIControlStateNormal];
        [uiButton addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchUpInside];
        uiButton.tag=a;
        [uiView addSubview:uiButton];
        
        [self.view addSubview:uiView];

    }
   
}
-(void)onclick:(UIButton *)uiButton{
    NSLog(@"%d点击下载",uiButton.tag);
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end


http://www.kler.cn/a/291249.html

相关文章:

  • 2、蓝牙打印机点灯-GPIO输出控制
  • 腾讯云AI代码助手编程挑战赛-图片转换工具
  • C语言基本知识复习浓缩版:标识符、函数、进制、数据类型
  • (二十八)Flask之wtforms库【上手使用篇】
  • 论文导读 | 数据库中的连接操作
  • spring boot 多数据源集成mysql、postgresql、phoenix、doris等
  • 基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic
  • MATLAB 仿真跳频扩频通信系统
  • Salt Function Flow:深度解析复杂网关编排的优势与实践
  • Java开发中的vo,dto,po
  • 基于 AT 固件测试 ESP32 设备作为 WiFi AP 模式创建 TCP Server 开启 UART-to-WiFi 透传模式的指令序列
  • 航电系统,无人机的核心!!!
  • 彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)
  • 电脑开机出现no operation system found错误原因分析及解决方法
  • SpringBoot 基于iText 根据PDF模板动态生成文件
  • C#笔记6 网络编程基础,解释端口套接字,代码实例分析DNS,IPAddress等类
  • MySQL-进阶篇-锁(全局锁、表级锁、行级锁)
  • Fabric.js全面介绍:强大的交互式图形编辑框架
  • 优化采样参数提升大语言模型响应质量:深入分析温度、top_p、top_k和min_p的随机解码策略
  • 【C++ Qt day6】
  • Codeforces Round 971 (Div. 4) ABCD题详细题解(C++,Python)
  • Mac 安装Hadoop教程(HomeBrew安装)
  • 关于HTTP通讯流程知识点补充—常见状态码及常见请求方式
  • Hive服务部署及Datagrip工具使用
  • ElasticSearch-ELK
  • Linux中的时间