一、设置子控件数据:
1.这里怎么来设置子控件数据呢,
我们在这个循环开始时候,创建控件:
import “ViewController.h”
@interface ViewController ()
//1.加载app.plist的属性
@property(nonatomic,copy)NSArray *apps;
@end
@implementation ViewController
//2.重写apps的getter方法,懒加载数组
– (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,marginTop,columns
//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.width – columns * 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
然后你看一下它里面的属性:
它们是不是有这么多的属性,
第一个属性,就是设置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进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。