ios通过xib创建控件

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

1.创建AppView.xib

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

实现效果如下:

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

objectivec 复制代码
//
//  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;

@end

NS_ASSUME_NONNULL_END

4.列表配置文件icons.plist

XML 复制代码
<?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

objectivec 复制代码
//
//  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,h
           NSDictionary *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才能找到,否则返回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) 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才能找到,否则返回nil
           UIImage *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

objectivec 复制代码
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
 
    AppDownloadViewController * viewController = [[AppDownloadViewController alloc]init];
    self.window.rootViewController=viewController;
}
相关推荐
lzhdim2 天前
开启iphone的墙纸玻璃效果
macos·ios·objective-c·cocoa·iphone
星辰即远方2 天前
OC学习Foudation框架
学习·ios·objective-c
音视频牛哥4 天前
面向工业级应用的 iOS 平台 RTSP|RTMP 超低延迟播放器集成指南
macos·objective-c·cocoa·ios rtmp播放器·ios rtsp播放器·ios rtmp player·ios rtsp player
风舞雪凌月5 天前
【趣谈】移动系统和桌面系统编程语言思考
java·c语言·c++·python·学习·objective-c·swift
iceiceiceice9 天前
iOS 26 适配 | 使用 `hidesSharedBackground` 保持导航栏按钮原有样式
ios·objective-c·编程语言
2501_9160074710 天前
iOS 开发工具有哪些 按开发流程整理的工具清单
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
库奇噜啦呼10 天前
【iOS】Effective Objective-C第四章
ios·objective-c·cocoa
游戏开发爱好者811 天前
入门 iOS 开发 新手工具开发首个应用
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_9159090612 天前
MachObfuscator全面解析:Apple平台Mach-O应用程序混淆技术指南
macos·ios·小程序·uni-app·objective-c·cocoa·iphone
for_ever_love__13 天前
Objective- C学习: 手动内存管理
c语言·学习·ios·objective-c