渣渣笔记一篇,自定义PickerView
效果图:
实现:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@class MMPickerView;
@protocol MMPickerViewDelegate <NSObject>
@optional
- (void)cancelBtnActionPickerView:(MMPickerView *)pickerView;
- (void)doneBtnActionPickerView:(MMPickerView *)pickerView;
@end
@interface MMPickerView : UIView
@property (nonatomic, weak) id <MMPickerViewDelegate> delegate;
@property (nonatomic, strong, readonly) UIPickerView *pickerView;
- (instancetype)initWithFrame:(CGRect)frame pickerDelegate:(id<UIPickerViewDelegate>)delegate dataSource:(id<UIPickerViewDataSource>)dataSource;
@end
#import "MMPickerView.h"
@interface MMPickerView ()
@property (nonatomic, strong) UIView *backGroundView;
@property (nonatomic, strong) UIToolbar *toolbar;
@property (nonatomic, strong, readwrite) UIPickerView *pickerView;
@end
@implementation MMPickerView
- (void)layoutSubviews {
[super layoutSubviews];
self.backGroundView.frame = CGRectMake(0, CGRectGetHeight(self.frame) - 44 - 216, CGRectGetWidth(self.frame), 44 + 216);
self.toolbar.frame = CGRectMake(0, 0, CGRectGetWidth(self.backGroundView.frame), 44);
self.pickerView.frame = CGRectMake(0, 44, CGRectGetWidth(self.backGroundView.frame), 216);
}
- (instancetype)initWithFrame:(CGRect)frame pickerDelegate:(id<UIPickerViewDelegate>)delegate dataSource:(id<UIPickerViewDataSource>)dataSource {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
self.backGroundView = [[UIView alloc] init];
self.backGroundView.backgroundColor = [UIColor whiteColor];
[self addSubview:self.backGroundView];
UIBarButtonItem *canleBtn = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancel)];
UIBarButtonItem *fixedBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target: nil action: nil];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(done)];
self.toolbar = [[UIToolbar alloc] init];
self.toolbar.barStyle = UIBarStyleDefault;
self.toolbar.items = @[canleBtn, fixedBtn, doneBtn];
[self.backGroundView addSubview:self.toolbar];
self.pickerView = [[UIPickerView alloc] init];
self.pickerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.pickerView.delegate = delegate;
self.pickerView.dataSource = dataSource;
[self.backGroundView addSubview:self.pickerView];
}
return self;
}
- (void)done
{
if ([self.delegate respondsToSelector:@selector(cancelBtnActionPickerView:)]) {
[self.delegate cancelBtnActionPickerView:self];
}
}
- (void)cancel
{
if ([self.delegate respondsToSelector:@selector(doneBtnActionPickerView:)]) {
[self.delegate doneBtnActionPickerView:self];
}
}
@end
#import "ViewController.h"
#import "MMPickerView.h"
@interface ViewController ()<UIPickerViewDelegate, UIPickerViewDataSource, MMPickerViewDelegate>
@property (nonatomic, strong) MMPickerView *pickerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.pickerView = [[MMPickerView alloc] initWithFrame:self.view.bounds pickerDelegate:self dataSource:self];
[self.view addSubview:self.pickerView];
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
self.pickerView.frame = self.view.bounds;
}
#pragma mark UIPickerViewDataSource,UIPickerViewDelegate
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0) {
return 2;
}
return 5;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0) {
return @[@"1",@"2"][row];
}
return @[@"1",@"2",@"3",@"4",@"5"][row];
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
return 100;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 40.0;
}
@end
封装无需过度,一切以便捷为主。