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

ios通过xib创建控件

之前写过ios动态创建控件及添加事件,纯手工代码写控件,虽然比较灵活,但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成

1.创建AppView.xib

2.再创建xib对应的mode,AppView.h 继承至UIView

实现效果如下:

3.xib页面设计好了之后,将控件拖入AppView.h

//
//  AppView.h
//  iosstudy2024
//
//  Created by figo on 2025/2/10.
//#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface AppView : UIView
@property (weak, nonatomic) IBOutlet UIImageView *iconImg;
@property (weak, nonatomic) IBOutlet UILabel *appName;
@property (weak, nonatomic) IBOutlet UIButton *btnDownload;@endNS_ASSUME_NONNULL_END

4.列表配置文件icons.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array><dict><key>name</key><string>deepseek</string><key>icon</key><string>diamond</string></dict><dict><key>name</key><string>文心一言</string><key>icon</key><string>star</string></dict><dict><key>name</key><string>豆包</string><key>icon</key><string>grape</string></dict><dict><key>name</key><string>deepseek</string><key>icon</key><string>watermenon</string></dict><dict><key>name</key><string>deepseek</string><key>icon</key><string>diamond</string></dict><dict><key>name</key><string>deepseek</string><key>icon</key><string>diamond</string></dict><dict><key>name</key><string>deepseek</string><key>icon</key><string>diamond</string></dict><dict><key>name</key><string>deepseek</string><key>icon</key><string>diamond</string></dict><dict><key>name</key><string>deepseek</string><key>icon</key><string>diamond</string></dict>
</array>
</plist>

5.添加控制器AppDownloadViewController.m

//
//  AppDownloadViewController.m
//  iosstudy2024
//
//  Created by figo on 2025/2/10.
//#import "AppDownloadViewController.h"
#import "AppView.h"
@interface AppDownloadViewController ()
@property (nonatomic,strong) NSArray *iconArray;@end@implementation AppDownloadViewController
- (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.//[self initApp];[self initAppUseXib];}-(void) initApp{// Do any additional setup after loading the view from its nib.NSUInteger count=self.iconArray.count;NSBundle *boundle=[NSBundle mainBundle];for(int a=0;a<count;a++){//添加外边框UIView *uiView=[UIView new];//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,hNSDictionary *dictionary=self.iconArray[a];//        NSString *imgPath = [NSString stringWithFormat:@"%@/%@.jpg", [[NSBundle mainBundle] resourcePath], dictionary[@"icon"]];NSString *imgPath=[[NSBundle mainBundle]pathForResource:dictionary[@"icon"] ofType:@".jpeg"];//照片拖入Assets.xcassets文件夹会找不到资源,注意需要项目下新建group命名为Supporting Files,再项目外新建文件夹比如icons,然后将图片放入icons,再将icons文件夹拖入Supporting Files才能找到,否则返回nilUIImage *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,huiLabel.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) initAppUseXib{// Do any additional setup after loading the view from its nib.NSUInteger count=self.iconArray.count;NSBundle *boundle=[NSBundle mainBundle];for(int a=0;a<count;a++){//添加外边框//通过xib文件获取的方式AppView *uiView=[[boundle loadNibNamed:@"AppView" owner:nil options:nil]lastObject];uiView.backgroundColor=[UIColor purpleColor];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//外边框内部添加图片uiView.iconImg.backgroundColor=[UIColor greenColor];NSDictionary *dictionary=self.iconArray[a];NSString *imgPath=[[NSBundle mainBundle]pathForResource:dictionary[@"icon"] ofType:@".png"];//照片拖入Assets.xcassets文件夹会找不到资源,注意需要项目下新建group命名为Supporting Files,再项目外新建文件夹比如icons,然后将图片放入icons,再将icons文件夹拖入Supporting Files才能找到,否则返回nilUIImage *uiImage=[UIImage imageWithContentsOfFile:imgPath];//imageWithContentsOfFile不会缓存,每次都重新加载图片
//           UIImage *uiImage=[UIImage imageNamed:dictionary[@"icon"]];//imageNamed会缓存,照片拖入Assets.xcassets文件夹即可,图片非常多,会占用很多内存uiView.iconImg.image=uiImage;//外边框内部标题uiView.appName.backgroundColor=[UIColor yellowColor];uiView.appName.text=dictionary[@"name"];[uiView.btnDownload addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchUpInside];uiView.btnDownload.tag=a;[self.view addSubview:uiView];}
}-(void)onclick:(UIButton *)uiButton{NSLog(@"%d点击下载",uiButton.tag);
}
@end

