【发布时间】:2010-11-01 05:03:40
【问题描述】:
我想更改 UIPickerView 的边框颜色。我没有看到 UIPickerView 的 tint 属性。有什么办法可以做到吗?还是解决方法?
谢谢。
【问题讨论】:
-
您可能会发现这篇文章很有用:aralbalkan.com/2985
标签: iphone uipickerview
我想更改 UIPickerView 的边框颜色。我没有看到 UIPickerView 的 tint 属性。有什么办法可以做到吗?还是解决方法?
谢谢。
【问题讨论】:
标签: iphone uipickerview
如果您只是想要一种解决方法,请在模拟器中截屏,在 photoshop 中打开它,将其裁剪到 UIPickerView 区域,使中心透明,应用您想要的任何色调,将该图像添加到您的项目中,然后将其作为 UIImageView 添加到 UIPickerView 之上。
【讨论】:
只需将此行添加到您的 UIPickerView 方法之一:
[[[MyPicker subviews] objectAtIndex:4] setBackgroundColor: [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]];
【讨论】:
您可以执行以下操作:
通过向导或代码设置选择器视图背景颜色,如下所示:
Picker1.backgroundColor = [UIColor someColor];// clearColor for transparent
为选择器视图子视图设置 alpha 值,编号为 0、1 和 3。(不知道为什么会有子视图 2 的想法)。在第一次为选取器视图加载数据后通过代码执行此操作,如下所示(如果您在 DidViewLoad 中执行此操作,则会引发异常)。
[(UIView*)[[Picker1 subviews] objectAtIndex:0] setAlpha:someValue];// 0.0f for transparent
[(UIView*)[[Picker1 subviews] objectAtIndex:1] setAlpha:someValue];
[(UIView*)[[Picker1 subviews] objectAtIndex:3] setAlpha:someValue];
不要忘记在 viewForRow 方法中清除要发送到选取器视图的标签的背景颜色。
lbl.backgroundColor = [UIColor someColor];// could be clearColor
【讨论】:
这是带有@Lukas 答案的ARC 的现代像素完美版本,因为有些问题永远不会过时:
#import <QuartzCore/QuartzCore.h>
// . . .
CALayer* mask = [[CALayer alloc] init];
mask.backgroundColor = [UIColor blackColor].CGColor;
mask.frame = CGRectInset(picker.bounds, 10.0f, 10.0f);
mask.cornerRadius = 5.0f;
picker.layer.mask = mask;
此答案适用于任何尺寸的选择器 b/c 图层尺寸是即时计算的。
【讨论】:
您也可以屏蔽该组件。稍微摆弄一下,您可以获取组件的大小并使用以下代码将其剪切出来:
CALayer* mask = [[CALayer alloc] init];
[mask setBackgroundColor: [UIColor blackColor].CGColor];
[mask setFrame: CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)];
[mask setCornerRadius: 5.0f];
[picker.layer setMask: mask];
[mask release];
别忘了
#import <QuartzCore/QuartzCore.h>
【讨论】:
您可以通过使用 IXPickerOverlayView available on GitHub 将背景图像完全替换为您选择的背景图像来更改背景颜色(repo 包含使用此类的图解示例)。
请注意,您必须自己从头开始绘制(矩形)背景,但与此处提到的任何解决方法不同,此方法是完全动态的:即使您更改选择轮的数量及其运行时的大小(就像 UIDatePicker 在您更改系统区域设置时所做的那样)。
获得背景图片后,使用 IXPickerOverlayView 就像在 Picker 视图顶部添加 IXPickerOverlayView 实例并分配 hostPickerView 属性一样简单。
【讨论】:
选择器在完全加载之前不会有子视图。如果您尝试这样做:
[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];
在 viewDidLoad 或 viewWillAppear 它不起作用。但是,我将我的移动到 UIPickerView 协议方法之一,它删除了背景框架。
- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (self.pickerBackgroundNotHidden)
{
self.pickerBackgroundNotHidden = false;
[(UIView*)[[tempPicker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[tempPicker subviews] objectAtIndex:7] setHidden:YES];
[(UIView*)[[tempPicker subviews] objectAtIndex:8] setHidden:YES];
}
return [arrayColors objectAtIndex:row];
}
您可能可以将选择器子类化以更有效地执行此操作,但我更愿意避免子类化。
哦,同样,这可能很明显,但如果你的选择器中没有任何项目,上面的代码不会删除子视图。
【讨论】:
我的 UIPickerView 有 3 个组件。并且没有选择指示器。
这给了它 11 个子视图。 [[picker subviews] count]
隐藏第一个和最后一个子视图会完全移除背景。
[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];
隐藏每隔三个子视图(索引 1、4 和 7)隐藏组件上的不透明背景。效果非常好,我可以随心所欲地剥皮。
希望对某人有所帮助:)
【讨论】:
实际上纠正你,你实际上可以在 UIPickerview 上放一个 .png 并仍然使用 Picker 视图,只要确保中间是透明的,否则你将看不到行。
【讨论】: