类似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];
相关推荐
4. **Nine-Patch图片**: 对于需要拉伸的背景图,开发者可能会使用Nine-Patch图片,这种图片格式允许指定可拉伸区域和不变形区域,同时可以设定圆角。 5. **渲染阴影效果**: iOS界面往往有明显的阴影效果,Android中...
在iOS开发中,自定义图片拉伸功能是一个重要的图像处理技术,它允许开发者根据需要对图片进行拉伸,以适应不同的尺寸和应用场景,同时保持图片的关键部分(如边角)不变形。这种技术通常用于创建可伸缩的背景、按钮...
在iOS的实际开发中,如果我们把一张有图片(有特别形状的,特别是类似有圆角的图片)放在UIButton中,当UIButton改变大小是,图片可能会被拉伸并且产生变形,我们可以通过-(UIImage *)resizableImageWithCapInsets:...
在iOS开发中,图片处理是不可或缺的一部分,尤其是在创建美观、用户体验优秀的应用时。本文将深入探讨如何使用UIImage类实现毛玻璃效果、填充效果以及其他几种图片处理技术,以优化你的iOS应用。 首先,我们来讨论...
例如,如果我们要创建一个带有圆角的可拉伸背景,可以将圆角部分设为不变区,确保拉伸时圆角不会变形。同时,该方法也支持在不同方向上设置不同的不变区,这对于复杂的图像拉伸场景非常有用。 在实际应用中,我们...
总结来说,iOS图片拉伸涉及到UIImageView的内容模式设置以及UIImage的局部拉伸和尺寸调整。通过巧妙地运用这些技术,开发者可以确保图片在各种场景下都能正确显示,同时保持视觉效果的一致性和质量。
- 图片的大小和比例应适合按钮尺寸,否则可能显示不全或拉伸变形。 - 如果图片包含透明区域,记得设置`clipToBounds`为`true`,以确保超出边界的部分不会显示。 - 对于圆角按钮,可以使用`layer.cornerRadius`...
在iOS应用开发中,图片的拉伸问题是一个常见的视觉优化挑战。当图片需要适应不同尺寸的界面元素时,如按钮、...记住,正确处理图片拉伸是优化UI性能的关键步骤,尤其对于那些对视觉效果有高要求的应用来说更是如此。
总之,`resizableImageWithCapInsets`是iOS开发中处理可拉伸图片的重要工具,它可以帮助我们创建出高质量的用户界面。通过深入研究`ImageResizeDemo`源码,开发者不仅可以理解cap insets的概念,还能掌握如何在实际...
在iOS中,我们可以使用这些图片为按钮自定义不同状态下的外观,例如正常状态、高亮状态、选中状态或禁用状态。`blueButton.png` 可能用于按钮的默认或激活状态,而 `whiteButton.png` 可能用于高亮或被选中的状态,...
视觉效果部分则讲解了如何给图层添加圆角、边框、阴影和蒙板等视觉效果,以及如何通过拉伸过滤和组透明度来增强图层的表现力。 变换部分介绍了仿射变换和3D变换,这是实现动画效果的基本工具。此外,还探讨了使用...
- 按钮的渲染模式(ContentMode)可以通过`contentMode`属性来设置,比如填充、居中、拉伸等,这会影响按钮上的图像如何适应按钮大小。 6. **触摸事件处理** - 添加`@IBAction`方法来响应按钮的点击事件,如`...
9. **图片裁剪与变形**: 使用`CGAffineTransform`可以对图片进行裁剪和变形操作,如圆角、拉伸等。 10. **状态管理**: 在图片加载过程中,考虑显示加载指示器、错误提示以及无数据时的界面反馈,以提高用户体验。 ...
- **拉伸过滤**: 控制图层内容的拉伸方式。 - **组透明**: 设置图层的透明度,使得背景和其他图层可见。 #### 七、变换 **仿射变换** - **变换**: 通过改变图层的位置、旋转角度或比例等属性来实现各种视觉效果。 -...
图片管理工具 可实现截取、拉伸、打码、圆角、压缩 github:https://github.com/winterLiao/LWTImageManager 简书:
在iOS中,我们可以利用`UIImage`的`resizableImage(withCapInsets:)`方法创建可拉伸的图像,确保图片在不同尺寸的圆形按钮上都能正确显示。此外,还可以通过`Core Graphics`或第三方库如`Kingfisher`来实现图像的...
3. **图片拉伸**:图片在拉伸时容易出现模糊,使用适当的图片处理技术或优化图片资源是解决此问题的方法之一。 4. **自定义字体**:为应用设置自定义字体可以增强界面的个性化。 5. **后台运行**:iOS应用在后台运行...
例如,在 iOS 中,所有的视图都是从 `UIView` 类继承而来,这意味着它们可以处理触摸事件、支持 Core Graphics 绘图、执行仿射变换(如旋转和缩放),甚至实现简单的动画效果。 与此相似,`CALayer` 类在概念上与 `...
2. **自定义按钮图片**:通过设置`setImage:forState:`方法,可以为不同状态(如正常、高亮、选中)的按钮指定不同的图片。 3. **调整边框宽度和颜色**:利用`layer.borderWidth`和`layer.borderColor`属性,可以...