iOS 的 Tint Color 属性详解

iOS 开发的程序员肯定都对 tintColor 属性有一定的认识,但是对于新手 iOS 开发 人 员来说,在 APP 的界面设计中,对 tintColor 属性的使用可能还是有些陌生,今天我们就来 聊聊 tintColor 属性的一些具体使用。

tintColor iOS7以后,UIView新增的属性,这个属性定义了一个非默认的着色颜色值,其值的设置会影响到以视图为根视图的整个视图层次结构。tintColor属性在 iOS开发 中,主要运用于 app图标、导航栏、按钮等一些控件上,以获取一些有意思的视觉效果。

tintColor属性的声明如下: var tintColor:UIColor!

默认情况下,一个视图的tintColor是为 nil的,这意味着视图将使用父视图的tintcolor 值。当我们指定了一个视图的 tintColor后,这个色值会自动传播到视图层次结构(以当前视图为根视图)中所有的子视图上。如果系统在视图层次结构中没有找到一个非默认的tintColor值,则会使用系统定义的颜色值(蓝色,RGB值为[0,0.478431,1],我们可以在IB中看到这个颜色)。因此,这个值总是会返回一个颜色值,即我们没有指定它。

tintColor属性相关的还有个 tintAdjustmentMode属性,它是一个枚举值,定义了tintcolor 的调整模式。其声明如下:

vartintAdjustmentMode: UIViewTintAdjustmentMode 枚举 UIViewTintAdjustmentMode的定义如下:

enumUIViewTintAdjustmentMode : Int {

caseAutomatic

caseNormal

caseDimmed

颜色

}

//视图的着色调整模式与父视图一致
//视图的 tintColor属性返回完全未修改的视图着色颜色

//视图的 tintColor属性返回一个去饱和度的、变暗的视图着色

因此,当 tintAdjustmentMode属性设置为 Dimmed时,tintColor的颜色值会自动变暗。而如果我们在视图层次结构中没有找到默认值,则该值默认是 Normal


tintColor相关的还有一个 tintColorDidChange方法,其声明如下:

functintColorDidChange()

这个方法会在视图的tintColor tintAdjustmentMode属性改变时自动调用。另外,如果当前视图的父视图的 tintColor tintAdjustmentMode属性改变时,也会调用这个方法。我们可以在这个方法中根据需要去刷新我们的视图。

示例

接下来我们通过示例来看看tintColor的强大功能(这里是用 swift 开发语言来实现 的):

先来看看最终效果吧:

image

这个界面包含的元素主要有UIButton, UISlider,UIProgressView, UIStepper, UIImageView, ToolBar 和一个自定义的子视图 CustomView。接下来我们便来看看修改视图的 tintColor会对这些控件产生什么样的影响。

ViewController viewDidLoad方法中,我们做了如下设置:override funcviewDidLoad() {

super.viewDidLoad()println("\(self.view.tintAdjustmentMode.rawValue)") //输出:1

println("\(self.view.tintColor)")// 输出:UIDeviceRGBColorSpace0 0.478431 1 1

self.view.tintAdjustmentMode= .Normal self.dimTintSwitch?.on = false

//加载图片
var shinobiHead =UIImage(named: "shinobihead") // 设置渲染模式


shinobiHead =shinobiHead?.imageWithRenderingMode(.AlwaysTemplate)self.tintedImageView?.image = shinobiHeadself.tintedImageView?.contentMode = .ScaleAspectFit

}

首先,我们尝试打印默认的tintColor tintAdjustmentMode,分别输出了[UIDeviceRGBColorSpace0 0.478431 1 1]1,这是在我们没有对整个视图层次结构设置任何 tint color相关的值的情况下的输出。可以看到,虽然我们没有设置tintColor,但它仍然返回了系统的默认值;而 tintAdjustmentMode则默认返回 Normal的原始值。

接下来,我们显式设置tintAdjustmentMode的值为 Normal,同时设置UIImageView的图片及渲染模式。

当我们点击”ChangeColor”按钮时,会执行以下的事件处理方法:

@IBAction funcchangeColorHandler(sender: AnyObject) {
let hue = CGFloat(arc4random() % 256) / 256.0
let saturation = CGFloat(arc4random() % 128) / 256.0 + 0.5
let brightness = CGFloat(arc4random() % 128) / 256.0 + 0.5
let color = UIColor(hue: hue, saturation: saturation, brightness:brightness, alpha: 1.0) self.view.tintColor = color
updateViewConstraints()

}
private func updateProgressViewTint() {

self.progressView?.progressTintColor= self.view.tintColor }

这段代码主要是随机生成一个颜色值,并赋值给 self.view tintColor属性,同时去 更新进度条的tintColor值。

注:有些控件的特定组成部件的tintcolor 由特定的属性控制,例如进度就有 2 tintcolor:一个用于进度条本身,另一个用于背景。

可以看到,我们在示例中并有没手动去设置UIButton, UISlider,UIStepper, UIImageView, ToolBar 等子视图的颜色值,但随着 self.view tintColor属性颜色值的变化,这些控件的外观也同时跟着改变。也就是说 self.view tintColor属性颜色值的变化, 影响到了以self.view为根视图的整个视图层次结果中所有子视图的外观。

在界面中还有个 UISwitch,这个是用来开启关闭dimtint 的功能,其对应处理方法如下:

@IBAction funcdimTimtHandler(sender: AnyObject) { if let isOn =self.dimTintSwitch?.on {

self.view.tintAdjustmentMode= isOn ? .Dimmed : .Normal }

updateViewConstraints()}

tintAdjustmentMode设置 Dimmed时,其实际的效果是整个色值都变暗。另外,我们在子视图 CustomView中重写了 tintColorDidChange方法,以监听

tintColor的变化,以更新我们的自定义视图,其实现如下:

override functintColorDidChange() { tintColorLabel.textColor = self.tintColortintColorBlock.backgroundColor = self.tintColor

}

所以方框和”Tint colorlabel”颜色是跟着子视图的tintColor来变化的,而子视图的 tintColor又是继承自父视图的。

在上面这个示例中,比较有意思的是还是对图片的处理。对图像的处理比较简单粗暴,对一个像素而言,如果它的 alpha值为 1的话,就将它的颜色设置为tintcolor;如果不为
1的话,则设置为透明的。示例中的忍者头像就是这么处理的。不过我们需要设置图片的imageWithRenderingMode属性为 AlwaysTemplate,这样渲染图片时会将其渲染为一个模板而忽略它的颜色信息,如代码所示:

varshinobiHead = UIImage(named: "shinobihead")
//
设置渲染模式
shinobiHead =shinobiHead?.imageWithRenderingMode(.AlwaysTemplate)

小结
如果我们想指定整个
App tintcolor,则可以通过设置window tintcolor。这样同

一个 window下的所有子视图都会继承此tintcolor
当弹出一个
alert或者 action sheet时,iOS7会自动将后面视图的 tint color变暗。此

时,我们可以在自定义视图中重写tintColorDidChange方法来执行我们想要的操作。

有些复杂控件,可以有多个tintcolor,不同的tintcolor 控件不同的部分。如上面提到的 UIProgressView,又如navigation bars,tab bars, toolbars, search bars, scope bars 等,这些控件的背景着色颜色可以使用 barTintColor属性来处理。

以上就是 iOS7 Tint Color属性的一些用法,可能整理的还不是很全面,但是在我们日常的 app 界面开发中对这个属性的基本使用还是都有概括到,希望能对正在研究这个属性的你有所帮助。

你可能感兴趣的:(iOS 的 Tint Color 属性详解)