一、设置子控件数据

1.这里怎么来设置子控件数据呢,

我们在这个循环开始时候,创建控件:

import “ViewController.h

@interface ViewController ()

//1.加载app.plist属性

@property(nonatomic,copy)NSArray *apps;

@end

@implementation ViewController

//2.重写appsgetter方法,懒加载数组

– (NSArray *)apps{

if(_apps == nil){

NSString *path = [[NSBundle mainBundle] pathForResource:@“app.plist” ofType:nil];

_apps = [NSArray arrayWithContentsOfFile:path];

}

return _apps;

}

– (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

//1.假设marginX,marginY,marginTopcolumns

//1.1 假设一行有3列,

int columns = 3;

//1.2 假设一个应用宽度是75 , 高度是90

CGFloat appW = 75;

CGFloat appH = 90;

//1.3 计算出marginX,

CGFloat marginX = (self.view.frame.size.widthcolumns * appW)/(columns + 1) ;

//1.4 假设marginY 与marginX相等

CGFloat marginY = marginX;

//1.5 假设marginTop 是30

CGFloat marginTop = 30 ;

for(int i = 0 ; i < self.apps.count ; i++){

//1.创建每个应用(UIView)

UIView *appView = [[UIView alloc] init];

//2.设置appView的属性

//2.1 设置appView的背景

appView.backgroundColor = [UIColor blueColor];

//2.2 设置appView的frame属性

//计算每个单元格所在的列的索引

int colIdx = i % columns;

//计算每个单元格的行索引

int rowIdx = i / columns;

CGFloat appX = marginX + colIdx * (appW + marginX);

CGFloat appY = marginTop + rowIdx * (appH + marginY);

appView.frame = CGRectMake(appX,appY,appW,appH);

//3.将appView加到self.view控制器所管理的那个View)

[self.view addSubview:appView];

//4.向UIView中增加子控件,

//4.1 增加一个图片

UIImageView *imgViewIcon = [[UIImageView alloc] init];

//设置背景

imgViewIcon.backgroundColor = [UIColor yellowColor];

//设置frame

CGFloat iconW = 45;

CGFloat iconH = 45;

CGFloat iconX = (appView.frame.size.width – iconW)* 0.5;

CGFloat iconY = 0;

imgViewIcon.frame = CGRectMake(iconX,iconY,iconW,iconH);

//把图片添加到appView中

[appView addSubview:imgViewIcon];

//4.2 增加一个Label

UILabel *lblName = [[UILabel alloc] init];

//设置背景

lblName.backgroundColor = [UIColor redColor];

//设置frame

CGFloat nameW = appView.frame.size.width

CGFloat nameH = 20;

CGFloat nameX = 0;

CGFloat nameY = CGRectGetMaxY(imgViewIcon);

lblName.frame = CGRectMake(nameX,nameY,nameW,nameH);

//把标签添加到appView中

[appView addSubview:lblName];

//4.3 增加一个按钮

UIButton *btnDownload = [[UIButton alloc] init];

//设置背景

btnDownload.backgroundColor = [UIColor greenColor];

//设置frame

CGFloat btnW = iconW;

CGFloat btnH = 20;

CGFloat btnX = iconX;

CGFloat btnY = CGRectGetMaxY(lblName);

btnDownload.frame = CGRectMake(btnX,btnY,btnW,btnH);

//把按钮添加到appView中

[appView addSubview:btnDownload];

}

我们这里怎么来设置子控件数据呢,

注意,我们在这个循环当中,循环开始的时候,创建控件,设置它的一些坐标什么东西,设置子控件,

那么在这个循环里面:

for(int i = 0 ; i < self.apps.count ; i++ ){

这个self.apps,这个是不是我们那个数组啊,这个是不是数据数组啊,

个数组里面,保存的是一个一个的什么,

对,里面保存的是一个一个的字典

那么,所以说,在这里面,我要这么做:

for(int i = 0 ; i < self.apps.count ; i++ ) {

self.apps[i]

//这是索引i,那么这样拿到的就是当前正在循环的这条记录数据啊,

//获取当前这个应用的数据字典,

NSDictionary *appDict = self.apps[i];

//也就是说,这个字典里面就包含了当前应用的所有的数据,是不是都在里面,

//拿到这个以后,接下来,我们紧接着,是不是把这些数据设置给页面上的控件,是不是就ok了,

//第一个,你创建了一个图片框,是不是要为图片框设置数据啊,

//把图片添加到appView中

[appView addSubview:imgViewIcon];

//设置图片框的数据

//图片框里面,我们要的,就是一张图片,是不是就OK了,

//怎么给它设置图片

imgViewIcon.image = [UIImage imageNamed:appDict[…]];

//这个地方,能写死吗,这儿是不是得从字典里获取啊,是不是得从字典里获取当前这个图片的图片名称吧,

//但是这个字典里面的键等于什么呢,怎么写这个键呢,这个键是啥呢,

//到Supporting Files文件夹里面的app.plist文件里看一看,每一个字典里的哪一个键表示图片名称呢,icon吧,

//是不是icon表示的是图片名称

//name表示的是应用名称吧,

//那么我们是不是要取这个icon,因为随便打开一个字典,这个键是不是都叫icon,所以我们就取这个icon这个键,

imgViewIcon.image = [UIImage imageNamed:appDict[@“icon”]];

//这样的话,我们就给这个图片框设置数据了吧,

//设置完运行一下,看看它真的能用吗,

//看到啥了,看到图片了吧,但是它后面是不是有个背景颜色啊,蓝色的背景颜色,背景颜色,等会儿咱们统一给它去掉就可以了,

2.接下来,图片有了,我们再设置这个Label,这个标题啊,

//添加到appView中

[appView addSubview:lblName];

//设置Label的数据(标题),

//如何设置Label上的文字呢,.text

lblName.text = appDict[@“name”];

运行一下,看到了没,文字有了,

文字是不是有点儿显示不下了,

那么,我们要让文字变小一下吧,怎么让文字变小一些,怎么设置Label里面文字的字体大小呢,

对,font,

//设置Label的文字的字体大小

lblName.font = 就是它的文字大小,

那么大家可能会问,这个Label里面这么多的属性,你告诉我,我知道,你不告诉我,我不知道,那么我遇到一个新东西,你不告诉我,我怎么样去学呢,有同学说“点一下”,不就能查了吗,lblName.这里“点一下”,不就能查了吗,但是我觉得它这个工具做的不是很好,“点一下”之后,只能按顺序来查,所以你不如直接怎么办,找到这个Label,这个Label是什么类型的啊,是不是这个类型的啊,UILabel,按住Command键,点一下鼠标左键,点进去,点进去以后,你看这是不是这个Label类型,最上面是不是这个Label类型头文件吧:

//UILabel.h

//UIKit

然后你看一下它里面的属性

UILabel

它们是不是有这么多的属性,

第一个属性,就是设置text文字吧,第二个属性,font,就是设置字体吧,

那有同学说,我就是看不懂这个英文,那怎么办,那很好办,记住,以后只要看到font,就表示字体的意思,

默认是不是都是空值nil,并且font默认是不是都是17号字体啊,

想设置Label中的文字颜色,怎么设置,

textColor吧,

shadowColor,是不是阴影的颜色,

shandowOffset阴影的偏移,

textAlignment,这就是设置文字的对齐方式,设置它的文字的对齐方式,我们可以通过这种方式来设置文字是否是水平居中,通过它来设置文字的左对齐、右对齐、还是居中对齐,这是设置它的对齐方式,哪有人问了,你怎么知道它是对齐方式,还是看到这个单词,Alignment,记住,以后只要遇到Alignment,一般就是设置它的对齐方式的,

lineBreakMode,这是换行模式

enabled,这是是否启用,

userInteractionEnabled,是否可以用户交互,

highlighted,这是高亮状态是否是高亮状态

highlightedTextColor,这是高亮状态下的文字颜色,

是不是你打开这个头文件,看就ok了,

有人说,我打开文件和没打开一样,这些所有看到的这些,对于我来说,就等于两个字,乱码

那么也没关系,那么这个时候,我告诉大家,这个时候,你需要的只是两个字儿,经验,

需要时间,你第一次看这个头文件,就是天书,

第二次看这个,也是天书,

当你做一段开发的时候,再看这个头文件,就不是天书了,

所以说,别担心,你只需要慢慢的去熟练,就ok了,

但是该看的时候,还得打开看一下,

虽然看不懂,也看一看,互相问一问,

所以一开始看不懂,也没关系,你需要的就是时间,所以就做两个字儿就可以了,坚持,

其他的什么都不需要做,

好了,然后,设置它的文字的字体,就是lblName.font,

既然它是一个UIFont类型,UIFont * font,

那么我们就要给它一个UIFont类型对象

你看,UIFont * font,这儿是不是有一个星号,

证明它不是枚举结构体吧,

一般枚举结构体这儿是不会写星号的,

所以说,我们要给它一个UIFont对象

既然是一个UIFont对象

lblName.font = [UIFont

我们再点开这个UIFont,看到了吗,

@interface UIFont : NSObject < NSCopying>

里面有一堆的什么,有一堆的加号吧,

有一堆的加号,表示什么,是不是有一堆的类方法,

类方法的返回类型,是不是这几个是返回一个Font类型啊,

+ (UIFont *)preferredFontForTextStyle:(UIFontTextStyle)style API_AVAILABLE(ios(7.0));

+ (UIFont *)preferredFontForTextStyle:(UIFontTextStyle)style compatibleWithTraitCollection:(nullable

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize;

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize;

+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize;

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight API_AVAILABLE(ios(8.2));

+ (UIFont *)monospacedDigitSystemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight API_AVAILABLE(ios(9.0));

+ (UIFont *)monospacedSystemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight API_AVAILABLE(ios(13.0));

看一下,+(UIFont *)systemFontOfSize:(CGFloat)fontSize;

是不是给它一个指定大小的font吧,

我们可以systemFontOfSize,用系统的字体,然后呢,你给它一个大小,

我们这里不改变字体的样式,只改变字体的大小,

可以使用systemFontOfSize,

可以了,好,就用这个方法,就调用这个类方法,

lblName.font = [UIFont systemFontOfSize:(CGFloat)];

希望多大的字体,12怎么样,

//设置label的文字的字体大小

lblName.font = [UIFont systemFontOfSize:12];

12还好吧,不算很大吧,

但是文字是居中对齐吗,不是,怎么把它居中对齐,

对,刚才是不是有个Alignment啊,

//设置文字居中对齐,

lblName.textAlignment =

//其实这个xcode提示不好,我不记得这个对齐叫什么,但是我知道它有一个Alignment,我想点一下Alignment,但是它有提示吗,没有

//是不是没有这个textAlignment提示啊,

//我相信它以后一定会变好的,或者现在有一些插件也能实现这个功能

//凡是要设置文本的一些属性,你就想是不是以text开头,这么记,一敲text,可能所有和文本有关的属性都列出来了,

你要设置它这个textAlignment,看一下这个textAlignment属性是一个什么类型,

NSTextAlignment textAlignment,

NSTextAlignment类型吧,

这个东西,注意看,它这里有星号吗,没有星号,那么很有可能是个枚举或者结构体之类的吧,

那我们直接这个时候就来一个NSTextAlignment,

lblName.textAlignment = NSTextAlignment

看到了吗,是什么,枚举,enum

我们希望它居中对齐,左对齐,右对齐,

居中对齐,那么就选第几个,是不是Center这个东西啊,

lblName.textAlignment = NSTextAlignmentCenter;

看到了吗,是不是文字居中对齐了,

5.那么,接下来,我们就该设置按钮的数据了,

注意,按钮的数据呢,不仅仅是个简单的数据,

这个按钮数据,我们看一下示例程序效果

首先里面是不是有个文字:“下载”,

然后有个默认情况下那个背景图,是个浅绿色,

当你按下,高亮状态下的时候,是不是深绿色的背景图,

当你点击完毕以后,禁用掉,是不是灰色的这个效果啊,

当然变成灰色,是系统这个效果,

所以说,接下来,我们要设置这个按钮的文字,设置这个按钮默认状态下的背景图,高亮状态下的背景图,是不是要设置这3个数据,

来,咱们现在写一下,

//设置按钮的数据,

//1.设置按钮上的文字,

//2.设置按钮的背景图,

好,设置按钮的文字,还记得我们设置Label是怎么设置的吗,

是不是lblName.text,是设置Label的文字吧,

这是设置Label的文字,是“点text”

那么请问大家,设置按钮的时候,怎么设置,

btnDownload.text,有吗,没有,

我们设置按钮上的文字,是不是“点text”点不出来啊,不能通过“点text”设置按钮的文字,这儿给大家解释一下,因为Label上显示的文字,Label它不分各种各样的状况,比如说默认状态下、高亮状态下、还是禁用状态下,selected状态下,是不是没有这么多状态,

但是按钮是有状态的,你可以设置按钮在默认状态下、高亮状态下、禁用状态下、被选择状态下的文字,是不是都不一样啊,

所以说,当你要设置的这个控件,是根据不同状态下会显示不同的数据的时候,一般情况下,就不是通过一个“点什么什么属性”直接设置的,一般这种情况下,都是通过一个方法来设置的,

为什么要通过一个方法呢,因为它至少要传两个参数,第一、是你要设置一个什么样的数据给它,第二、是在什么状态下显示这个数据,

所以说,按钮它这个文字,是分不同状态的,所以它就不是通过一个属性直接设置的,而是通过一个方法来设置它的属性,

方法至少传两个参数,第一、你要设置什么数据给它,第二、这个数据在什么状态下显示,

所以说,以后记住,设置按钮的背景图啦、文字啦,并不是通过属性来设置的,一定会有一个方法来设置,传两个参数,一个是数据,一个是状态,

来,看一下怎么来设置按钮的文字,因为按钮的文字是分状态的,所以说这个设置,不要通过属性来设置,而要通过这个方法,叫做setTitle forState,看一下,几个参数

void setTitile:(NSString *) forState:(UIControlState),

两个,第一个是,你要设置它的文字内容,比如“下载

第二个是,你要设置它在什么状态下显示“下载”啊,你看这个UIControlState是,

有星号吗,没有,那么很有可能是枚举吧,就是个枚举

给个UIControlStateNormal,

这是设置默认状态下显示这个下载文字,

[btnDownload setTitle:@“下载” forState:UIControlStateNormal];

当你点击完毕以后,按钮是不是被禁用掉了,

被禁用掉了以后,是不是要显示“已下载”,那个文字,或者“已安装”吧,“已下载”或者“已安装”,

所以说,设置第二个文字,当它被禁用以后,设置文字,

[btnDownload setTitle:@“已安装” forState:UIControlStateDisabled];

这个时候,还是Normal吗,UIControlState什么,Disabled

当它就是已经被禁用以后,是不是显示这个文字啊,

这样的话,就可以实现这个按钮在不同的状态下,显示不同的文字了,

10.那么接下来,设置按钮的文字以后,是不是该设置按钮的背景图了,

背景图片是不是也是分不同的状态下的背景图,

所以说,能直接通过那个属性backgroundImage来设置吗,不能,

也要通过方法,对,setBackgroundImage:(UIImage *) forState:(UIControlState)

第一个是Image,

给个[UIImage imageNamed:哪张啊,默认状态下,是不是就是这张:@“buttongreen”,

什么状态,UIControlStateNormal

[btnDownload setBackgroundImage:[UIImage imageNamed:@“buttongreen” forState:UIControlStateNormal];

然后,高亮状态下的背景图,怎么写:

[btnDownload setBackgroundImage:[UIImage imageNamed:@“buttongreen_highlighted” forState:UIControlStateHighlighted];

这就是设置按钮的一个文字,和一个背景图,设置完毕以后,

运行一下,是不是有了,

11.这个时候,我们先把背景色去掉一下,

怎么去掉呢,

这几句话去掉:

btnDownload.backgroundColor = [UIColor greenColor];

lblName.backgroundColor = [UIColor redColor];

imgViewIcon.backgroundColor = [UIColor yellowColor];

appView.backgroundColor = [UIColor blueColor];

运行一下,顿时比刚才舒服多了吧,

但是,这个“下载”的文字,太大了吧,

12.我们现在要做的就是,把这个文字给它变小一些,是不是要设置这个按钮上的文字的大小吧,

大家回忆一下,怎么设置这个Label的文字大小啊,

Label.font = [UIFont ] ;

Label点font,是不是等于UIFont这么一个对象啊,

我们尝试用这种思路设置一下按钮的文字大小,

//3.设置按钮的文字的大小,

btnDownload.font,有没有,有,这不是有吗,看到了吗,

过期了,这个也有保质期是吗,来看看

它确实是画了一根红线吧,是不是用这根红线给你划掉了,

为什么给你划掉呢,点一下More,更多,

然后呢,它弹出了帮助,

告诉了在iOS3.0时候,是不是有这个东西了,

The font used to display text on the button,

是不是用来在按钮上显示文字的字体吧,

然后回到xcode,把光标放在这个btnDownload.font的font上,看右边,有一个问号状的圆圈,看一下右边这个帮助,这里有吧,

告诉你,这里有个红色的Deprecated,这是什么意思,

意思就是否决的、不建议你用的吧,

Deprecated,人家告诉你,这个已经不建议你用了,

Use the font property of the titleLabel instead,

使用这个font属性,谁的font属性呢,titleLabel的font属性来代替,

使用这个titleLabel的font属性来代替,

也就是说,当你使用按钮的font属性的时候,人家告诉你,它,你看到划红线,就表示这个属性已经不建议使用了,就是大家说的,过期了,

也就是说,这个font属性,是在老版本里面,iOS就是用它来实现的,但是新版本,它不建议你这么使用了,建议你使用另外一个东西,使用哪个东西呢,使用这个titleLabel的font属性来代替,

不要使用这个:btnDownload.font,

使用这个来代替:btnDownload.titleLabel.font,

那么我这里要给大家解释一下,这个titleLabel,是个什么玩意儿呢,

为什么要用它呢,我这儿不是操作按钮吗,怎么会来个titleLabel呢,

我们说,按钮是不是,按钮既能给它一个文字,还能给它一个图片,还能给它一个背景图吧,

为什么能同时给它这么多个东西呢,因为,按钮并不是一个简单的控件,它不简单,它是一个容器,它里面有其他一些子控件,

按钮其实是由多个控件组合而成的,

按钮它不是一个控件,它是由多个控件组合而成的,

按钮是由什么组合而成的呢,

首先:看到这里是一个imageView,

这个不是背景图,这是按钮,它可以设置一个图片,

然后,按钮还有一个Label,

它是由这么两个控件组成的,

我们说,第一个是,按钮.image,是不是可以给按钮设置一张图片啊,

就是设置给了这个,imageView,

当我们给按钮设置文字,setTitle 的时候,就是把那个文字给了这个titleLabel,给了这个控件了,

所以说,最终,按钮上的那个文字,是显示到了哪里,

是显示到了一个titleLabel,是不是显示在了这个Label上了,

所以说,你要控制这个按钮上的文字的字体,

是不是相当于是控制这个titleLabel,控制它的字体就ok了,

所以说,我们这里设置按钮的字体,不是按钮.font,而是“按钮.titleLabel.font”,

btnDownload.titleLabel.font = [UIFont systemFontOfSize:14];

运行一下,是不是可以了,

这样的话,我们这里所说的数据,是不是也有了,

这就是我们九宫格的设置数据这一步,

接下来,是不是就要给它注册一个单击事件了,

怎么为一个动态创建的按钮注册一个单击事件,还记得吗,

对,调这个控件的addTarget,给它增加一个事件,是不是就可以了,

来,我们看一下怎么给它动态增加一个单击事件

12.为按钮注册一个单击事件

//为按钮注册一个单击事件

[btnDownload addTarget:(id) action:(SEL) forControlEvents:(UIControlEvents)];

需要3个参数

1)第一个参数:(id),注意,这句话可以这么理解,可以理解为,为这个按钮注册一个单击事件,也就意味着,这个按钮一点击的时候,会执行这个单击事件吧,

或者说,也可以理解成,用某个对象的某个方法,监听按钮的某个事件

这样的话,当按钮的这个事件被触发的时候,是不是也会执行这个方法,

两种思路是不是一样的啊,

一个是:从左到右理解

一个是:从右到左理解

一个是:为按钮注册一个单击事件,当按钮单击的时候,执行单击事件,

一个是:用那个对象的那个方法,监听这个按钮的某个事件,

是不是一样的啊,

那么我们这里也可以这样来理解,就是给按钮addTarget里面,用当前控制器这个对象的某一个方法,来监听当前按钮的什么事件,UIControlEventTouchUpInside

[btnDownload addTarget:self action:@selector(selector) forControlEvents:UIControlEventTouchUpInside];

这就是说,用当前控制器的某个方法,我还没写呢,比如说是btnDownloadClick,用当前控制器的这个方法,监听按钮的这个事件,UIControlEventTouchUpInside,

或者说,为按钮注册一个单击事件,

是不是让这个方法来执行啊:btnDownloadClick,

//按钮的单击事件

– (void)btnDownloadClick

{

//好,我们在这里给大家输出一句话吧,

NSLog(@“下载按钮被点击了…”);

}

好,这个时候,我们来运行一下,看看这个单击按钮管用不管用啊,

运行一下,可以了吧,

好,到此为止,我们就把控件也加进去了,把数据也加进去了,

是不是按钮的单击事件,也给它添加上了,

接下来,我们再做的话,就可以做它单击时候弹出一个框框,再是隐藏消失那个效果啊

原文地址:https://blog.csdn.net/madoca/article/details/129043934

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_8145.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注