更改UIPickerView的背景

18

我想要更改UIPickerView的边框颜色。我没有看到UIPickerView的色调属性。有什么方法可以实现这个功能吗?或者说有没有其他解决方案?

谢谢。


您可能会发现这篇文章有用:http://aralbalkan.com/2985 - cs95
9个回答

27

您还可以遮蔽组件。通过一些操作,您可以使用以下代码获取组件的大小并将其裁剪:

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>

5
在Xcode 4+中,你需要使用frame: [mask setFrame: CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)];但除此之外,它非常有用,而且不需要使用图像叠加。 - Shaun
1
有趣。这个几乎可以工作。看起来它没有剪裁所有的右侧。http://screencast.com/t/MVyxOIj0mGRT ... 编辑:从picker.bounds计算插页更有意义吗? - user246672
像 'CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)' 这样的代码非常糟糕。 - Dmitry
@Altaveron 因为它是硬编码的吗?创建图像并用它覆盖组件更糟糕。也许您可以提供一个改进的解决方案? - Quxflux
是的,我已经在UIPickerView下添加了UIView,并使用相同的框架。同时,也可以使用相同的框架创建一个遮罩。 - Dmitry

18

如果你只是想找一个解决方法,可以在模拟器中截取屏幕截图,在Photoshop中打开并裁剪到UIPickerView区域,使中心透明,应用所需的色调,将该图像添加到你的项目中,并作为UIImageView添加到UIPickerView上方。


谢谢。我们没有其他方法可以改变色调吗? - lostInTransit
我认为背景只是一张图片,所以即使您能在子视图中找到该元素,它也不会被着色。 - Ed Marty
如何更改UIPickerView的整个背景颜色?我尝试使用方法“-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view”自定义视图,虽然行视图已更新,但选择器左侧内容仍显示原始灰色...该怎么解决? 谢谢... - iXcoder

14

我的UIPickerView有3个部分,没有选择指示器。

这使得它有11个子视图。[[picker subviews] count]

隐藏第一个和最后一个子视图可以完全去除背景。

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];

隐藏每三个其他子视图(索引为1、4和7)会隐藏组件的不透明背景。这样可以获得相当不错的效果,我可以根据自己的需要进行美化。

希望能对某些人有所帮助 :)


聪明。虽然苹果可能不喜欢它。 - Moshe
6
直到它完全加载之前,选择器将没有子视图。如果您尝试在viewDidLoad或viewWillAppear中执行此操作,则无法正常工作。但是,我将我的代码移动到UIPickerView协议方法之一中,然后它就可以工作了。- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - Matt Hudson
我的朋友做了一个有自定义选择器视图的应用程序,但是苹果公司拒绝了它。现在我很困惑这是否是正确的方式... 请告诉我!! - TheTiger
我们是否得到了这是否合法的裁决? - Grymjack
已在许多发布的应用程序上完成了此操作。这并不是绝对的保证,但看起来还不错。 - adam
显示剩余2条评论

5
选择器在完全加载之前不会拥有子视图。如果您尝试执行以下操作:
[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];

viewDidLoadviewWillAppear不会生效。然而,我把我的代码移到了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];
}

你可以通过子类化选择器来更高效地完成这个任务,但我更倾向于避免子类化。另外,可能很明显,如果你的选择器里没有任何项目,上述代码将不会删除子视图。

4

这是一个现代化、像素完美的版本,包含了@Lukas的答案,因为有些问题永远不会过时:

#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;

这个答案适用于任何大小的选择器,因为图层尺寸是即时计算的。

enter image description here


2
使用GitHub上提供的IXPickerOverlayView(该存储库包含使用此类的示例)完全替换背景图像,您可以更改背景颜色。请注意,您必须自己从头开始绘制(矩形)背景,但与此处提到的任何解决方法不同,此方法是完全动态的:即使在运行时更改选择器轮数和大小(如当您更改系统语言环境设置时UIDatePicker会做的那样),控件也将正确显示。一旦您拥有了背景图像,使用IXPickerOverlayView就像在Picker视图上方添加一个IXPickerOverlayView实例并分配hostPickerView属性一样简单。

1
实际上要更正您,您实际上可以将.png放在UIPickerview上方并仍然使用Picker View,只需确保中间是透明的,否则您将看不到行。

0
只需在您的一个UIPickerView方法中添加这一行即可:
[[[MyPicker subviews] objectAtIndex:4] setBackgroundColor: [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]];

为了提高您的回答质量,请说明您的帖子如何/为什么解决了问题。 - Mick MacCallum

0
你可以做以下操作:
通过向导或代码设置选择器视图的背景颜色,如下所示:
Picker1.backgroundColor = [UIColor someColor];// clearColor for transparent

为选择器视图的子视图0、1和3设置alpha值。(不知道为什么会有子视图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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接