图片拉伸 UIImage resizableImageWithCapInsets

最近遇到一个需求,要图片适应文字的长度进行拉伸,实现的效果以及原图如下图:

6EDBC4B7-162C-4D45-9553-FB89B921D32A.png
questionTextViewSearchNormal@2x.png

1、resizableImageWithCapInsets 方法介绍

如何使搜索框的长度要随着文字的长度而变化,查文档发现UIImage有个方法,可以来实现该功能

  • (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); // create a resizable version of this image. the interior is tiled when drawn.
  • (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode
    (UIImageResizingMode) resizingMode NS_AVAILABLE_IOS(6_0); // the interior is resized according to the resizingMode

(UIEdgeInsets)capInsets用来指定需要拉伸的部分;
(UIImageResizingMode) resizingMode 拉伸的模式有两种,平铺和拉伸。 平铺是在拉大的空间中重复原图capInsets指定的部分,拉伸是拉伸capInsets所指定的区域进行填充。

设置UIEdgeInsetsMake(0, 10, 0, 2)


B734194D-34CA-4AC9-A965-A585503D1392.png

此图是平铺的效果图

ECBEE3F3-A419-4782-91A1-97209D471DC6.png

上图是拉伸的效果,可以看出放大镜已经变形。
我们改变一下UIEdgeInsetsMake(0, 30, 0, 2),这里的30差不多就是原图左边放大镜的宽度,仍旧使用拉伸方式,结果如下图

B8CB91D2-88D5-4D91-8684-1E9D9E7B449B.png

改变方式为平铺方式,UIEdgeInsetsMake(0, 30, 0, 2),结果如下:

3E1FF5E0-B8FE-47B3-B044-AE60E415B8E6.png

从图中可以看出上述两种方式都可以。

2、具体实现

整个对象是一个button, 在button上添加一个UILabel用来显示具体的文字,然后根据下面的方法计算label的宽度,该方法的具体使用就不多说,求出label的宽度之后,就可以很容易得出button的宽度。

  • (CGRect)boundingRectWithSize:(CGSize)size options: (NSStringDrawingOptions)options attributes: (nullable NSDictionary<NSString *, id> *)attributes context: (nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage *image = [[UIImage imageNamed:@"questionTextViewSearchNormal"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 30, 0, 2) resizingMode:UIImageResizingModeTile];
    UIButton *button = [[UIButton alloc] init];
    
    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor redColor];
    label.text = @"日本动漫";
    label.font = [UIFont systemFontOfSize:15];
    //计算label的宽度
    NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    textStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    
    CGSize size = [label.text boundingRectWithSize:CGSizeMake(150, 20)
                                            options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                         attributes:@{NSFontAttributeName:label.font,NSParagraphStyleAttributeName:textStyle}
                                            context:nil].size;
    
    CGFloat labelW = ceil(size.width) + 1;
    label.frame = CGRectMake(30, 2, labelW, 20);
    [button addSubview:label];
    
    button.frame = CGRectMake(100, 200, image.size.width + labelW - 8, image.size.height);
    [button setBackgroundImage:image forState:UIControlStateNormal];
    [self.view addSubview:button];
    
    
}

运行的结果如下:

F06F1014-E146-4C64-89F8-6EDF5913049D.png

修改label中的文字,可以得到以下结果:

3666AA5B-3EDE-4976-AFB5-F7CFA1AEE77B.png
BB2B82FA-F66B-430D-9B3E-22349A123CDF.png

*这里需要注意一下,要将图片设置为button的backgroundImage, 设置为image无法实现拉伸效果

[button setBackgroundImage:image forState:UIControlStateNormal];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 返回一张受保护且被拉伸的图片 应用场景:聊天窗口的气泡 方法一(弃用): iOS 5.0以前使用(弃用)这个方法会...
    林安530阅读 15,935评论 1 36
  • 纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能、极强的用户体验、华丽简...
    木马不在转阅读 523评论 0 0
  • 一、目录 1> 图片拉伸处理 2> 图片扩展名 3> 大图减小高度,图片拉伸处理 4> 点击大图,Modal出来,...
    iOS_成才录阅读 5,115评论 1 33
  • iOS目前拉伸不支持四周进行拉伸,中间部分保持不变的方法!!! iOS支持的是某个部分的拉伸。 实际使用情形1:按...
    艳晓阅读 1,659评论 6 11
  • 人一定要有一颗感恩的心,这是我在上一份行业中学到的第一件事情,也因此给我的生活带来了不少变化,其实变化还可以更大一...
    纤陌颜阅读 503评论 0 0