Tint Color的理解和APP简单的主题化

本文深入探讨了iOS7中UIView的tintColor属性,解释了其用途和影响,通过实例展示了如何利用tintColor来设置颜色主题、控制用户界面元素的外观,并介绍了与之相关的renderingMode属性及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自从iOS7,UIView有了一个新的属性tintColor,它是用来在视觉上说明屏幕上哪些控件是活跃的或者有相关的活动。例如bar button items和tab bar items默认使用tintColor。如果一个view没有显示地指定tintColor,它将继承父视图的tintColor,因此在整个视图层次结构中将有一个连锁反应。最简单的情况是你可以通过一行代码来给整个APP指定一个颜色主题:

[[UIApplication sharedApplication] keyWindow].tintColor = [UIColor orangeColor];
因为UIWindow继承自UIView,所以我们可以指定一个tintColor,然后应用内的所有子视图将继承这个颜色。为了证明tintColor对各种用户界面元素的影响,接下来将举一个tabbar应用的例子,第一个页面有6个按钮,每个按钮会改变UIWindow的tintColor为一个颜色。第二个页面将展示tintColor对不用界面元素的影响。左上角的 red按钮会设置UIView的tintColor,右上角的blue按钮会设置UIButton自身和tabbar的tintColor。最后UISegmentedControl将控制整个苹果图标的外观。当我们按下第一页的按钮的时候,UIButton的文本就会自动适应按钮指定的颜色。相似的,tabbar

上的图标和文本也会适应新的颜色。

相似地,我们可以设置指定视图的tintColor,假设一个有tabbar应用设置的UIWindow的tintColor为蓝色,为了区分出tab和主界面,我们可以设定主界面的tintColor为红色。iOS7之前实现要用很多行颜色设定的代码,但是现在只需要简单的一行代码改变主视图的tintColor来设定主视图自身和它所有子视图的颜色。

self.view.tintColor = [UIColor redColor];

设置按钮的tintColor会改变按钮上文本的颜色,但是不会改变按钮兄弟视图和父视图的颜色。

myButton.tintColor = [UIColor blueColor];

iOS7还能够在alert或者action sheet出现的时候去色或者“暗”着色。这向用户表明这些控件当前不可用。按下第二个页面的步进控件就会看到这个效果,如下图:

iOS7中UIImage添加了一个新的属性renderingMode,可以和tintColor结合着使用,renderingMode有三个选项,第一个是UIImageRenderingModeAutomatic,正如字面的意思自动根据UIImage的使用场景和tintColor来填充颜色,例如UIImageView不会根据tintColor渲染UIImage,而UIBarButtonItem会根据tintColor自动填充UIImage。第二个选项是UIImageRenderingModeAlwaysOriginal,UIImage总是会根据自身的颜色渲染图像。第三个是UIImageRenderingModeAlwaysTemplate,这个模式将会用tintColor渲染所有UIImage不透明的地方,也就是说设置为这个属性的UIImage被当做了一个模板,如果你希望图像的哪些部分不用tintColor渲染的话,你需要把哪些部分设置成完全透明的。在例子中的第二个界面中的Segmented控件展示了这个功能。

正如我们看到的,tintColor和renderingMode两个属性给了我们很用的功能,但是使用tintColor有几件事情我们需要注意,第一是tintColor不支持UIAppearance。这是非常不幸的,因为如果支持的话,我们可能通过几行代码就会改变整个APP的颜色,例如我们想要每一个UIButton以一个特殊颜色凸现出来,我们不得不单独的设置每一个按钮的tintColor。第二当获取一个UIView的tintColor的时候,总是返回一个有效的颜色。这是因为如果视图的tintColor是nil就会返回父视图的tintColor。如果所有的视图包括UIWindow的tintColor都是nil的话,UIWindow总会返回一个默认的值,这个值是RGB(0,122,255).第三如果你自定义了一个视图并且用到了tintColor,你应该实现tintColorDidChange方法以便于我们可以在必要的时候更新视图的渲染。

- (void)tintColorDidChange

