UIPickerView 选择器

UIPickerView 继承了UIView 没有继承UIControl  UIPickerView的时间处理由其委托对象完成

使用Component标明列 Row标明列中单个元素

numberOfCompinents:获取UIPickerView 指定列中包含的列表项的数量。该属性只读

showsSelectionIndicator: 是否显示UIPV中的选中标记(以高亮背景作为选中标记)

numberOfRowsInComponent: 获取UIPV包含的列数量

rowSizeForCompinent:获取UIPV包含的指定列中列表项的大小。该方法返回一个CGSize对象

selectRow:inComponent:animated:该方法设置选中该UIPV中指定列的特定列表项 最后一个 是否使用动画

selectRowInCompinent:返回该UIPickerView指定列中悲酸中的列表项

viewForRow:forComponent:返回该UIPV指定列的列表项所使用的UIView控件

UIDatePicker只是负责该空间的通用行为,而该空间包含多少列,格列包含多少个列表项则有UIPickerViewDataSource对象负责

开发者必须weiUIPickerView设置UIPickerViewDataSource对象,并实现两种方法:

numberOFComponentsInPickerView:该UIPickerView将通过该方法来判断应该包含多少列

pickerView:numBerOfRowsInCompont:判断指定列包含多少个列表项

UIPickerView需要控制各列额宽度,以及各列中列表项的大小和外观,或程序需要为UIPicker的选中事件提供相应,都需要为UIPickerView设置UIPVDelegate委托对象,并根据需要实现该委托对象中的如下方法

-pickerView:rowHeightForCompinent:该方法返回的CGFloatz值将作为该UIPV控件中指定列中列表项的高度

-pickerView:widthForComponent:宽

-~titleForRow;forComponent:指定列的列表项的文本标题

~viewForRow:forComponent:reusingView:返回的UIPV控件中指定列的指定列表项

UIPV-InterfaceBuilder -ShowsSelectionIndicator 是否显示UIPV中选中标记(高亮背景)

10.12.1 单列选择器

- (void)viewDidLoad {

[super viewDidLoad];

self.books=[NSArray arrayWithObjects:@"第一项",@"第二项",@"第三项", nil];

self.pickerView=[[UIPickerView alloc]initWithFrame:CGRectMake(0, 20, 400, 500)];

self.pickerView.dataSource=self;

self.pickerView.delegate=self;

[self.view addSubview:self.pickerView];

// Do any additional setup after loading the view, typically from a nib.

}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

return 1;

}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

return self.books.count;

}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{

//根据row参数返回books中的元素,row参数代表列表项的编号

//因此该方法表示第几个列表项,就使用books中的第几个元素

return [self.books objectAtIndex:row];

}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

//使用一个UIAlertView来系那是用户选中的列表项

UIAlertView* alert=[[UIAlertView alloc]

initWithTitle:@"提示" message:[NSString stringWithFormat: @"你选中的图书是:%@",[self.books objectAtIndex:row]] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];

[alert show];

}

10.12.2多项选择器

- (void)viewDidLoad {

[super viewDidLoad];

_initState=0;

self.books=[NSArray arrayWithObjects:@"诗集1",@"诗集2",@"诗集3", nil];

self.haiMingWei=[NSArray arrayWithObjects:@"这里的黎明静悄悄",@"老人与海", nil];

self.shaShiBiYa=[NSArray arrayWithObjects:@"十四行诗集",@"慕克白",@"哈姆莱特",@"罗密欧与朱丽叶", nil];

//    self.dict=[NSDictionary dictionaryWithObjectsAndKeys:self.books,@"叶慈",

//               self.haiMingWei,@"海明威",

//               self.shaShiBiYa,@"罗密欧与朱丽叶",nil];

self.author=[NSArray arrayWithObjects:@"海明威",@"莎士比亚",@"叶慈", nil];

self.pickerView=[[UIPickerView alloc]initWithFrame:CGRectMake(0, 20, 400, 500)];

self.pickerView.dataSource=self;

self.pickerView.delegate=self;

self.i=0;

[self.view addSubview:self.pickerView];

// Do any additional setup after loading the view, typically from a nib.

}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

return 2;

}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

if (component==0) {

return  self.author.count;

}

if ([self.pickerView selectedRowInComponent:0]==0) {

return  self.haiMingWei.count;

}else  if ([self.pickerView selectedRowInComponent:0]==1) {

return  self.shaShiBiYa.count;

}else

return self.books.count;

}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{

//根据row参数返回books中的元素,row参数代表列表项的编号

//因此该方法表示第几个列表项,就使用books中的第几个元素

if (component==0) {

return  self.author[row];

}

switch ([self.pickerView selectedRowInComponent:0]) {

case 0:

return self.haiMingWei[row];

break;

case 1:

return self.shaShiBiYa[row];

break;

case  2:

return  self.books[row];

break;

default:

return self.haiMingWei[row];

break;

}

}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

//使用一个UIAlertView来系那是用户选中的列表项

if (component==0) {

[self.pickerView selectRow:row inComponent:component animated:YES];

[self.pickerView reloadComponent:1];

}

}

实现了单列巡回滚动的UIPickerView

.h——————————————————————

@property (nonatomic) UIPickerView* pickerView;

@property (nonatomic) UIImage* lose;

@property (nonatomic) UIImage* win;

@property (nonatomic) NSMutableArray* images;

@property (nonatomic) UIImageView* view;