6.SceneDelegate.m修改当前controller为AppDownloadViewController

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {AppDownloadViewController * viewController = [[AppDownloadViewController alloc]init];self.window.rootViewController=viewController;
}

相关文章:

ios通过xib创建控件

之前写过ios动态创建控件及添加事件&#xff0c;纯手工代码写控件&#xff0c;虽然比较灵活&#xff0c;但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成 1.创建AppView.xib 2.再创建xib对应的mode&#xff0…...

跟着李沐老师学习深度学习(八)

数值稳定性 模型初始化和激活函数 数值稳定性 神经网络的梯度 考虑如下d层的神经网络&#xff08;t代表层&#xff09; 计算损失 l 关于参数 Wt 的梯度&#xff1a; 这样的矩阵乘法带来的问题&#xff1a; &#xff08;1&#xff09;梯度爆炸 &#xff08;2&#xff09;梯度…...

元宵小花灯

吃完饭散步回来的路上&#xff0c;看到一个小朋友拿着元宵小灯&#xff0c;后面的家长也闲适的哼着歌。 想起前阵子看到说&#xff0c;大人爱看小孩玩&#xff0c;也是共享那份天真快乐吧。 我小时候每年的元宵节&#xff0c;也有自己的小灯&#xff0c;那是九几年&#xff0c…...

算法——搜索算法:原理、类型与实战应用

搜索算法&#xff1a;开启高效信息检索的钥匙 在信息爆炸的时代&#xff0c;搜索算法无疑是计算机科学领域中熠熠生辉的存在&#xff0c;它就像一把神奇的钥匙&#xff0c;为我们打开了高效信息检索的大门。无论是在日常生活中&#xff0c;还是在专业的工作场景里&#xff0c;…...

告别传统测量:三维扫描仪测量工件尺寸

在现代制造业中&#xff0c;精确测量工件尺寸是确保产品质量和生产效率的关键环节。然而&#xff0c;传统测量方法往往存在效率低下、精度不足以及操作复杂等问题&#xff0c;难以满足高精度和复杂形状工件的测量需求。 传统工件尺寸测量主要依赖于卡尺、千分尺、三坐标测量仪…...

win32汇编环境,对话框程序使用跟踪条(滑块)控件示例一

;运行效果 ;win32汇编环境,对话框程序使用跟踪条控件示例一 ;生成2条横的跟踪条,分别设置不同的数值范围,设置不同的进度副度的例子 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>…...

WordPress 角标插件:20 种渐变色彩搭配,打造专属菜单标识

源码介绍 WordPress 角标插件使用教程 本插件旨在为 WordPress 菜单添加角标&#xff0c;并且支持 20 种不同的角标样式。 使用步骤 您可以在 WordPress 后台的“插件”页面中&#xff0c;找到“WordPress 角标插件”&#xff0c;然后点击激活按钮。您需要进入主题的菜单设置…...

【鸿蒙开发】第二十九章 Stage模型-应用上下文Context、进程、线程

目录 1 Stage模型基本概念 1.1 开发流程 3 应用上下文Context的典型使用场景 3.1 获取应用文件路径 3.2 获取和修改加密分区 3.3 获取本应用中其他Module的Context 3.4 订阅进程内UIAbility生命周期变化 4 进程 4.1 概述 5 线程 5.1 线程类型 5.2 使用EventHub进行线…...

window 安装GitLab服务器笔记

目录 视频&#xff1a; 资源&#xff1a; Linux CeneOS7&#xff1a; VMware&#xff1a; Linux无法安装 yum install vim -y 1.手动创建目录 2.下载repo PS 补充视频不可复制的代码 安装GitLab *修改root用户密码相关&#xff08;我卡在第一步就直接放弃了这个操作&…...

