iOS 设置视图半透明而子控件不透明

转载:http://www.jianshu.com/p/abe815018b2a

让一个控件半透明,通常我们第一个想到的方法就是调整控件的alpha值。当然如果你的视图上如果有其他子控件就会发现这样的方法是可能达不到你的预期,否则你应该看不到这篇文章了。

对视图直接设置alpha属性的值会导致其子控件也变得半透明,而通常我们的需求是:背景半透明而其子控件不透明。

先说解决办法:

  • 1.用一张半透明的图片做背景。

这个方法当然可以达到要求,但是从编程初期前辈就教导我说在工程中尽量少加入资源,能不用图片的尽量不用图片(如纯色背景之类的)

  • 2.使用colorWithWhite:alpha:方法
    bgView.backgroundColor = [UIColor colorWithWhite:0.f alpha:0.5];
    

    这也是我之前使用比较多的方法,white后面的参数表示灰度,从0-1之间表示从黑到白的变化,alpha就是你想调整的透明度。由于我做的半透明背景基色基本非黑即白,这个方法基本也够用了。缺点就是不能设置其他颜色(彩色)的半透明

  • 3.使用colorWithRed:green:blue:alpha:方法

这其实是我重点想说的方法。为什么呢?

相信大家平时用代码给视图着色的时候,可能都用过类似
colorWithHexString:colorWithHexColor:这样的方法,即:对UIColor类进行扩展,将16进制(如:#ffffff)的颜色字符串作为参入传入,并返回该色值对应的UIColor类型的颜色

这一层的包装使我们(起码是我)对UIColor自带的方法colorWithRed:green:blue:alpha:既熟悉又陌生,熟悉是我们无数次调用这个扩展的方法来设置颜色,其本质都是在调用它,陌生可能是因为对它太过熟悉导致我几乎忘记它还有一个alpha参数可以让我们设置半透明的背景色。而且通过这种方法就可以达到让背景成为任何颜色的半透明而且其子控件不透明

当我发现可以用这个方法设置背景半透明而子控件不透明的时候,有点哭笑不得。那感觉就像是你突然发现你以为十分熟悉的室友竟然还有一项瞬间移动的技能。

所以我决定以后给我的UIColor扩展类增加一个方法:
colorWithHexColor:alpha:(怎么添加边笑边流泪的表情...)

  • 4. 在xib或者storyBoard里面对背景进行设置

如图:

通过对背景颜色设置图中的Opacity滑块调整透明度,同样可以达到设置背景半透明而子控件不透明的目的。

  • 5.使用colorWithAlphaComponent:方法

在博友的提醒下,发现还有一个方法,现在补充上来.
和前面说的几个设置背景色的方法不太一样的是,这是一个实例方法,一个UIColor的实例调用此方法后会返回一个带透明度的UIColor.使用方法如下:

UIColor *color = [UIColor blackColor];
bgView.backgroundColor = [color colorWithAlphaComponent:0.5];

经测试,将返回值设置给底层的背景颜色,也可以保证子控件不透明.

最后,这篇文章的目的主要是感慨一下(编程)生活中被忽略的小细节, 请自行脑补边笑边流泪的表情...

时间: 2024-08-02 07:01:24

iOS 设置视图半透明而子控件不透明的相关文章

iOS开发项目篇—43子控件的细节处理

iOS开发项目篇—43子控件的细节处理 一.升级UI 把之前的UI图片删除,换上新的图片(图片命名一致,规范)没有其他的影响. 删除之后,添加. 替换之后,做一次clear操作. 建议把沙盒中的包删除,删除之后再做一次clear操作. 二.调整转发(模块) 1.设置背景(使用提供的素材图片进行平铺) 为转发微博部分设置背景,考虑到这个部分整体上是一个UIView,可以尝试以下设置. 第一种尝试: 但是这样设置,因为图片是平铺的,所以整个背景会出现线条效果,影响显示,不可行. 第二种尝试: 注意:

IOS 读取xib里的子控件

interface ViewController () /**获取.plist数据*/ @property (nonatomic,strong) NSArray *aps; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //九宫格的总列数 int totalColumns=5; //1.1个格子的尺寸 CGFloat appW=50; CGFloat appH=60; //2.计算间隙

窗口使用半透明图片,控件不透明的方法

最近项目软件需要制作半透明窗口,但控件不能透明.窗口和控件都是自绘的.网上大部分例子都是直接设置窗口透明度实现,这样只能让整个窗口透明,达不到我们想要的效果.经研究发现,需要使用父子两个窗口配合制作,父窗口不能在OnPaint那里自绘,而是直接GetDC得到句柄自绘背景,子窗口负责自绘控件. 关键代码:父窗口 OnInitDialog() { m_dlg.Create(m_hWnd); m_dlg.ShowWindow(SW_SHOW); m_dlg.MoveWindow(&rct); HDC

iOS开发——实战技术OC篇&点击状态栏ScrollView(包括子控件)自动滚到顶部

点击状态栏ScrollView(包括子控件)自动滚到顶部 其实这种方式我们平时见的还是比较多的,而且适合用户的需求,所以就搬来琢磨了一下,感觉效果还不错 这里就直接将解决思路一一写出来不将代码分段展示了,在代码中我加了详细的注释objective-c的套路和swift基本一样,在最后会将Swift和objective-c的代码一起放上,如果需要直接解决问题的童鞋可以直接将代码拷贝到工程里即可 首先创建一个topWindow继承至NSObject,这里我们考虑将这个功能完全封装起来,所以所有的方法

IOS 自定义UITableViewCell 子控件无法接受到事件

该问题浪费了3个小时的时间 一 问题描述 自定义UITableViewCell,Cell 中有两个UIImageView 子控件,自控都需要实现双击,让图片全局展示. 二 错误代码 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    BZEffectImgViewCell *cell = [BZEffectImgViewCell ce

五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整个重绘这些FWinControl子控件.那么什么时候才整个重绘全部FWinControls呢?这时候,就不是一个单纯的WM_PAINT来解决控件重绘的问题了,而是这个TWinControl.UpdateShowing函数: procedure TWinControl.UpdateShowing; v

用mansard对cell的子控件设置约束,并且自动计算cell高度的问题,ios7警告

mansory设置cell子控件自上而下把cell的contentview撑开,就计算可以自动计算高度了,但是ios7会报下面的警告 Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the

ScrollView子控件高度设置无效

ScrollView子控件高度设置无效 简述 项目中引入了第三方的下拉刷新包PullToRefreshScrollView, 因为我之前布局未考虑下拉刷新功能.后来临时发现增加上去,发现.子控件的高度无法设置.无论怎么设置,一直显示不出来. 后来查阅API文档: 所以在你的ScrollView属性里加入这一句话即可: android:fillViewport="true" 版权声明:本文为博主原创文章,未经博主允许不得转载.(转载请注明出自 AllenCoder)

iOS使用xib文件创建一个组件为子控件,进行复用

有些情况下,我们发现有一些界面上的控件是可以复用的 如果每次都拷贝这些控件过去,就是比较麻烦.所以,就用一个xib文件,创建一个view,把要复用的控件,放在里面组成一个view,然后在其他的ViewController里面引用就行了. 这样会方便很多. 第一步:创建一个SingleViewApplication,命名为“xib作为子控件复用”,在项目里New File,选择Cocoa Touch Class,命名为"AAView",点击Next,如图1所示: 图 1 第二步:创建一个