@property (nonatomic) UIButton* start;

@property (nonatomic) UIImageView* image;

@property (nonatomic,strong) NSArray* imagesTemp;//原图片序列

@property (nonatomic,strong) NSMutableArray* comArr;//控制每一列的图片,每一序列是picker一列的所有图片集合

.m——————————————————————

- (void)viewDidLoad {

[super viewDidLoad];

UIImage* dog=[UIImage imageNamed:@"./images/dog.png"];

UIImage* duck=[UIImage imageNamed:@"./images/duck.png"];

UIImage* elephant=[UIImage imageNamed:@"./images/elephant.png"];

UIImage* frog=[UIImage imageNamed:@"./images/frog.png"];

UIImage* mouse=[UIImage imageNamed:@"./images/mouse.png"];

UIImage* rabbit=[UIImage imageNamed:@"./images/rabbit.png"];

self.lose=[UIImage imageNamed:@"./images/lose.jpg"];

self.win=[UIImage imageNamed:@"./images/win.gif"];

self.images=[NSMutableArray arrayWithObjects:dog,duck,

elephant,frog,mouse,rabbit, nil];

self.imagesTemp=[NSMutableArray arrayWithArray:self.images];

self.comArr=[NSMutableArray arrayWithObjects:

self.imagesTemp,

self.imagesTemp,

self.imagesTemp,

self.imagesTemp,

self.imagesTemp,

self.imagesTemp

,nil];

//加载输赢结果的图标显示

self.image=[[UIImageView alloc]initWithFrame:CGRectMake(190, 330, 40, 40)];

[self.view addSubview:self.image];

//加载主体

self.pickerView=[[UIPickerView alloc]initWithFrame:

CGRectMake(20, 20, 380, 200)];

self.pickerView.dataSource=self;

self.pickerView.delegate=self;

self.pickerView.userInteractionEnabled=NO;

[self.view addSubview:self.pickerView];

//加载开始按钮

self.start=[UIButton buttonWithType:UIButtonTypeRoundedRect];

self.start.frame=CGRectMake(200, 400, 40, 50);

[self.start setTitle:@"开始" forState:UIControlStateNormal];

[self.start addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:self.start];

// Do any additional setup after loading the view, typically from a nib.

}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

return 5;

}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

return self.images.count;

}

#define kImageTag 1

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

if (view.tag!=kImageTag) {

view=[[UIImageView alloc]initWithImage:[self.comArr[component] objectAtIndex:row]];

view.tag=kImageTag;

view.userInteractionEnabled=NO;

}

return view;

}

-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{

return 40;

}

-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{

return 40;

}

-(void)clicked:(id)sender{

self.start.enabled=NO;

self.image.image=nil;

NSMutableDictionary* result=[[NSMutableDictionary alloc]

initWithCapacity:6];

NSURL* winSoundUrl=[[NSBundle mainBundle]

URLForResource:@"crunch" withExtension:@"wav"];

for (int i=0; i<5;i++) {

NSUInteger selectedVal=arc4random()%self.images.count;

//为了选择器列之间不会互相影响,新建一个数组

NSMutableArray* arr=[NSMutableArray arrayWithArray:self.imagesTemp];

for (int j=0; j

[arr setObject: self.imagesTemp[(selectedVal+j)%self.images.count]

atIndexedSubscript:(j+3)%self.imagesTemp.count];

}

//将重新归序的数组放入到第i列的中,重新加载

[self.comArr setObject:arr atIndexedSubscript:i];

[self.pickerView reloadComponent:i];

[self.pickerView selectRow:3 inComponent:i animated:YES];

//在result中已经为该随机数记录了出现次数

if ([result objectForKey:[NSNumber numberWithInt:selectedVal]]) {

//获取result中该随机数的出现次数

NSUInteger newCount=[[result objectForKey:

[NSNumber numberWithInt:selectedVal] ] integerValue];

//将result中该随机数的出现次数+1

[result setObject:[NSNumber numberWithInt:(newCount+1)] forKey:[NSNumber numberWithInt:selectedVal]];

}else

{

//使用result记录该随机数的出现次数为1

[result setObject:[NSNumber numberWithInt:1] forKey:[NSNumber numberWithInt:selectedVal]];

}

//使用该变量记录随机数的最大出现次数

NSUInteger maxOccurs=1;

for (NSNumber* num in [result allKeys] ) {

//只要任何随机数的出现次数大于maxOccurs

if ([[result objectForKey:num]integerValue]>maxOccurs) {

//使用maxOccurs保存该随机数的出现次数

maxOccurs=[[result objectForKey:num] integerValue];

}

}

//如果某个随机数的出现次数大于或等于3(既是界面出现了三个相同图案

if (maxOccurs>=3) {

//如果赢了延迟0.5秒执行showWin方法,显示结果

[self performSelector:@selector(showWin) withObject:nil afterDelay:0.5];

}else{

//

[self performSelector:@selector(showLose) withObject:nil afterDelay:0.5];

}

}

}

-(void)showWin{

self.image.image=self.win;

self.start.enabled=YES;

}

-(void)showLose{

self.image.image=self.lose;

self.start.enabled=YES;

}

//当运行后,图片不显示,则可能初始化加载的图片为空,可能图片路径有问题,或者没有加入到项目中

加入项目

1.使用addfileTo   xCode左侧右键

2.在target-BuildPhases-CompileSources 中加入图片文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容