【问题标题】:Change UIPickerView background更改 UIPickerView 背景
【发布时间】:2010-11-01 05:03:40
【问题描述】:

我想更改 UIPickerView 的边框颜色。我没有看到 UIPickerView 的 tint 属性。有什么办法可以做到吗?还是解决方法?

谢谢。

【问题讨论】:

标签: iphone uipickerview


【解决方案1】:

如果您只是想要一种解决方法,请在模拟器中截屏,在 photoshop 中打开它,将其裁剪到 UIPickerView 区域,使中心透明,应用您想要的任何色调,将该图像添加到您的项目中,然后将其作为 UIImageView 添加到 UIPickerView 之上。

【讨论】:

  • 谢谢。我们没有其他办法可以改变色调吗?
  • 我相信无论如何背景只是一张图片,所以即使您能够在子视图中找到该元素,它也可能无法着色。
  • 如何更改 UIPickerView 的整个背景颜色?我尝试使用方法自定义视图'- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view "虽然行视图已更新但左侧选择器的内容仍然显示原始灰色...如何解决?谢谢...
【解决方案2】:

只需将此行添加到您的 UIPickerView 方法之一:

[[[MyPicker subviews] objectAtIndex:4] setBackgroundColor: [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]];

【讨论】:

  • 为了提高您的回答质量,请说明您的帖子解决问题的方式/原因。
【解决方案3】:

您可以执行以下操作:

通过向导或代码设置选择器视图背景颜色,如下所示:

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

【讨论】:

    【解决方案4】:

    这是带有@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 图层尺寸是即时计算的。

                                                                  

    【讨论】:

      【解决方案5】:

      您也可以屏蔽该组件。稍微摆弄一下,您可以获取组件的大小并使用以下代码将其剪切出来:

      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>
      

      【讨论】:

      • 在 XCode 4+ 中,您需要框架:[mask setFrame: CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)];,但在其他方面非常有用,不需要使用图像叠加。
      • 有趣。这几乎有效。看起来它没有剪裁所有右侧。 screencast.com/t/MVyxOIj0mGRT ... 编辑:从 picker.bounds 计算插入不是更有意义吗?
      • 'CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)' 这样的代码非常糟糕。
      • @Altaveron 因为它是硬编码的?创建图像并用它覆盖组件更糟糕。也许您可以提供改进的解决方案?
      • 是的,我在 UIPickerView 下添加了 UIView 同框。也可以使用相同的框架创建蒙版。
      【解决方案6】:

      您可以通过使用 IXPickerOverlayView available on GitHub 将背景图像完全替换为您选择的背景图像来更改背景颜色(repo 包含使用此类的图解示例)。

      请注意,您必须自己从头开始绘制(矩形)背景,但与此处提到的任何解决方法不同,此方法是完全动态的:即使您更改选择轮的数量及其运行时的大小(就像 UIDatePicker 在您更改系统区域设置时所做的那样)。

      获得背景图片后,使用 IXPickerOverlayView 就像在 Picker 视图顶部添加 IXPickerOverlayView 实例并分配 hostPickerView 属性一样简单。

      【讨论】:

        【解决方案7】:

        选择器在完全加载之前不会有子视图。如果您尝试这样做:

        [(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];
        }
        

        您可能可以将选择器子类化以更有效地执行此操作,但我更愿意避免子类化。

        哦,同样,这可能很明显,但如果你的选择器中没有任何项目,上面的代码不会删除子视图。

        【讨论】:

          【解决方案8】:

          我的 UIPickerView 有 3 个组件。并且没有选择指示器。

          这给了它 11 个子视图。 [[picker subviews] count]

          隐藏第一个和最后一个子视图会完全移除背景。

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

          隐藏每隔三个子视图(索引 1、4 和 7)隐藏组件上的不透明背景。效果非常好,我可以随心所欲地剥皮。

          希望对某人有所帮助:)

          【讨论】:

          • 聪明。虽然 Apple 可能不喜欢它。
          • Apple 很可能不知道有什么不同,它没有使用他们的分析器会标记的任何私有 API。
          • 选择器在完全加载之前不会有子视图。如果您尝试在 viewDidLoad 或 viewWillAppear 中执行此操作,它将不起作用。但是,我将我的移动到 UIPickerView 协议方法之一并且它起作用了。- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { .
          • 我的朋友制作了一个具有自定义选择器视图的应用程序,苹果拒绝了它......现在我很困惑这是不是正确的方法......请告诉我!!
          • 我们是否得到了关于这是否合法的裁决?
          【解决方案9】:

          实际上纠正你,你实际上可以在 UIPickerview 上放一个 .png 并仍然使用 Picker 视图,只要确保中间是透明的,否则你将看不到行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-05
            • 2013-03-25
            • 2013-12-17
            • 2011-10-07
            相关资源
            最近更新 更多