我一直在研究如何为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]];
我知道代码并不多,而且它允许对外观进行更精细的控制(毕竟只有坚实的橙色可能不是最好的外观!),但它留下了我不喜欢的东西。理解,如果我不明白,那么可能存在不可预知的陷阱,所以我对此的疑问是:
正如您可以从问题中看出的那样,我是iOS开发的新手;我的背景是服务器端C ++,我正在使用Objective-C,因为它更接近我的舒适区,而Swift似乎也是目前的移动目标。
答案 0 :(得分:0)
我对于Objective-c开发也相对较新,但让我试着帮助你。
[[UIView appearance] setBackgroundColor:[UIColor orangeColor]];
这导致整个屏幕变为橙色,因为您告诉屏幕上的每个视图都将其背景颜色设置为橙色。屏幕上的所有内容都是UIView
的子类 - 这意味着UITableView
或UIScrollView
等等。这就是为什么在调用{{1}时需要更细粒度的原因和其他相关方法。
setBackgroundColor
至于[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];
,就是它的设计方式。根据文档:UINavigationBar
是barTintColor
直接设置tint color to apply to the navigation bar background.
不起作用。这是元素的设计方式。也许其他人可以给出更详细的推理原因。
另外,要更改全局backgroundColor
我发现的最简单方法是子类化,并根据需要覆盖UITableViewCell
setHighlighted
和setSelected
。
如果要覆盖突出显示颜色以及所选颜色(和支持动画),我之前所做的是:
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。
或
[[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
。
希望这有帮助。