修改UISearchBar背景
UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. 而IB中没有直接操作背景的属性,在此我总结了几个方法去修改它。
1. 只显示UITextField.采用了layer mask.代码如下:
- //first make sure you include core animation so that the compiler will know about your view's layer
- #import <QuartzCore/QuartzCore.h>
- //now make a mask. this is basically just a solid colored shape. When you apply the mask, anywhere where the color is solid will become transparent in your view. i used the excellent Opacity (http://likethought.com/opacity/) to generate this code, but you can do it any way you'd like
- @interface SearchMaskLayer : CALayer {
- }
- @end
- @implementation SearchMaskLayer
- - (void)drawInContext:(CGContextRef)context
- {
- CGRect imageBounds = CGRectMake(0, 0, 310, 34);
- CGRect bounds = imageBounds;
- CGFloat alignStroke;
- CGFloat resolution;
- CGMutablePathRef path;
- CGPoint point;
- CGPoint controlPoint1;
- CGPoint controlPoint2;
- UIColor *color;
- resolution = 0.5 * (bounds.size.width / imageBounds.size.width + bounds.size.height / imageBounds.size.height);
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, bounds.origin.x, bounds.origin.y);
- CGContextScaleCTM(context, (bounds.size.width / imageBounds.size.width), (bounds.size.height / imageBounds.size.height));
- // Layer 1
- alignStroke = 0.0;
- path = CGPathCreateMutable();
- point = CGPointMake(295.0, 32.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- CGPathMoveToPoint(path, NULL, point.x, point.y);
- point = CGPointMake(310.0, 17.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- controlPoint1 = CGPointMake(303.229, 32.0);
- controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution;
- controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution;
- controlPoint2 = CGPointMake(310.0, 25.229);
- controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution;
- controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution;
- CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
- point = CGPointMake(310.0, 17.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- CGPathAddLineToPoint(path, NULL, point.x, point.y);
- point = CGPointMake(295.0, 2.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- controlPoint1 = CGPointMake(310.0, 8.771);
- controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution;
- controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution;
- controlPoint2 = CGPointMake(303.229, 2.0);
- controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution;
- controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution;
- CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
- point = CGPointMake(15.0, 2.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- CGPathAddLineToPoint(path, NULL, point.x, point.y);
- point = CGPointMake(0.0, 17.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- controlPoint1 = CGPointMake(6.771, 2.0);
- controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution;
- controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution;
- controlPoint2 = CGPointMake(0.0, 8.771);
- controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution;
- controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution;
- CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
- point = CGPointMake(0.0, 17.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- CGPathAddLineToPoint(path, NULL, point.x, point.y);
- point = CGPointMake(15.0, 32.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- controlPoint1 = CGPointMake(0.0, 25.229);
- controlPoint1.x = (round(resolution * controlPoint1.x + alignStroke) - alignStroke) / resolution;
- controlPoint1.y = (round(resolution * controlPoint1.y + alignStroke) - alignStroke) / resolution;
- controlPoint2 = CGPointMake(6.771, 32.0);
- controlPoint2.x = (round(resolution * controlPoint2.x + alignStroke) - alignStroke) / resolution;
- controlPoint2.y = (round(resolution * controlPoint2.y + alignStroke) - alignStroke) / resolution;
- CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
- point = CGPointMake(295.0, 32.0);
- point.x = (round(resolution * point.x + alignStroke) - alignStroke) / resolution;
- point.y = (round(resolution * point.y + alignStroke) - alignStroke) / resolution;
- CGPathAddLineToPoint(path, NULL, point.x, point.y);
- CGPathCloseSubpath(path);
- color = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
- [color setFill];
- CGContextAddPath(context, path);
- CGContextFillPath(context);
- CGPathRelease(path);
- }
- 然后在你的controller中应用这个mask layer到你的UISearchBar
- - (void)viewDidLoad {
- [super viewDidLoad];
- SearchMaskLayer *maskLayer = [[SearchMaskLayer alloc] init];
- [maskLayer setFrame:CGRectMake(0, 0, 310, 34)];
- [maskLayer setPosition:CGPointMake(162,21)];
- [maskLayer setNeedsDisplay];
- [self.searchBar.layer setNeedsDisplay];
- [self.searchBar.layer setMask:maskLayer];
- [maskLayer release];
- }
2. 隐藏背景。非官方的方法。
- for (UIView *subview in searchBar.subviews) {
- if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
- [subview removeFromSuperview];
- break;
- }
- }
3. 改变UISearchBar外观。 你可以子类化或category UISearchBar,然后实现两个方法,见代码。
- - (void)drawRect:(CGRect)rect {
- // UIImage *image = [UIImage imageNamed: @"background.png"];
- // [image drawInRect:rect];
- }
- - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
- UIImage *img = [UIImage imageNamed: @"background.png"];
- UIImageView *v = [[[UIImageView alloc] initWithFrame:CGRectZero] autorelease];
- [v setImage:img];
- v.bounds = CGRectMake(0, 0, img.size.width, img.size.height);
- NSLog([NSString stringWithFormat:@"%f:%f",img.size.width, img.size.height]);
- NSArray *subs = self.subviews;
- for (int i = 0; i < [subs count]; i++) {
- id subv = [self.subviews objectAtIndex:i];
- if ([subv isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
- {
- CGRect viewRect = [subv frame];
- [v setFrame:viewRect];
- [self insertSubview:v atIndex:i];
- }
- }
- [v setNeedsDisplay];
- [v setNeedsLayout];
- }
UISearchBar也是一个UIView,所以你可以像对待UIView一样对待它。
修改UISearchBar背景的更多相关文章
- 修改UISearchBar背景颜色
UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. 要IB中没有直接操作背景的属性.方法一:是直接将 UISearc ...
- 修改 UISearchBar cancelButton 样式
今天收到个问题,老大让我修改UISearchBar cancelButton的样式本来以为很简单的一个活,没想到让我长知识了. 开始在网上搜到的方法和我想象的一样,通过遍历Subviews获得butt ...
- jquery入门 修改网页背景颜色
我们在浏览一些网站,尤其是一些小说网站的时候,都会有修改页面背景颜色的地方,这个功能使用jquery很容易实现. 效果图: show you code: <!doctype html> & ...
- 修改UISearchBar的背景颜色
当你看到这篇博客你就已经发现了用_searchBar.backgroundColor = [UIColor clearColor];来设置UISearchBar的颜色完全没有效果: 并且,有些方法是想 ...
- ubuntu修改grub背景
grub背景由/etc/grub.d/05_debian_theme定义,修改图片只需要将图片文件放到/boot/grub,d/下即可, 修改颜色只需编辑/boot/grub.d/grub.cfg
- Confluence 6 CSS 指南:修改顶部背景
Confluence 默认页面的顶部是有关站点的菜单连接,在这里定义了 快速连接, 浏览菜单,用户菜单和快速查找输入框.在这个示例中,我们将会尝试修改顶部的菜单部分的背景和一些自定义的图片. 创建一个 ...
- android 开发 修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)
1.打开values下的styles.xml 发现有以下代码: <resources> <!-- Base application theme. --> <style n ...
- 【BIRT】修改主题背景颜色
下图是BIRT默认的颜色配置,为了跟系统颜色格局相一致,此处需要对颜色进行修改; 下面简单介绍了如何修改不同位置的背景颜色 对应文件地址均在目录:../webcontent/birt/styles下 ...
- 【VS开发】修改窗口背景颜色大全
如何修改frame窗口的背景颜色? MDI窗口的客户区是由frame窗口拥有的另一个窗口覆盖的.为了改变frame窗口背景的颜色,只需要这个客户区的背景颜色就可以了.你必须自己处理WM_ERASEB ...
随机推荐
- 通过inputSplit分片size控制map数目
前言:在具体执行Hadoop程序的时候,我们要根据不同的情况来设置Map的个数.除了设置固定的每个节点上可运行的最大map个数外,我们还需要控制真正执行Map操作的任务个数. 1.如何控制实际运行的m ...
- 从0开始学习 GitHub 系列之「06.团队合作利器 Branch」
Git 相比于 SVN 最强大的一个地方就在于「分支」,Git 的分支操作简直不要太方便,而实际项目开发中团队合作最依赖的莫过于分支了,关于分支前面的系列也提到过,但是本篇会详细讲述什么是分支.分支的 ...
- Direct2D 第6篇 绘制多种风格的线条
原文:Direct2D 第6篇 绘制多种风格的线条 上图是使用Direct2D绘制的线条,Direct2D在效率上比GDI/GDI+要快几倍,GDI/GDI+绘图是出了名的"慢", ...
- Python之其他数据类型
1.可命名元组:namedtuple 由nametuple可创建一个包含tuple所有功能以及其他功能的类型 class Mytuple(__builtin__.tuple) | Mytuple(x, ...
- JavaScript--函数对象的属性caller与callee
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQL知识总结(1)
什么是数据库: sql组成: DDL:数据定义语句,有CREATE/DROP等: DML:数据操作语句,有DELETE/UPDATE/INSERT/INSERT等; DQL:数据查询语句,有SELEC ...
- 【转】MySQL的btree索引和hash索引的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- PAT天梯赛L3-011 直捣黄龙
题目链接:点击打开链接 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求 ...
- ConvertJavaMiliSecondToDateTime
private static DateTime ConvertJavaMiliSecondToDateTime(long javaMS) { DateTime UT ...
- $(window).scrollTop() == $(document).height() - $(window).height()(底端)
jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变时(如最 ...