一个自定义、可配置的水平版本的 UIPickerView。
还包括CPPickerViewCell,这是一个UITableViewCell子类,它向单元格的右侧添加一个CPPickerView。此单元格是为了设置类型视图而设计的,允许在单个表格行中处理多个选项设置(而通常需要展开或多个行)。
如果您对垂直的自定义 UIPickerView 控制器感兴趣,请查看Arkady Fraerman编写的AFPickerView!此代码基本上是从他的项目分叉的。
CPPickerView目前正在App Store中至少一个经过批准的应用中使用(Hipmunk for iPhone/iPad!)。
要自定义外观,将以下图像替换为您自己的
注意:CPPickerView使用- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
(适用于iOS 5.0及以上)或- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
(适用于iOS 5.0以下)来拉伸wheelBackground.png和stretchableGlass.png。在更改图像大小之前,请确保查看在CPPickerView.m的initWithFrame:
中设置的帽尺寸的示例图像,因为您可能需要调整帽尺寸。《shadowOverlay.png》当前仅拉伸以适应框架。
可以通过属性设置几个外观选项
BOOL showGlass
- 定义是否显示在选择项目上的“玻璃”叠加层。UIEdgeInsets peekInset
- 定义当前选中项左侧和右侧项目的“窥视”到视图中的量。这可以用来提示用户有其他项目。注意:您很可能想保留top
和bottom
内边距值不变,并调整left
和right
值。更大的内边距值意味着更多的窥视。您还可以通过enabled
属性启用/禁用用户更改选择器的功能。默认状态为YES
。
创建一个CPPickerView实例并配置它
pickerView = [[CPPickerView alloc] initWithFrame:CGRectMake(30.0, 250.0, 126.0, 197.0)];
pickerView.rowFont = [UIFont boldSystemFontOfSize:19.0];
pickerView.rowIndent = 10.0;
pickerView.showGlass = YES;
设置dataSource,delegate并调用[pickerView reloadData]
pickerView.dataSource = self;
pickerView.delegate = self;
[pickerView reloadData];
然后在您的控制器中实现CPPickerViewDataSource和CPPickerViewDelegate。
像常规的 UITableViewCell 一样使用 CPPickerViewCell。在 tableView:cellForRowAtIndexPath:
中,对单元格进行 deque 或创建
CPPickerViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CPPickerViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
设置单元格的数据源和代理,并通知它其索引路径
cell.dataSource = self;
cell.delegate = self;
cell.currentIndexPath = indexPath;
注意:CPPickerViewCells 必须知道自己在表中的索引路径,否则你将无法在数据源和代理方法中区分它们!
根据协议实现 CPPickerViewCellDataSource 和 CPPickerViewCellDelegate。在包含的示例中,TableViewController(即 self
)被设置为所有单元格的数据源和代理。
CPPickerViewCell 的数据源/代理方法将正常的 CPPickerView
数据源/代理方法转换为通过 NSIndexPath 请求数据,而不是通过 CPPickerView 对象(以匹配典型的表单元格标识方式)。
最后,重新加载单元格(即 CPPickerView,将再次请求选择器中的项目)并使用给定行的任何特定设置重新配置它(如果你正在恢复以前存储的设置)。然后返回单元格。
[cell reloadData];
// Reconfigure
cell.showGlass = YES;
cell.peekInset = UIEdgeInsetsMake(0, 18, 0, 18);
NSInteger *storedSelectedIndex = [[AnArrayOfStoredStuff objectAtIndex:indexPath.row] intValue];
[cell selectItemAtIndex:storedSelectedIndex animated:NO]; //Unanimated, because this should be immediate
return cell;
Charles Powell
如果你在这个项目中使用了它,请告诉我!