iOS应用程序的配色方案 - UIView和UIAppearance - 设置背景颜色

时间:2015-07-19 15:59:48

标签: ios objective-c uitableview

我一直在研究如何为iOS应用程序创建配色方案。

开始使用故事板并手动设置每个组件的背景颜色,我很快意识到,虽然对于玩具应用程序来说,它很好,但对于任何更复杂的东西,它既繁琐又耗时 - 特别是如果你想在将来再次改变所有颜色。

这导致我找到UIAppearance协议,我认为,作为一个起点,如何做这样的事情:

[[UIView appearance] setBackgroundColor:[UIColor orangeColor]];

我正在尝试使用Xcode 6并使用Master-Detail App Template(Objective-C)。结果不是我的预期;我希望应用程序看起来和以前一样,但是背景为橙色。我实际得到的是整个应用程序显示为橙色的单个全屏矩形,无法查看UI的实际元素。它实际上看起来前景色和背景色都被设置为橙色而没有区别(我会发布我所看到的图像,但我目前没有足够的声誉)。我也尝试使用setTintColor,但是这个影片似乎唯一影响的是UITableView'编辑'并添加' +'文本设置为橙色的按钮。

我能够基本上得到预期的'通过设置以下结果(下面代码片段中的DetailViewUIAppearanceTest是UIView的未修改子类,我将其设置为用于详细视图):

[[UITableView appearance] setBackgroundColor:[UIColor orangeColor]];
[[UITableViewCell appearance] setBackgroundColor:[UIColor orangeColor]];
[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];
[[DetailViewUIAppearanceTest appearance] setBackgroundColor:[UIColor orangeColor]];
[[UILabel appearance] setBackgroundColor:[UIColor orangeColor]];

我知道代码并不多,而且它允许对外观进行更精细的控制(毕竟只有坚实的橙色可能不是最好的外观!),但它留下了我不喜欢的东西。理解,如果我不明白,那么可能存在不可预知的陷阱,所以我对此的疑问是:

  1. 为什么不简单地设置UIView的背景颜色实际设置所有视图的背景颜色(而不是使前景和背景相同)?
  2. 对于UINavigationBar,setBackgroundColor:似乎没有效果,只有setBarTintColor:有预期的结果。这种行为似乎并不一致;有谁知道为什么会这样?
  3. 奖金问题:是否有任何方法可以设置所选UITableViewCell的全班级背景颜色?我遇到的唯一方法是实例属性" selectedBackgroundView',一个选项是将其子类化并在指定的初始化器中设置给定的颜色,但是有更好的方法吗? / LI>

    正如您可以从问题中看出的那样,我是iOS开发的新手;我的背景是服务器端C ++,我正在使用Objective-C,因为它更接近我的舒适区,而Swift似乎也是目前的移动目标。

1 个答案:

答案 0 :(得分:0)

我对于Objective-c开发也相对较新,但让我试着帮助你。

[[UIView appearance] setBackgroundColor:[UIColor orangeColor]];

这导致整个屏幕变为橙色,因为您告诉屏幕上的每个视图都将其背景颜色设置为橙色。屏幕上的所有内容都是UIView的子类 - 这意味着UITableViewUIScrollView等等。这就是为什么在调用{{1}时需要更细粒度的原因和其他相关方法。

setBackgroundColor

至于[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]]; ,就是它的设计方式。根据文档:UINavigationBarbarTintColor直接设置tint color to apply to the navigation bar background.不起作用。这是元素的设计方式。也许其他人可以给出更详细的推理原因。

另外,要更改全局backgroundColor我发现的最简单方法是子类化,并根据需要覆盖UITableViewCell setHighlightedsetSelected

如果要覆盖突出显示颜色以及所选颜色(和支持动画),我之前所做的是:

selectedBackgroundView

如果您不想继承- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { [super setHighlighted:highlighted animated:animated]; NSTimeInterval duration = animated ? .25f : 0.f; if (highlighted) { [self animateBackgroundTo:[UIColor orangeColor] duration:duration]; } else { [self animateBackgroundTo:[UIColor whiteColor] duration:duration]; } } - (void)animateBackgroundTo:(UIColor *)backgroundColor duration:(NSTimeInterval)duration { [UIView animateKeyframesWithDuration:duration delay:0 options:UIViewKeyframeAnimationOptionAllowUserInteraction animations:^{ self.backgroundColor = backgroundColor; } completion:nil]; } ,并且只想更改其UITableViewCell,则可以使用backgroundColor,这样会更改UIAppearance backgroundColor的{​​{1}}子视图:

contentView

您可以使用此调用全局更改任何元素。它使您可以进一步细化控制要更改的元素。例如

UITableViewCell

仅在包含在[[UIView appearanceWhenContainedIn:[UITableViewCell class], nil] setBackgroundColor:[UIColor orangeColor]]; s。

中时更改条形按钮项目的tintColor

[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setTintColor:[UIColor orangeColor]];

将更改UIToolBar s中包含的条形按钮项的字体。

编辑: 在为您的应用设置主题时,[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setTitleTextAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:16.f]} forState:UIControlStateNormal]; 属性非常方便。您可以在任何视图中使用它(它从UIToolBar的主视图向下传递到视图层次结构中)以设置任何元素的颜色。

例如,假设您有一个自定义tintColor,您希望其中一个标签是您的应用所使用的任何色彩。所以你像这样覆盖UIViewController

UITableViewCell

然后当您进入tintColorDidChange

- (void)tintColorDidChange
{
    [self.label setTextColor:self.tintColor];
}

奇怪的是,你的细胞现在会有橙色标签! (您需要通过调用UIViewController或类似的方式重新绘制单元格)

至于self.view.tintColor = [UIColor orangeColor]; 仅更改reloadData s。更改setTintColor上的UIBarButtonItem也会更改所有子视图的tintColor,这意味着在这种情况下,UINavigationBar上的tintColor会发生变化,用作标题tintColor

希望这有帮助。