这个方法的默认实现是执行标准的更新。例如你子类化了一个UIImageView并且image的renderingImage设置为UIImageRenderingModeAlwaysTemplate或者子类了UIButton,当tintColor更新的时候自动重绘。覆盖这个方法的目的是为了当tintColor改变的时候自定义一些行为。例如我们可以子类一个UIView来根据用户的选择改变颜色主题。例子中的颜色主题是橘色和黑色两个选项,当用户选择一个选项的时候,我们可以自定义UIView和设置tintColor为橙色,接下来可以设置子视图的tintColor为黑色。在iOS6中也有tintColor属性但是这个属性是用于navigation bars、tab bars、toolbars、search bars和scope bar的北京颜色。在iOS7中我们要设置这些控件的背景颜色我们应该使用barTintColor。

tintColor十分有用并且非常容易使用,通过这个属性用户就可以通过观看视图来判断当前哪些控件是活跃的并且有相关的活动。

<?xml version="1.0" encoding="utf-8"?> <com.android.keyguard.AlphaOptimizedImageButton android:layout_gravity=“center” android:id=“@id/ringer_icon” android:background=“@drawable/rounded_ripple” android:padding=“@dimen/volume_dialog_ringer_icon_padding” android:layout_width=“match_parent” android:layout_height=“match_parent” android:scaleType=“fitCenter” android:tint=“@color/accent_tint_color_selector” android:soundEffectsEnabled=“false” style=“@style/VolumeButtons” /> <com.android.keyguard.AlphaOptimizedImageButton android:layout_gravity=“center” android:id=“@id/settings” android:background=“@drawable/ripple_drawable_20dp” android:layout_width=“@dimen/volume_dialog_tap_target_size” android:layout_height=“@dimen/volume_dialog_tap_target_size” android:src=“@drawable/ic_tune_black_16dp” android:tint=“?android:attr/textColorSecondary” android:soundEffectsEnabled=“false” android:contentDescription=“@string/accessibility_volume_settings” /> <com.android.systemui.volume.CaptionsToggleImageButton android:layout_gravity=“center” android:id=“@id/odi_captions_icon” android:background=“@drawable/rounded_ripple” android:layout_width=“match_parent” android:layout_height=“match_parent” android:src=“@drawable/ic_volume_odi_captions_disabled” android:tint=“@color/caption_tint_color_selector” android:soundEffectsEnabled=“false” app:optedOut=“false” style=“@style/VolumeButtons” /> 帮我修改安卓11的。volume_dialog.xml的背景为半透明
07-14
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 今天给大家分享一个关于C#自定义字符串替换方法的实例,希望能对大家有所帮助。具体介绍如下: 之前我遇到了一个算法题,题目要求将一个字符串中的某些片段替换为指定的新字符串片段。例如,对于源字符串“abcdeabcdfbcdefg”,需要将其中的“cde”替换为“12345”,最终得到的结果字符串是“ab12345abcdfb12345fg”,即从“abcdeabcdfbcdefg”变为“ab12345abcdfb12345fg”。 经过分析,我发现不能直接使用C#自带的string.Replace方法来实现这个功能。于是,我决定自定义一个方法来完成这个任务。这个方法的参数包括:原始字符串originalString、需要被替换的字符串片段strToBeReplaced以及用于替换的新字符串片段newString。 在实现过程中,我首先遍历原始字符串,查找需要被替换的字符串片段strToBeReplaced出现的位置。找到后,就将其替换为新字符串片段newString。需要注意的是,在替换过程中,要确保替换操作不会影响后续的查找替换,避免遗漏或重复替换的情况发生。 以下是实现代码的大概逻辑: 初始一个空的字符串result,用于存储最终替换后的结果。 使用IndexOf方法在原始字符串中查找strToBeReplaced的位置。 如果找到了,就将originalString中从开头到strToBeReplaced出现位置之前的部分,以及newString拼接到result中,然后将originalString的查找范围更新为strToBeReplaced之后的部分。 如果没有找到,就直接将剩余的originalString拼接到result中。 重复上述步骤,直到originalStr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值