3dgs 2025 学习笔记

CVPR 2024 3D方向总汇包含&#xff08;3DGS、三维重建、深度补全、深度估计、全景定位、表面重建和特征匹配等&#xff09;_cvpr2024-structure-awaresparse-viewx-ray3dreconstr-CSDN博客 https://github.com/apple/ml-hugs 3DGS COLMAP-Free 3D Gaussian Splatting ⭐code &…...

2024.1.2版本Android Studio gradle下载超时问题处理

一、问题背景 在项目的根build.gradle里面配置了以下地址后,依旧下载gradle包失败&#xff0c;平常如果出现第三方库或者gradle下载失败,配置以下地址,一般可以下载成功 maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/nex…...

ffmpeg学习:ubuntu下编译Android版ffmpeg-kit

文章目录 前言一. 配置环境1.1 虚拟机版本1.2 安装Android环境1.2.1 Android SDK安装1.2.2 Android NDK安装 1.3 编译前的准备工作1.3.1 libtasn1-1安装1.3.2 meson安装1.3.3 harfbuzz下载 二. 编译ffmpeg-kit三. 总结 前言 ffmpeg-kit是一款跨多个平台的&#xff0c;用于在应…...

mydb:TM实现

一、说明 TM就是事务管理&#xff1a;实现对于事务的新增&#xff08;active&#xff09;、事务的状态修改&#xff08;commit、abort&#xff09;、事务的状态判断 二、事务管理 2.1创建xid文件/打开xid文件 创建xid、写一个空的 XID 文件头并创建TM public static Transac…...

神经缩放定律:涌现能力与神经元数量、参数数量、数据集大小以及训练所使用的计算量有关

大语言模型的神经缩放定律 大语言模型(LLMs)在自然语言处理领域取得了显著进展,这很大程度上得益于神经缩放定律。该定律指出,模型的损失与模型规模、数据集大小以及训练所使用的计算量呈幂律关系 ,随着模型参数、数据量等的增加,模型会展现出涌现能力,性能会有质的飞跃…...

Microsoft Porject常用字段描述

点击下载《Microsoft Porject常用字段描述》 1. 前言 Microsoft Project 是项目管理中不可或缺的工具&#xff0c;它通过丰富的列&#xff08;字段&#xff09;帮助项目经理全面跟踪和管理项目的各个方面。这些列名通常以简称的形式出现&#xff0c;如 ACWP、BCWP、BCWS 等&a…...

web前端开发中vscode常用的快捷键

1.快速复制一行 快捷键&#xff1a; shiftalt 下箭头(上箭头) 或者 ctrlc 然后 ctrlv 2.选定多个相同的单词 快捷键&#xff1a; ctrl d 先双击选定一个单词&#xff0c;然后按下 ctrl d 可以往下依次选择相同的单词。 这样同时修改相同的单词 3.全局替换某单词 当我们一个…...

鲲鹏(ARM64)升级GCC

1、下载压缩包 wget http://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xz2、解压 tar -xvf gcc-9.5.0.tar.xzcd gcc-9.5.03、下载关联软件 ./contrib/download_prerequisites4、新建文件夹 mkdir build && cd build5、配置 ../configure -enable-checkingrelea…...

国产操作系统安装DeepSeek

从年前到现在&#xff0c;DeepSeek这款语言AI模型&#xff0c;一经发布直接在全球爆火&#xff0c;在热搜上更是牢牢占据一席之地。无论是技术大神&#xff0c;还是紧跟潮流的技术小白&#xff0c;都被它强大的自然语言处理能力所吸引。作为国产操作系统的用户&#xff0c;千万…...

安科瑞 Acrel-2000ES:解锁储能管理新高度,引领能源未来!

安科瑞 崔丽洁 在能源转型的关键时期&#xff0c;高效的储能管理成为众多企业和项目的核心需求。今天&#xff0c;就给大家介绍一款储能管理的 “神器”—— 安科瑞 Acrel-2000ES 储能能量管理系统。 安科瑞电气可是行业内的 “明星企业”&#xff0c;2003 年成立&#xff0c;2…...

