自定义View的两种方式

(一)xib自定义view

1.思路

1)首先创建AppView类是,勾选上xib,就会创建出AppView.h,AppView.m,AppView.xib三个文件

2)先在AppView.xib文件上拖拽相应的控件,并进行适配

3)同样在AppView.h文件中,提供一个类方法创建AppView对象,并添加一个数据模型属性,用于向AppView传递模型

4)在AppView.m文件中,实现类方法,并在数据模型的set方法中实现对成员view内容的设置更新,将需要用到的空间属性通过拖线到.m文件中

2.关键代码

 1 #import <UIKit/UIKit.h>
 2
 3 @class MJApp;
 4
 5 @interface MJAppView : UIView
 6
 7 /**
 8  *  模型数据
 9  */
10 @property (nonatomic, strong) MJApp *app;
11
12 + (instancetype)appView;
13
14 /**
15  *  通过模型数据来创建一个view
16  */
17 + (instancetype)appViewWithApp:(MJApp *)app;
18
19 @end

AppView.h

 1 #import "MJAppView.h"
 2 #import "MJApp.h"
 3
 4 @interface MJAppView()
 5 @property (weak, nonatomic) IBOutlet UIImageView *iconView;
 6 @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
 7 @end
 8
 9 @implementation MJAppView
10 //先从xib中读取出相应布局,在调用模型的set方法,设置
11 + (instancetype)appViewWithApp:(MJApp *)app
12 {
13     NSBundle *bundle = [NSBundle mainBundle];
14     // 读取xib文件(会创建xib中的描述的所有对象,并且按顺序放到数组中返回)
15     NSArray *objs = [bundle loadNibNamed:@"MJAppView" owner:nil options:nil];
16     MJAppView *appView = [objs lastObject];
17     appView.app = app;
18     return appView;
19 }
20
21 + (instancetype)appView
22 {
23     return [self appViewWithApp:nil];
24 }
25
26 - (void)setApp:(MJApp *)app
27 {
28     _app = app;
29
30     // 1.设置图标
31     self.iconView.image = [UIImage imageNamed:app.icon];
32
33     // 2.设置名称
34     self.nameLabel.text = app.name;
35 }
36
37 @end

appView.m

在UIViewController中,直接利用appView的类方法即可创建

MJAppView *appView = [MJAppView appViewWithApp:self.apps[index]];

(二)纯代码实现自定义view

1.思路

1)同样可以在view.m方法中重写initWithFrame:(CGrect)frame这个方法,在这个方法中主要是对一些新的内容控件的添加

2)在数据模型属性的set方法中对内容控件进行设置,以及空间的frame设置

3)在- (void)willMoveToSuperView:(UIView *)newSuperview,这个方法中实现自身frame的设置

2.关键代码

时间: 2024-10-22 09:11:22

自定义View的两种方式的相关文章

iOS 自定义layer的两种方式

在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个图层 @property(nonatomic,readonly,retain) CALayer *layer; 每一个UIView内部都默认关联一个CALayer,我们可称这个Laye

实现自定义View的三种方式

一.组合控件 组合控件,顾名思义,就是将系统原有的控件进行组合,构成一个新的控件.这种方式下,不需要开发者自己去绘制图上显示的内容,也不需要开发者重写onMeasure,onLayout,onDraw方法来实现测量.布局以及draw流程.所以,在实现自定义view的三种方式中,这一种相对比较简单. 实际开发中,标题栏就是一个比较常见的例子.因为在一个app的各个界面中,标题栏基本上是大同小异,复用率很高.所以经常会将标题栏单独做成一个自定义view,在不同的界面直接引入即可,而不用每次都把标题栏

EntityFramework Core 2.0自定义标量函数两种方式

前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将方法映射到数据库中的标量函数,我们可在LINQ中调用此方法并会被正确翻译成SQL语句,这为编写数据访问层的开发人员提供了一个很棒的功能来创建一个方法并在其上应用DbFunction特性即可.该属性会将静态CLR方法映射到数据库函数,以便可以在LINQ查询中使用此方法.默认情况下,数据库函数中的CLR

自定义UITabBar的两种方式

开发中,经常会遇到各种各样的奇葩设计要求,因为apple提供的UITabBar样式单一,只是简单的"图片+文字"样式,高度49又不可以改变.自定义UITabBar成为了唯一的出路.下面我就列举开发中我经常用到的两种自定义UITabBar的方式,并且通过比较他们的不同之处,能够知道何时用何种方式自定义UITabBar. 方式一: 这是真正意义上的自定义UITabBar,因为这种方式需要继承自UITabBar,但是缺点也很明显,高度永远是49,实际开发的项目中的tabBar如果和原生的UI

【iOS开发-图层】自定义图层的两种方式

想要自定义图层,只需要构建一个类继承CALayer方法 如果让自定义图层初始化上面就有画好的图形,有两种办法 重写drawInContext方法 自定义的图层下面的方法,然后必须自定义的图层对象显示调用 [layer setNeedsDisplay]然后才会调用这个方法; 自定图层文件 - (void)drawInContext:(CGContextRef)ctx { CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);//设置红色 CGContextAddEll

android 自定义radiogroup的两种方式

这里先备注下 listview+radiobutton实现  浅显易懂 http://www.haolizi.net/example/view_3312.html 在radiogoup原生态源码的基础上 实现自定义类MyRadioGroup http://www.haolizi.net/example/view_3313.html

创建TabHost的两种方式的简单分析

最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下. 首先我的界面如下: 目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTabHost方法来得到一个TabHost的实例,然后就可以给这个TabHost添加Tab了.示例代码如下: [java] view plaincopy public class PlotHost extends TabActivity  { @Override protected void onCre

【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html 本篇Himi来利用ListView和TextInput这两种组件实现对话.聊天框. 首先需要准备的有几点:(组件的学习就不赘述了,简单且官方有文档) 1. 学习下 ListView: 官方示例:http://reactnative.cn/docs/0.27/tutorial.html#content

【转】android创建Popwindow弹出菜单的两种方式

方法一的Activity [java] view plaincopy package com.app.test02; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import