【问题标题】:XCode iOS custom view colorXCode iOS 自定义视图颜色
【发布时间】:2014-08-07 21:13:43
【问题描述】:

我有一个 UIViewController,在主根视图中我创建了一个自定义类,在 drawRect 中我创建了一个渐变色图层并添加到它:

[self.layer insertSublayer:bgLayer atIndex:0];

我想使用此视图为我的所有视图设置相同的背景颜色。

现在,我(在情节提要中)添加了 5 个标签并在一个视图中组合在一起(编辑器 -> 嵌入 -> 视图)。

所以现在我创建了 UIView 的另一个子类,并且在绘制矩形中我有:

[self setBackgroundColor:[UIColor redColor]];

(现在我有简单的红色,以后我想有阴影,边框ecc)

因为我希望这个子视图(带有 5 个标签)是红色的(当然,背景必须保持渐变)。

当我运行应用程序时,我可以正确看到背景,但我设置为红色的视图显示为全黑。

如果在情节提要中我将背景更改为清除颜色(在应为红色的视图中),则 5 个标签会出现,并且背景与主视图相同。

我已经在“红色视图”的 drawRect 中放置了一个断点,这被调用了,但什么也没发生。

【问题讨论】:

    标签: ios objective-c storyboard uicolor


    【解决方案1】:

    我建议你看看Appearance Proxies。使用它们,您可以更轻松地做您想做的事情。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        ...
        [MyCustomView appearance].backgroundColor = [UIColor clearColor];
        ...
    }
    

    此外,您可能不应该在 drawRect 中添加子图层,尤其是当您的视图不移动或调整大小时。我通常只是将它们添加到-(void)awakeFromNib

    编辑:

    为了直接解决您的问题,我发现在自定义视图中创建渐变背景的最佳方法是覆盖 +(Class)layerClass 以提供渐变层。这将使您的自定义视图的基础层成为您返回的任何层类。通常,这可以是例如形状层(对于纯色)。在我们的例子中,我们需要一个 CAGradientLayer。然后在-(void)awakeFromNib 中,您可以设置渐变颜色,而无需处理子图层。

    我猜你最初的问题是你添加了一个渐变子层而没有设置开始和结束颜色,这将在你的背景颜色之上绘制为黑色。

    例子:

    @implementation MyCustomView
    
    + (Class)layerClass {
        return [CAGradientLayer class];
    }
    
    - (void)awakeFromNib {
        CAGradientLayer* gradientLayer = (CAGradientLayer*)self.layer;
        gradientLayer.locations = @[@0, @1];
        gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor greenColor].CGColor];
    }
    

    如果您需要更多详细信息,或者这不适合您,请告诉我。

    【讨论】:

    • 我是 ios 编程新手,UIAppareance 并不简单 :) 但是,我创建了自定义 UIView,并在其中设置了图层。现在,我如何使用它来告诉“将此自定义视图用于我的所有视图”。因为我想要所有视图的渐变背景。 (我已经在 awaweFromNib 中移动了设置层)
    • @Mistre83 如果您不想使用 UIAppearance 代理,我已经更新了我的答案,并提供了额外的建议。
    • 谢谢,我会试试这个解决方案。如果我有一个自定义视图,我每次需要时都需要在 Interface Builder 中使用它,或者,如果我从代码构建它,我将直接使用它。 Apple 接受 Apple Store Application 的这种行为还是拒绝它?
    • @Mistre83 Apple 完全可以接受,并且只使用公共 API。
    • 非常感谢,它工作得很好。我已将您的回复标记为正确。 +1 :)
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2019-03-08
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多