iOS:选择器控件UIPickerView的详解和演示

选择器控件UIPickerView:

功能:它能够创建一个类似于密码锁式的单列或多列的选择菜单,用户可以通过它设置的代理来选择需要菜单中的任意的数据。例如创建日历、字体表(类型、大小、颜色)、图库等.
 
它是UIView视图的子类,而且遵从UIPickerViewDelegate协议和UIPickerViewDataSource协议。因此,选择器需要设置代理去进行操作;
设置视图控制器self为数据源代理和数据操作代理,即
@property(strong,nonatomic)UIPickerView *pickerView;
self.pickerView.dataSource = self;
self.pickerView.delegate  = self;
 
一、具体类信息:

 @protocol UIPickerViewDataSource, UIPickerViewDelegate;

 @interface UIPickerView : UIView <NSCoding,

 @property(nonatomic,assign) id<UIPickerViewDataSource> dataSource; // default is nil,设置代理

 @property(nonatomic,assign) id<UIPickerViewDelegate>   delegate;  // default is nil,设置代理

 @property(nonatomic)  BOOL showsSelectionIndicator;    // default is NO

 @property(nonatomic,readonly) NSInteger numberOfComponents;

 

二、协议UIPickerViewDataSource

@protocol UIPickerViewDataSource<NSObject>

@required //必须要实现的方法

// 返回的列显示的数量。

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

//返回行数在每个组件(每一列)

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

@end

 

三、协议UIPickerViewDelegate

@protocol UIPickerViewDelegate<NSObject>

@optional //可以选择执行的方法

//每一列组件的列宽度

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

//每一列组件的行高度

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

// 返回每一列组件的每一行的标题内容

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

// 返回每一列组件的每一行的标题内容的属性

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component;

// 返回每一列组件的每一行的视图显示

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

//执行选择某列某行的操作

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

@end

 
   演示一:制作简单的万年历,一开始就显示当前日期
   源码如下:
