修复UIPickerView的选择栏中的标签 [英] Fixed labels in the selection bar of a UIPickerView
问题描述
在时钟应用程序中,计时器屏幕显示一个选择器(可能是 UIPicker
在 UIDatePickerModeCountDownTimer
模式)
(编辑)请注意,这些标签是固定的:
有一种方法可以在标准的 UIPickerView的选择栏中显示这样的固定标签
组件?
我没有找到任何有用的API。建议添加 UILabel
作为选择器的子视图,但这不起作用。
回答
我按照Ed Marty的建议(下面的答案)不完美,但它应该愚弄人。作为参考,这里是我的实现,随意让它更好...
- (void)viewDidLoad {
// Add pickerView
self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero];
[pickerView release];
CGSize pickerSize = [pickerView sizeThatFits:CGSizeZero];
CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
#define toolbarHeight 40.0
CGFloat pickerTop = screenRect.size.height - toolbarHeight - pickerSize.height;
CGRect pickerRect = CGRectMake(0.0,pickerTop,pickerSize.width,pickerSize.height);
pickerView.frame = pickerRect;
//在pickerView的顶部添加标签
CGFloat top = pickerTop + 2;
CGFloat height = pickerSize.height - 2;
[self addPickerLabel:@xrightX:123.0 top:top height:height];
[self addPickerLabel:@yrightX:183.0 top:top height:height];
// ...
}
- (void)addPickerLabel:(NSString *)labelString rightX:(CGFloat)rightX top:(CGFloat) height {
#define PICKER_LABEL_FONT_SIZE 18
#define PICKER_LABEL_ALPHA 0.7
UIFont * font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
CGFloat x = rightX - [labelString sizeWithFont:font] .width;
//白色标签下面1个像素,用于模拟压纹。
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(x,top + 1,rightX,height)];
label.text = labelString;
label.font = font;
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;
label.alpha = PICKER_LABEL_ALPHA;
[self.view addSubview:label];
[label release];
//实际标签。
label = [[UILabel alloc] initWithFrame:CGRectMake(x,top,rightX,height)];
label.text = labelString;
label.font = font;
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;
label.alpha = PICKER_LABEL_ALPHA;
[self.view addSubview:label];
[label release];
}
创建您的选择器,标签与阴影,并推送到pickIndicator视图下面的选择器的子视图。
看起来像这样
UILabel * label = [[[UILabel alloc] initWithFrame:CGRectMake(135,93,80,30)] autorelease];
label.text = @Label;
label.font = [UIFont boldSystemFontOfSize:20];
label.backgroundColor = [UIColor clearColor];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
[picker insertSubview:label aboveSubview:[picker.subviews objectAtIndex:5]];
//当你有多个组件(部分)...
//你需要找到你需要实际获得
//下的子视图,所以实验'objectAtIndex:5 '
//
//你可以像下面这样找到视图来获取
// define @class UIPickerTable;
// NSMutableArray * tables = [[NSMutableArray alloc] init];
// for(id i in picker.subviews)if([i isKindOfClass:[UIPickerTable class]])[tables addObject:i];
//等...
p>
In the clocks application, the timer screen shows a picker (probably a UIPicker
in UIDatePickerModeCountDownTimer
mode) with some text in the selection bar ("hours" and "mins" in this case).
(edit) Note that these labels are fixed: They don't move when the picker wheel is rolling.
Is there a way to show such fixed labels in the selection bar of a standard UIPickerView
component?
I did not find any API that would help with that. A suggestion was to add a UILabel
as a subview of the picker, but that didn't work.
Answer
I followed Ed Marty's advice (answer below), and it works! Not perfect but it should fool people. For reference, here's my implementation, feel free to make it better...
- (void)viewDidLoad {
// Add pickerView
self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero];
[pickerView release];
CGSize pickerSize = [pickerView sizeThatFits:CGSizeZero];
CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
#define toolbarHeight 40.0
CGFloat pickerTop = screenRect.size.height - toolbarHeight - pickerSize.height;
CGRect pickerRect = CGRectMake(0.0, pickerTop, pickerSize.width, pickerSize.height);
pickerView.frame = pickerRect;
// Add label on top of pickerView
CGFloat top = pickerTop + 2;
CGFloat height = pickerSize.height - 2;
[self addPickerLabel:@"x" rightX:123.0 top:top height:height];
[self addPickerLabel:@"y" rightX:183.0 top:top height:height];
//...
}
- (void)addPickerLabel:(NSString *)labelString rightX:(CGFloat)rightX top:(CGFloat)top height:(CGFloat)height {
#define PICKER_LABEL_FONT_SIZE 18
#define PICKER_LABEL_ALPHA 0.7
UIFont *font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
CGFloat x = rightX - [labelString sizeWithFont:font].width;
// White label 1 pixel below, to simulate embossing.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x, top + 1, rightX, height)];
label.text = labelString;
label.font = font;
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;
label.alpha = PICKER_LABEL_ALPHA;
[self.view addSubview:label];
[label release];
// Actual label.
label = [[UILabel alloc] initWithFrame:CGRectMake(x, top, rightX, height)];
label.text = labelString;
label.font = font;
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;
label.alpha = PICKER_LABEL_ALPHA;
[self.view addSubview:label];
[label release];
}
Create your picker, create a label with a shadow, and push it to a picker's subview below the selectionIndicator view.
It would look something like this
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(135, 93, 80, 30)] autorelease];
label.text = @"Label";
label.font = [UIFont boldSystemFontOfSize:20];
label.backgroundColor = [UIColor clearColor];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake (0,1);
[picker insertSubview:label aboveSubview:[picker.subviews objectAtIndex:5]];
//When you have multiple components (sections)...
//you will need to find which subview you need to actually get under
//so experiment with that 'objectAtIndex:5'
//
//you can do something like the following to find the view to get on top of
// define @class UIPickerTable;
// NSMutableArray *tables = [[NSMutableArray alloc] init];
// for (id i in picker.subviews) if([i isKindOfClass:[UIPickerTable class]]) [tables addObject:i];
// etc...
-- Pay it forward
这篇关于修复UIPickerView的选择栏中的标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!