DeepSeek总是提示“服务器繁忙,请稍后再试。”的问题的解决办法(替代网站推荐)

文章目录 问题现象原因分析替代网站的可行性分析替代网站秘塔搜索超算互联网360 纳米AI助手百度云千帆字节跳动火山引擎阿里云PAI硅基流动其他文思助手Fireworks英伟达POE 问题现象 频繁遇到错误提示&#xff1a; 在使用DeepSeek时&#xff08;开启“深度思考&#xff08;R1&a…...

Boost ASIO 库深入学习(3)

Boost ASIO 库深入学习&#xff08;3&#xff09; UDP简单通信导论 在继续深入前&#xff0c;我们不妨也来点碎碎念&#xff0c;因为UDP通信协议的模型与TCP是不同的&#xff0c;这种差异正是理解“无连接通信”的关键所在。我们下面要构建的&#xff0c;是一个经典的UDP通信…...

直角坐标系和斜角坐标系

前情概要 笛卡尔坐标系是直角坐标系和斜角坐标系的统称。为什么会有这两种坐标系呢&#xff0c;教材中为什么最后只用直角坐标系呢&#xff1f;我们这样解释&#xff1a; 研究一维空间中的向量时&#xff0c;由于一维空间中的向量有无数条&#xff0c;如果我们选定一条作为基…...

山东大学《数据可视化》期末复习宝典

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f3c0;山东大学期末速通专用_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1…...

nano编辑器的详细使用教程

以下是 Linux 下 nano 编辑器 的详细使用指南&#xff0c;涵盖安装、基础操作、高级功能、快捷键以及常见问题处理。 一、安装 nano 大多数 Linux 发行版已预装 nano。如果没有安装&#xff0c;可以通过以下命令安装&#xff1a; Debian/Ubuntu 系&#xff1a;sudo apt update…...

CMake基础:gcc/g++编译选项详解

目录 1.编译步骤 2.gcc 与 g 区别 3.gcc 命令的常用选项 3.1.基础编译选项 3.2.优化选项 3.3.调试与分析选项 3.4.链接选项 3.5.语言特性选项&#xff08;C 特化&#xff09; 3.6.安全增强选项 3.7.架构与指令集优化 3.8.其他常用选项 4.常见编译组合示例 5.常用环…...

大话软工笔记—需求调研的准备

需求调研前需做好充分的准备&#xff1a; 1. 背景资料来源 可以通过企业官网、宣传资料、人员沟通获取客户企业信息。 ​​​​​​​2. 背景资料汇总 根据获得的信息做出一份背景分析报告&#xff0c;主要包含以下内容&#xff1a; 2.1 企业基本信息 企业发展愿景&#…...

将 tensorflow keras 训练数据集转换为 Yolo 训练数据集

以 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 1. 图像分类数据集文件结构 (例如用于 yolov11n-cls.pt 训练) import os import csv import random from PIL import Image from sklearn.model_selection import train_test_split import s…...

意识上传伦理前夜:我们是否在创造数字奴隶?

当韩国财阀将“数字永生”标价1亿美元准入权时&#xff0c;联合国预警的“神经种姓制度”正从科幻步入现实。某脑机接口公司用户协议中“上传意识衍生算法归公司所有”的隐藏条款&#xff0c;恰似德里达预言的当代印证&#xff1a;“当意识沦为可交易数据流&#xff0c;主体性便…...

打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库

&#x1f4f8; 什么是 PhotoEditor&#xff1f; PhotoEditor 是一个专为 Android 平台设计的开源图像编辑库&#xff0c;旨在为开发者提供简单易用的图像编辑功能。它支持绘图、添加文本、应用滤镜、插入表情符号和贴纸等功能&#xff0c;类似于 Instagram 的编辑体验。该库采…...

【大模型】【推荐系统】LLM在推荐系统中的应用价值

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点B.4 两大推荐方法 C 模型结构C.1 知识蒸馏&#xff08;训练过程&#xff09;C.2 轻量推理&#xff08;部署过程&#xff09; D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;SLMRec&#xff1a;Distilling…...