复制代码
1 #import <UIKit/UIKit.h>
2 
3 @interface ViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate>
4 @property(nonatomic,strong)NSArray *years;
5 @property(nonatomic,strong)NSArray *months;
6 @property(nonatomic,strong)NSArray *days;
7 
8 @end
复制代码
复制代码
  1 #import "ViewController.h"
  2 
  3 @interface ViewController ()
  4 @property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
  5 
  6 @end
  7 
  8 @implementation ViewController
  9 
 10 - (void)viewDidLoad
 11 {
 12     [super viewDidLoad];
 13     //初始化数据
 14     NSMutableArray *multYears = [NSMutableArray array];//年
 15     for(int i=0; i<20; i++)
 16     {
 17         NSString *year = [NSString stringWithFormat:@"20%02d年",i+1];
 18         [multYears addObject:year];
 19     }
 20     self.years = multYears;
 21     
 22     NSMutableArray *multMonths = [NSMutableArray arrayWithCapacity:12];//月
 23     for(int i=1; i<=12; i++)
 24     {
 25         NSString *month = [NSString stringWithFormat:@"%d月",i];
 26         [multMonths addObject:month];
 27     }
 28     self.months = multMonths;
 29     
 30     NSMutableArray *multDays = [NSMutableArray arrayWithCapacity:31];//日
 31     for(int i=1; i<=31; i++)
 32     {
 33         NSString *day = [NSString stringWithFormat:@"%d日",i];
 34         [multDays addObject:day];
 35     }
 36     self.days = multDays;
 37     
 38     
 39     //设置pickerView的数据源和代理
 40     self.pickerView.dataSource = self;
 41     self.pickerView.delegate = self;
 42     
 43     //显示当前日期
 44     NSDate *now = [NSDate date];
 45     //分解日期
 46     NSCalendar  *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
 47     
 48     NSCalendarUnit unitFlags = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay;
 49     NSDateComponents *components = [calendar components:unitFlags fromDate:now];
 50     
 51     
 52     //设置pickerView显示当前日期
 53     NSInteger year = [components year];
 54     [self.pickerView selectRow:year-2000-1 inComponent:0 animated:year];
 55     
 56     NSInteger month = [components month];
 57     [self.pickerView selectRow:month-1 inComponent:1 animated:month];
 58     
 59     NSInteger day = [components day];
 60     [self.pickerView selectRow:day-1 inComponent:2 animated:day];
 61 }
 62 
 63 #pragma mark - pickerView的代理方法
 64 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
 65 {
 66     return 3;
 67 }
 68 -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
 69 {
 70     NSInteger row = 0;
 71     switch (component)
 72     {
 73         case 0:
 74             row = self.years.count;
 75             break;
 76         case 1:
 77             row = self.months.count;
 78             break;
 79         case 2:
 80             row = self.days.count;
 81             break;
 82     }
 83     return  row;
 84 }
 85 
 86 -(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
 87 {
 88     NSString *title;
 89     switch (component)
 90     {
 91         case 0:
 92             title = self.years[row];
 93             break;
 94         case 1:
 95             title = self.months[row];
 96             break;
 97         case 2:
 98             title = self.days[row];
 99             break;
100     }
101     return  title;
102 }
103 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
104 {
105     NSString *strDate = [NSString stringWithFormat:@"%@-%@-%@",
106                          self.years[[pickerView selectedRowInComponent:0]],
107                          self.months[[pickerView selectedRowInComponent:1]],
108                          self.days[[pickerView selectedRowInComponent:2]]];
109     NSLog(@"%@",strDate);
110 }
111 @end
复制代码

    演示二:制作简单的字体表,包括字体类型、大小、颜色

 

  源码如下:

复制代码
1 #import <UIKit/UIKit.h>
2 
3 @interface ViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate>
4 @property(nonatomic,strong) NSArray *fontNames;
5 @property(nonatomic,strong) NSArray *fontSizes;
6 @property(nonatomic,strong) NSArray *fontColors;
7 @end
复制代码
复制代码
  1 #import "ViewController.h"
  2 
  3 @interface ViewController ()
  4 @property (weak, nonatomic) IBOutlet UILabel *label;
  5 @property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
  6 
  7 
  8 @end
  9 
 10 @implementation ViewController
 11 
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14     //初始化数据
 15     self.fontNames = [UIFont familyNames];//字体名字
 16     
 17     NSMutableArray *mutsize = [NSMutableArray arrayWithCapacity:20];//字体大小
 18     for(int i=1; i<=30; i++)
 19     {
 20         [mutsize addObject:[NSString stringWithFormat:@"%d",10+i]];
 21     }
 22     self.fontSizes = mutsize;
 23     
 24     self.fontColors = @[
 25                         @{@"name":@"红色",@"color":[UIColor redColor]},
 26                         @{@"name":@"黑色",@"color":[UIColor blackColor]},
 27                         @{@"name":@"蓝色",@"color":[UIColor blueColor]},
 28                         @{@"name":@"黄色",@"color":[UIColor yellowColor]},
 29                         @{@"name":@"绿色",@"color":[UIColor greenColor]}
 30                        ];
 31     //设置pickerView的代理和数据源
 32     self.pickerView.dataSource = self;
 33     self.pickerView.delegate = self;
 34     
 35     //设置label的font
 36     self.label.font = [UIFont fontWithName:self.fontNames[0] size:[self.fontSizes[0] integerValue]];
 37     
 38     self.label.textColor = [self.fontColors[0] objectForKey:@"color"];
 39 }
 40 
 41 #pragma mark - pickerView的代理方法
 42 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
 43 {
 44     return  3;
 45 }
 46 -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
 47 {
 48     NSInteger row = 0;
 49     switch (component)
 50     {
 51         case 0:
 52             row = self.fontNames.count;
 53             break;
 54         case 1:
 55             row = self.fontSizes.count;
 56             break;
 57         case 2:
 58             row = self.fontColors.count;
 59             break;
 60     }
 61     return row;
 62 }
 63 -(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
 64 {
 65     NSString *title;
 66     switch (component)
 67     {
 68         case 0:
 69             title = self.fontNames[row];
 70             break;
 71         case 1:
 72             title = self.fontSizes[row];
 73             break;
 74         case 2:
 75             title = [self.fontColors[row] objectForKey:@"name"];
 76             break;
 77     }
 78     return  title;
 79 }
 80 //设置每一列的宽度
 81 -(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
 82 {
 83     CGFloat width = 0.0f;
 84     switch (component)
 85     {
 86         case 0:
 87             width = pickerView.frame.size.width/2;
 88             break;
 89         case 1:
 90             width = pickerView.frame.size.width/4;
 91             break;
 92         case 2:
 93             width = pickerView.frame.size.width/4;
 94             break;
 95     }
 96     return width;
 97 }
 98 
 99 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
100 {
101     //设置label的font
102     self.label.font = [UIFont fontWithName:self.fontNames[[pickerView selectedRowInComponent:0]] size:[self.fontSizes[[pickerView selectedRowInComponent:1]] integerValue]];
103     
104     self.label.textColor = [self.fontColors[[pickerView selectedRowInComponent:2]] objectForKey:@"color"];
105 }
106 @end
复制代码

 

  演示三:制作简单的图库浏览器

 

  源码如下:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource>

@end

复制代码
 1 #import "ViewController.h"
 2 
 3 @interface ViewController ()
 4 @property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
 5 @property (strong,nonatomic)NSArray *imageNames;
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     //初始化数据
13     NSMutableArray *mutImageNames = [NSMutableArray arrayWithCapacity:9];
14     for(int i=0; i<9; i++)
15     {
16         [mutImageNames addObject:[NSString stringWithFormat:@"%d.png",i]];
17     }
18     self.imageNames = mutImageNames;
19     
20     //设置pickerView的数据源和代理
21     self.pickerView.dataSource = self;
22     self.pickerView.delegate = self;
23     
24 }
25 #pragma mark - pickerview代理方法
26 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
27 {
28     return 1;
29 }
30 -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
31 {
32     return self.imageNames.count;
33 }
34 //设置行高
35 -(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
36 {
37     UIImage *image = [UIImage imageNamed:self.imageNames[0]];
38     return image.size.height;
39 }
40 //设置每行显示的视图
41 -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
42 {
43     UIImage *image = [UIImage imageNamed:self.imageNames[row]];
44     //UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
45     //imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
46     //return imageView;
47     
48     UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0,image.size.width, image.size.height)];
49     [button setBackgroundImage:image forState:UIControlStateNormal];
50     [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
51     return button;
52 }
53 -(void)buttonClicked:(UIButton *)sender
54 {
55     NSLog(@"button clicked");
56 }
57 @end

转载于:https://www.cnblogs.com/daxiong520/p/4915957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 `UITextViewDelegate` 中的 `textViewDidChangeSelection` 方法来实现通过选择器(`UIPickerView`)选择颜色和字体大小后,选中文本后文字和字体颜色的改变。 首先,您需要创建一个 `UIPickerView` 并将其作为 `UITextView` 的 inputView,以便用户可以在选择器中选择颜色和字体大小。具体做法如下: ```swift // 创建一个 UIPickerView let pickerView = UIPickerView() pickerView.delegate = self pickerView.dataSource = self // 将 pickerView 设置为 textView 的 inputView yourTextView.inputView = pickerView ``` 然后,您需要在 `UITextViewDelegate` 中的 `textViewDidChangeSelection` 方法中获取所选文本的范围,并将选定的文本的颜色和字体属性设置为选择器中选择的值。具体实现代码如下: ```swift func textViewDidChangeSelection(_ textView: UITextView) { let selectedRange = textView.selectedRange let attributedText = NSMutableAttributedString(attributedString: textView.attributedText) attributedText.addAttribute(.foregroundColor, value: selectedColor, range: selectedRange) attributedText.addAttribute(.font, value: selectedFont, range: selectedRange) textView.attributedText = attributedText } ``` 其中,`selectedColor` 和 `selectedFont` 分别是从选择器中获取的颜色和字体大小。 最后,您需要实现 `UIPickerViewDelegate` 和 `UIPickerViewDataSource` 协议中的方法来设置选择器的选项和响应选择器的选择事件。具体实现代码如下: ```swift // 实现 UIPickerViewDataSource 协议中的方法 func numberOfComponents(in pickerView: UIPickerView) -> Int { return 2 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if component == 0 { return colors.count } else { return fontSizes.count } } // 实现 UIPickerViewDelegate 协议中的方法 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if component == 0 { return colors[row] } else { return fontSizes[row] } } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if component == 0 { selectedColor = UIColor(named: colors[row]) ?? .black } else { selectedFont = UIFont.systemFont(ofSize: CGFloat(fontSizes[row])) ?? UIFont.systemFont(ofSize: 16) } } ``` 其中,`colors` 和 `fontSizes` 是您自定义的颜色和字体大小选项数组,`selectedColor` 和 `selectedFont` 是您用来存储所选颜色和字体大小的变量。 这样,当用户选中文本后,就可以通过选择器来改变选中文本的颜色和字体大小了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值