`
zxs19861202
  • 浏览: 916018 次
  • 性别: Icon_minigender_1
  • 来自: 湖北—》上海
社区版块
存档分类
最新评论

ios 处理圆角图片拉伸

    博客分类:
  • ios
 
阅读更多

类似9patch效果的iOS图片拉伸

下面张图片,本来是设计来做按钮背景的:



 
  button.png,尺寸为:24x60

现在我们把它用作为按钮背景,按钮尺寸是150x50:

// 得到view的尺寸
CGSize viewSize = self.view.bounds.size;

// 初始化按钮
UIButton *button = [[UIButton alloc] init];
// 设置尺寸
button.bounds = CGRectMake(0, 0, 150, 50);
// 设置位置
button.center = CGPointMake(viewSize.width * 0.5f, viewSize.height * 0.5f);

// 加载图片
UIImage *image = [UIImage imageNamed:@"button"];
// 设置背景图片
[button setBackgroundImage:image forState:UIControlStateNormal];

// 添加按钮
[self.view addSubview:button];

 

运行效果图:




 
 

可以看到,效果非常地差。原因很简单,因为原图大小为24x60,现在整张图片被全方位拉伸为150x50,比较严重的是图片的4个角。

有些人可能马上想到一个解决方案,你叫美工把图片做大一点不就好了么,怎么拉伸都没事。没错,这是一种解决方案,不过不建议采取。原因很简单:1.图片大,导致安装包也大,加载到内存中也大;2.有更好的解决方案。

细看一下图片,其实图片会变得难看,完全是因为4个角被拉伸了,中间的拉伸并没有明显地丑化外观。因此要想小图片被拉伸后不会变得难看,在图片拉伸的时候,我们只需拉伸图片的中间一块矩形区域即可,不要拉伸边缘部分。

比如只拉伸下图的矩形区域,上下左右的边缘都不拉伸:




 
 

iOS中提供很好用的API帮我们实现上述功能。到iOS 6.0为止,iOS提供了3种图片拉伸的解决方案,接下来分别详细介绍这些方案。

一、iOS 5.0之前

iOS中有个叫端盖(end cap)的概念,用来指定图片中的哪一部分不用拉伸。比如下图中,黑色代表需要被拉伸的矩形区域,上下左右不需要被拉伸的边缘就称为端盖。




 
 

使用UIImage的这个方法,可以通过设置端盖宽度返回一个经过拉伸处理的UIImage对象

 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;

 

这个方法只有2个参数,leftCapWidth代表左端盖宽度,topCapHeight代表顶端盖高度。系统会自动计算出右端盖宽度(rightCapWidth)和底端盖高度(bottomCapHeight),算法如下:

// width为图片宽度
rightCapWidth = width - leftCapWidth - 1;

// height为图片高度
bottomCapHeight = height - topCapHeight - 1

 

经过计算,你会发现中间的可拉伸区域只有1x1

// stretchWidth为中间可拉伸区域的宽度
stretchWidth = width - leftCapWidth - rightCapWidth = 1;
    
// stretchHeight为中间可拉伸区域的高度
stretchHeight = height - topCapHeight - bottomCapHeight = 1;

 

因此,使用这个方法只会拉伸图片中间1x1的区域,并不会影响到边缘和角落。

下面演示下方法的使用:

// 左端盖宽度
NSInteger leftCapWidth = image.size.width * 0.5f;
// 顶端盖高度
NSInteger topCapHeight = image.size.height * 0.5f;
// 重新赋值
image = [image stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];

 

调用这个方法后,原来的image并不会发生改变,会产生一个新的经过拉伸的UIImage,所以第6行中需要将返回值赋值回给image变量

运行效果:





 
 可以发现,图片非常美观地显示出来了

注意:

1.这个方法在iOS 5.0出来后就过期了

2.这个方法只能拉伸1x1的区域

 

二、iOS 5.0

在iOS 5.0中,UIImage又有一个新方法可以处理图片的拉伸问题

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

 

这个方法只接收一个UIEdgeInsets类型的参数,可以通过设置UIEdgeInsets的left、right、top、bottom来分别指定左端盖宽度、右端盖宽度、顶端盖高度、底端盖高度

CGFloat top = 25; // 顶端盖高度
CGFloat bottom = 25 ; // 底端盖高度
CGFloat left = 10; // 左端盖宽度
CGFloat right = 10; // 右端盖宽度
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
// 伸缩后重新赋值
image = [image resizableImageWithCapInsets:insets];

 

运行效果:




 
 

 

三、iOS 6.0

在iOS6.0中,UIImage又提供了一个方法处理图片拉伸

 

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode

 

对比iOS5.0中的方法,只多了一个UIImageResizingMode参数,用来指定拉伸的模式:

  • UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
  • UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片
CGFloat top = 25; // 顶端盖高度
CGFloat bottom = 25 ; // 底端盖高度
CGFloat left = 10; // 左端盖宽度
CGFloat right = 10; // 右端盖宽度
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
// 指定为拉伸模式,伸缩后重新赋值
image = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];

运行效果:


另外一种方式:

 

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:

(NSInteger)topCapHeight 这个函数是UIImage的一个实例函数,它的功能是创建一个内容可拉伸,而边角不拉伸的图片,需要两个参数,第一个是左边不拉伸区域的宽度,第二个参数是上面不拉伸的高度。

根据设置的宽度和高度,将接下来的一个像素进行左右扩展和上下拉伸。

注意:可拉伸的范围都是距离leftCapWidth后的1竖排像素,和距离topCapHeight后的1横排像素。

参数的意义是,如果参数指定10,5。那么,图片左边10个像素,上边5个像素。不会被拉伸,x坐标为11和一个像素会被横向复制,y坐标为6的一个像素会被纵向复制。

 

注意:只是对一个像素进行复制到一定宽度。而图像后面的剩余像素也不会被拉伸。

 

UIImage *img=[UIImage imageNamed:@"bubbleSelf.png"];
    img=[img stretchableImageWithLeftCapWidth:15 topCapHeight:12];
    UIImageView *imgView=[[UIImageView alloc]initWithImage:img];
    [imgView setFrame:CGRectMake(10, 10, 200, 200)];
    [self. view addSubview:imgView];

 

  • 大小: 5.7 KB
  • 大小: 9.2 KB
  • 大小: 6.9 KB
  • 大小: 48.4 KB
  • 大小: 7.5 KB
分享到:
评论

相关推荐

    Android高级应用源码-仿IOS的圆角设置界面。直接可用,单选多选等ATable_Demo(iOS风格设置).rar

    4. **Nine-Patch图片**: 对于需要拉伸的背景图,开发者可能会使用Nine-Patch图片,这种图片格式允许指定可拉伸区域和不变形区域,同时可以设定圆角。 5. **渲染阴影效果**: iOS界面往往有明显的阴影效果,Android中...

    iOS开发之自定义图片拉伸功能

    在iOS开发中,自定义图片拉伸功能是一个重要的图像处理技术,它允许开发者根据需要对图片进行拉伸,以适应不同的尺寸和应用场景,同时保持图片的关键部分(如边角)不变形。这种技术通常用于创建可伸缩的背景、按钮...

    iOS图片实现可拉伸不变形的处理操作

    在iOS的实际开发中,如果我们把一张有图片(有特别形状的,特别是类似有圆角的图片)放在UIButton中,当UIButton改变大小是,图片可能会被拉伸并且产生变形,我们可以通过-(UIImage *)resizableImageWithCapInsets:...

    iOS 图片 毛玻璃、圆角、图片其他设置(图片少了 app的大小也就小了)

    在iOS开发中,图片处理是不可或缺的一部分,尤其是在创建美观、用户体验优秀的应用时。本文将深入探讨如何使用UIImage类实现毛玻璃效果、填充效果以及其他几种图片处理技术,以优化你的iOS应用。 首先,我们来讨论...

    iOS uiimage部分截取图片

    例如,如果我们要创建一个带有圆角的可拉伸背景,可以将圆角部分设为不变区,确保拉伸时圆角不会变形。同时,该方法也支持在不同方向上设置不同的不变区,这对于复杂的图像拉伸场景非常有用。 在实际应用中,我们...

    iOS图片拉伸的多种方式

    总结来说,iOS图片拉伸涉及到UIImageView的内容模式设置以及UIImage的局部拉伸和尺寸调整。通过巧妙地运用这些技术,开发者可以确保图片在各种场景下都能正确显示,同时保持视觉效果的一致性和质量。

    ios app的button的图片设置

    - 图片的大小和比例应适合按钮尺寸,否则可能显示不全或拉伸变形。 - 如果图片包含透明区域,记得设置`clipToBounds`为`true`,以确保超出边界的部分不会显示。 - 对于圆角按钮,可以使用`layer.cornerRadius`...

    iOS应用开发中图片的拉伸问题解决方案

    在iOS应用开发中,图片的拉伸问题是一个常见的视觉优化挑战。当图片需要适应不同尺寸的界面元素时,如按钮、...记住,正确处理图片拉伸是优化UI性能的关键步骤,尤其对于那些对视觉效果有高要求的应用来说更是如此。

    iOS之彻底弄懂resizableImageWithCapInsets

    总之,`resizableImageWithCapInsets`是iOS开发中处理可拉伸图片的重要工具,它可以帮助我们创建出高质量的用户界面。通过深入研究`ImageResizeDemo`源码,开发者不仅可以理解cap insets的概念,还能掌握如何在实际...

    ios学习笔记中用到的美化按钮的背景图

    在iOS中,我们可以使用这些图片为按钮自定义不同状态下的外观,例如正常状态、高亮状态、选中状态或禁用状态。`blueButton.png` 可能用于按钮的默认或激活状态,而 `whiteButton.png` 可能用于高亮或被选中的状态,...

    iOS核心动画高级技巧

    视觉效果部分则讲解了如何给图层添加圆角、边框、阴影和蒙板等视觉效果,以及如何通过拉伸过滤和组透明度来增强图层的表现力。 变换部分介绍了仿射变换和3D变换,这是实现动画效果的基本工具。此外,还探讨了使用...

    iOS 自定义按钮 很漂亮

    - 按钮的渲染模式(ContentMode)可以通过`contentMode`属性来设置,比如填充、居中、拉伸等,这会影响按钮上的图像如何适应按钮大小。 6. **触摸事件处理** - 添加`@IBAction`方法来响应按钮的点击事件,如`...

    IOS应用源码之酷炫的图片展示效果 .rar

    9. **图片裁剪与变形**: 使用`CGAffineTransform`可以对图片进行裁剪和变形操作,如圆角、拉伸等。 10. **状态管理**: 在图片加载过程中,考虑显示加载指示器、错误提示以及无数据时的界面反馈,以提高用户体验。 ...

    iOS 动画CoreAnimation

    - **拉伸过滤**: 控制图层内容的拉伸方式。 - **组透明**: 设置图层的透明度,使得背景和其他图层可见。 #### 七、变换 **仿射变换** - **变换**: 通过改变图层的位置、旋转角度或比例等属性来实现各种视觉效果。 -...

    ios-图片.zip

    图片管理工具 可实现截取、拉伸、打码、圆角、压缩 github:https://github.com/winterLiao/LWTImageManager 简书:

    IOS应用源码——圆形按钮风格tab标签.zip

    在iOS中,我们可以利用`UIImage`的`resizableImage(withCapInsets:)`方法创建可拉伸的图像,确保图片在不同尺寸的圆形按钮上都能正确显示。此外,还可以通过`Core Graphics`或第三方库如`Kingfisher`来实现图像的...

    IOS 开发总结

    3. **图片拉伸**:图片在拉伸时容易出现模糊,使用适当的图片处理技术或优化图片资源是解决此问题的方法之一。 4. **自定义字体**:为应用设置自定义字体可以增强界面的个性化。 5. **后台运行**:iOS应用在后台运行...

    iOS核心动画技巧

    例如,在 iOS 中,所有的视图都是从 `UIView` 类继承而来,这意味着它们可以处理触摸事件、支持 Core Graphics 绘图、执行仿射变换(如旋转和缩放),甚至实现简单的动画效果。 与此相似,`CALayer` 类在概念上与 `...

    IOS应用源码——ios按钮样式制作大全(20种不同风格的按钮制作方法).zip

    2. **自定义按钮图片**:通过设置`setImage:forState:`方法,可以为不同状态(如正常、高亮、选中)的按钮指定不同的图片。 3. **调整边框宽度和颜色**:利用`layer.borderWidth`和`layer.borderColor`属性,可以...

Global site tag (gtag.js) - Google Analytics