尽量告别背景图吧~

在开发中,我们会经常给一些UIkit添加背景图的需求,此时一般是UI给图来用,随着背景图的越来越多,导致app越来越大,而且有些相同的图可能出现冗余,还有可能代码删了,遗留的垃圾图。其实很多作为背景图都很简单,完全可以直接代码绘制,如果UI能给一些通用的规范,可以封装出来给其他人用,ok,进入正题。

1、创建一个UIiamge的category,然后添加方法:

/*

获得指定颜色 大小 边角度 边框颜色 边框宽度 的图片

@param color 图片颜色

@param targetSize 图片大小

@param cornerRadius 图片边框的角度

@param borderColor 图片边框的颜色

@param ldCustomButtonStyle borderWidth 边框宽度

@return 指定图片

*/

+ (UIImage *)ld_imageWithBackgroundColor:(UIColor *)color toSize:(CGSize)targetSize cornerRadius:(CGFloat)cornerRadius  borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth {

UIGraphicsBeginImageContextWithOptions(targetSize, cornerRadius == 0, [UIScreen mainScreen].scale);

CGRect targetRect = (CGRect){0, 0, targetSize.width, targetSize.height};

UIImage *finalImage = nil;

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);

if (cornerRadius == 0) {

if (borderWidth > 0) {

CGContextSetStrokeColorWithColor(context, borderColor.CGColor);

CGContextSetLineWidth(context, borderWidth);

CGContextFillRect(context, targetRect);

targetRect = CGRectMake(borderWidth / 2, borderWidth / 2, targetSize.width - borderWidth, targetSize.height - borderWidth);

CGContextStrokeRect(context, targetRect);

} else {

CGContextFillRect(context, targetRect);

}

} else {

targetRect = CGRectMake(borderWidth / 2, borderWidth / 2, targetSize.width - borderWidth, targetSize.height - borderWidth);

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:targetRect

byRoundingCorners:UIRectCornerAllCorners

cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];

CGContextAddPath(UIGraphicsGetCurrentContext(), path.CGPath);

if (borderWidth > 0) {

CGContextSetStrokeColorWithColor(context, borderColor.CGColor);

CGContextSetLineWidth(context, borderWidth);

CGContextDrawPath(context, kCGPathFillStroke);

} else {

CGContextDrawPath(context, kCGPathFill);

}

}

finalImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return finalImage;

}


大家可以去学习一下core graphics ,上边的代码注释写的很清楚了,就是产生一个背景图,基本满足平时的背景图需求。

2、为UIkit控件设置背景图,这里以UIbutton为例:

假如UI给出了一个规范,有两种样式的button:



我们可以封装一个公共方法,给其他人用,创建一个UIbutton的Category:

typedef NS_ENUM(NSUInteger, LDCustomButtonStyle) {

LDCustomButtonDefaultStyle = 0 ,//默认样式 什么都没设置

LDCustomButtonRBgWTxtStyle = 1, //红底白字

LDCustomButtonWBgRTxtStyle = 2 ,//白底红字红边框

};

@interface UIButton (LDCustom)

/**

根据样式获得不同样式的按钮

@param ldCustomButtonStyle 按钮样式

@return 指定样式的按钮

*/

+ (instancetype )ld_createButtonWithStyle:(LDCustomButtonStyle )ldCustomButtonStyle;


可以看到我们的接口没有指定返回的按钮大小,怎么做到呢?

这里要用到,图片拉伸的方法(自己谷歌吧):

- (void )setBackgroundColor:(UIColor *)backgroundColor  cornerRadius:(CGFloat)cornerRadius borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth forState:(UIControlState)state {

UIImage *backgroundImg = [UIImage ld_imageWithBackgroundColor:backgroundColor  toSize:CGSizeMake(2*cornerRadius+1, 2*cornerRadius+1) cornerRadius:cornerRadius borderColor:borderColor borderWidth:borderWidth];

UIImage * stretchedImage = [backgroundImg resizableImageWithCapInsets:UIEdgeInsetsMake(cornerRadius, cornerRadius, cornerRadius ,cornerRadius) resizingMode:UIImageResizingModeStretch];

[self setBackgroundImage:stretchedImage forState:state];

}

首先创建一个size为(2*cornerRadius+1, 2*cornerRadius+1)大小的图片,然后指定拉伸区域这样就OK了,当button大于图片大小时,会被拉伸中间区域,不影响边框的展示。

最后我们再提供一个针对规范的接口给其他人用就好了:

+ (instancetype )ld_createButtonWithStyle:(LDCustomButtonStyle )ldCustomButtonStyle {

UIButton *customBtn = [UIButton buttonWithType:UIButtonTypeCustom];

switch (ldCustomButtonStyle) {

case LDCustomButtonDefaultStyle:

break;

case LDCustomButtonRBgWTxtStyle:

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xfa4545]  cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xfa4545] borderWidth:0.5 forState:UIControlStateNormal];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xffffff] forState:UIControlStateNormal];

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xc63737]  cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xc63737] borderWidth:0.5 forState:UIControlStateSelected];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xd55d5d] forState:UIControlStateSelected];

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xc63737]  cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xc63737] borderWidth:0.5 forState:UIControlStateHighlighted];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xd55d5d] forState:UIControlStateHighlighted];

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xfa4545] cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xfa4545] borderWidth:0.5 forState:UIControlStateDisabled];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xff9797] forState:UIControlStateDisabled];

break;

case LDCustomButtonWBgRTxtStyle:

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xffffff] cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xfa4545] borderWidth:0.5 forState:UIControlStateNormal];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xfa4545] forState:UIControlStateNormal];

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xfa4545]  cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xfa4545] borderWidth:0.5 forState:UIControlStateSelected];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xffffff] forState:UIControlStateSelected];

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xfa4545]  cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xfa4545] borderWidth:0.5 forState:UIControlStateHighlighted];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xffffff] forState:UIControlStateHighlighted];

[customBtn setBackgroundColor:[UIColor ld_colorWithHex:0xfa4545]  cornerRadius:4.0 borderColor:[UIColor ld_colorWithHex:0xfa4545] borderWidth:0.5 forState:UIControlStateDisabled];

[customBtn setTitleColor:[UIColor ld_colorWithHex:0xff9797] forState:UIControlStateDisabled];

break;

default:

break;

}

return customBtn;

}

到此就可以了,以后用到规范的按钮,直接调用这个方法就好了~ 代码量也会明显简洁~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容

  • // // JackDateAndDateView.m // ZHB // // Created by JackR...
    JackRen阅读 412评论 0 1
  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    十年一品温如言1008阅读 1,661评论 0 3
  • //设置尺寸为屏幕尺寸的时候self.window = [[UIWindow alloc] initWithFra...
    LuckTime阅读 818评论 0 0
  • 0210【动待花开】20171021 D11 拿出之前制作的字卡,今天和小助手一起认字,今天我们要学"妈妈"。我们...
    芝麻_mom阅读 96评论 0 0
  • 谁裂天河,坠星如雨。莲台倒、万点鲛珠,霓裳舞、千枝红羽。更哪堪,脂染花黄,粉褪雪缕。 雨过暗香织雾,菡萏滴露。莲蓬...
    江南烟雨阅读 219评论 0 1