在ios开发中,如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心,外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据。
例如,假如要开发一个如下左图的效果,我们可以自定义一个如右图所示的小view。
我们要创建一个xib文件,拖入UIView,设置UIView的尺寸,拖入需要的子控件,并创建一个继承UIView的类,将xib的class设置为该类。以下是上面程序的一些相关代码;
#import <UIKit/UIKit.h>
@class WDCAppDataModel;
@interface WDCappView : UIView
@property (nonatomic,strong) WDCAppDataModel *appDataModel;
+ (instancetype)appViewWithAppDataModel:(WDCAppDataModel *)appDataModel;
@end
// appView.m
// 01-我的应用管理
//
// Created by aaron on 14/11/17.
// Copyright (c) 2014年 aaron. All rights reserved.
//
#import "WDCappView.h"
#import "WDCAppDataModel.h"
@interface WDCappView ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameView;
@end
@implementation WDCappView
+ (instancetype)appViewWithAppDataModel:(WDCAppDataModel *)appDataModel{
//读取xib文件(会创建xib中的描述的所有对象,并且按顺序放到数组中返回)
NSBundle *bundle = [NSBundle mainBundle];
NSArray *appViews = [bundle loadNibNamed:@"appView" owner:nil options:nil];
WDCappView *appView = [appViews lastObject];
appView.appDataModel = appDataModel;
return appView;
}
//重写set方法
- (void)setAppDataModel:(WDCAppDataModel *)appDataModel{
_appDataModel = appDataModel;
self.iconView.image = [UIImage imageNamed:appDataModel.icon];
self.nameView.text = appDataModel.name;
}
@end
在控制器中,我们通过方法
+ (instancetype)appViewWithAppDataModel:(WDCAppDataModel *)appDataModel,将数据模型直接传入view中,实现封装;
</pre><pre name="code" class="objc" style="font-size: 18px; -webkit-text-stroke-color: rgb(0, 0, 0);"></pre></p><pre name="code" class="objc">// 总列数
int totalColums = 3;
// app尺寸和间隙
CGFloat appW = 85;
CGFloat appH = 90;
CGFloat marginX = (self.view.frame.size.width - appW * totalColums) / (totalColums + 1);
CGFloat marginY = 15;
// 添加appview
for (int index = 0; index < self.apps.count; index++) {
<span style="white-space:pre"> </span>WDCappView *appView = [WDCappView appViewWithAppDataModel:self.apps[index]];
[self.view addSubview:appView];
// appView的行数以及列数
int row = index / totalColums;
int colum = index % totalColums;
// 设置Frame
CGFloat appX = marginX * (colum + 1) + appW * colum;
CGFloat appY = 30 + marginY * row + appH * row;
[appView setFrame:CGRectMake(appX, appY, appW, appH)];
使用xib封装一个自定义view的步骤
1> 新建一个继承UIView的自定义view,假设类名叫做(WDCAppView)
2> 新建一个WDCAppView.xib文件来描述WDCAppView内部的结构
3> 修改UIView的类型为WDCAppView真实类型
4> 将内部的子控件跟WDCAppView进行属性连线
5> WDCAppView提供一个模型属性
6> 重写模型属性的set方法,因为在set方法中可以拿到外界传递的模型数据
7> 把模型数据拆开,分别设置数据到对应的子控件中
8> 提供一个创建WDCAppView的类方法,将读取xib文件的代码屏蔽起来
需要代码的可以在评论里留下邮箱。