iOS经典讲解之图片拉伸的几种方法

swift-resizableImageWithCapInsets(可拉伸图片) 他的作用是用之前的的image创建出一个可拉伸的image,这个image的作用就是当要填充的imageView大于当前image时就会进行拉伸,但是这个可拉伸image是可以设置屏蔽区域的 也就是告诉你哪部分不要用来拉伸。 阅读详情

作者:刘新林

转载请标明出处:http://blog.youkuaiyun.com/loving_ios/article/details/52460627


一、通过UIImageView的属性image来设置图片会根据UIImageView的宽高自动拉伸,这样有比较大的的缺陷,就是会失真和变形

UIImage *image = [UIImage imageNamed:@"pao"];
NSLog(@"%lf %lf", image.size.width, image.size.height);
UIImageView *img_test = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 96, 96)];
img_test.image = image;
[self.view addSubview:img_test];

二、通过实例方法stretchableImageWithLeftCapWidth:topCapHeight:来进行像素的拉伸

这个方法我们可以用来拉伸类似QQ,微信的聊天气泡背景图,这个函数是UIImage的一个实例函数,它的功能是创建一个内容可拉伸,而边角不拉伸的图片,需要两个参数,第一个是不拉伸区域和左边框的宽度,第二个参数是不拉伸区域和上边框的宽度。
参数的意义是,如果参数指定10,10。那么,图片左边10个像素,上边10个像素,不会被拉伸,x坐标为11的一个像素会被横向复制,y坐标为11的一个像素会被纵向复制。注意:只是对一个像素进行复制到一定宽度。
UIImage *image = [UIImage imageNamed:@"pao"];    
UIImageView *img_test = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 96, 96)];
[self.view addSubview:img_test];
//   通过实例方法 stretchableImageWithLeftCapWidth: topCapHeight: 来拉伸
img_test.image = [image stretchableImageWithLeftCapWidth:16 topCapHeight:32];

这段代码的意思是将图片从坐标为(17,33)的像素点将图片进行拉伸。该方法也有一个缺陷,那就是如果图片内部也有被拉伸的的地方就不行了。比如下面这张图片,


就图片进行拉伸处理

 UIImage *image = [UIImage imageNamed:@"tupian"];
 UIImageView *img_test = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 96, 96)];
 [self.view addSubview:img_test];
 img_test.image = [image stretchableImageWithLeftCapWidth:5 topCapHeight:5];

会得到下面这张图


原因很简单,因为只是对一个像素(6,6)进行横向和纵向拉伸,而内部的线条不在该像素内所以很出现该现象,这是这种方式的缺陷。

三、区域的拉伸通过方法- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

它分别对用了图片进行拉伸的区域距离顶部、左部、下部、右部的像素。比如,一个32*32像素的图片,将UIEdgeInsets参数全部设置为1,则实际拉伸的部分就是中间的30*30的区域的像素。有一点需要注意,这个方法默认使用的拉伸模式是区域复制,比如还是上面的图案,如下代码拉伸:

UIImage *image = [UIImage imageNamed:@"tupian"];
UIImageView *img_test = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 96, 96)];
[self.view addSubview:img_test];
img_test.image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];

得到的图片


很显然不符合要求,看下面的方法。

四、拉伸模式的设置

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

这个函数和上一个函数相比,唯一的差别是多了一个参数。这个参数是个枚举,如下

typedef NS_ENUM(NSInteger, UIImageResizingMode) {
    UIImageResizingModeTile,//进行区域复制模式拉伸 如上
    UIImageResizingModeStretch,//进行渐变复制模式拉伸
};

我们只需使用UIImageResizingModeStretch模式即可

UIImage *image = [UIImage imageNamed:@"tupian"];
UIImageView *img_test = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 96, 96)];
[self.view addSubview:img_test];
img_test.image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1) resizingMode:(UIImageResizingModeStretch)];

得到如下图:


在实际开发中会用到图片拉伸的地方很多,希望能有帮助。

iOS图片拉伸技巧 纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设计好的图片,将会糟蹋了这些设计,功亏一篑。 比如下面张图片,本来是设计来做按钮背景的: button.png,尺寸为:24x60 现在我们把它用作为按钮背景,按钮尺寸是150x50: // 阅读详情

相关推荐

Flutter - 基础Widget,android简单小项目实例

child: Row( mainAxisSize: MainAxisSize.min, // 默认是max,占满父Widget;min是包裹内容 children: [ Icon(Icons.favorite, color: Colors.red), // 图标 Text(“喜欢作者”), // 文字 ], ), onPressed: () => print(“自定义Button”), // onPressed必传,否则样式可能会出问题 ) ], ); } } 2、定制 Button 默认间隔 :

m0_64604311的博客 627

iOS中对图片拉伸的四种方式

1. UIImageView整体拉伸方式一是通过设置容器UIImageView中图片的显示模式:UIImageView-contentMode,使容器内的图片按照需要的拉伸方式在容器中显示。typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, // 默认 拉伸(会变形)

謝公子造轮子 1万+

UniApp启动页深度定制:从静态配置到动态加载的实战指南

本文深入探讨了UniApp启动页的深度定制方案,从基础的manifest.json静态配置讲起,详细解析了iOS与Android平台的规范差异及常见避坑指南。重点介绍了通过创建中间页实现动态加载的高级方案,以解决原生启动页闪屏问题,并实现根据网络、用户状态或节日活动展示不同内容的灵活效果,最终提升App启动体验与品牌专业感。

ansible6ops的博客 290

android 九宫格 拉伸,Swift - 使用resizableImage拉伸图片的指定部分(九宫格拉伸)...

有时我们项目中需要复用一些图片资源,比如很多地方都会使用同一张背景图片,只不过显示的尺寸不同。那么就需要让图片可以根据情况自动拉伸。但如果图片有圆角或一些其他特殊边框的话,直接拉伸会造成变形。比如下面这个带圆角的背景图:如果我们直接拉伸的话就会就会很难看:这个问题可以借助 resizableImage 方法来解决。1,resizableImage 方法介绍该方法可以指定一个矩形区域,这个图片在矩形...

weixin_42627853的博客 813

从资源文件到完美显示:手把手解决Qt按钮背景图加载、缩放与适配的那些坑

本文详细介绍了在Qt中解决按钮背景图加载、缩放与适配问题的实战技巧。从资源文件配置、样式表方案到QPixmap动态加载,涵盖了常见问题的解决方法,如边缘模糊、点击区域异常等,并提供了跨平台适配和性能优化的实用建议。

weixin_33713707的博客 238

Unity Shader图片区域遮罩:从原理到实战的完整实现指南

在计算机图形学与游戏开发中,纹理采样与像素操作是构建丰富视觉表现的核心基础。其核心原理是通过对纹理数据进行采样与数学运算,控制每个像素的最终输出,从而实现复杂的视觉效果。这一技术的核心价值在于将内容与表现形式解耦,极大地提升了资源复用率和开发灵活性。在工程实践中,它被广泛应用于UI动态效果、场景特效融合、角色自定义等关键场景。本文聚焦于图片区域遮罩这一具体实现,深入剖析了如何通过顶点/片元着色器进行纹理混合,并详细讲解了遮罩纹理的制备、Shader参数化设计以及性能优化策略,为开发者提供了一套从概念到生产的

chuannaoxuan4674的博客 479

如何在现代设备上重温经典仙剑奇侠传?SDLPAL项目给你完美解决方案

你是否还记得那个经典的仙剑奇侠传游戏?那些动人的剧情、优美的音乐,还有李逍遥、赵灵儿等角色带给我们的感动。但随着操作系统不断更新,原版游戏在现代设备上运行时常常会遇到各种兼容性问题:黑屏、闪退、音频异常……这些问题让怀旧之旅变得困难重重。 今天我要介绍一个开源项目——SDLPAL,它能完美解决这些兼容性问题,让你在Windows、Linux、macOS甚至移动设备上都能流畅体验这款经典中文RPG

gitblog_00401的博客 473

Godot引擎入门指南:从场景节点到跨平台发布的完整开发流程

游戏引擎是现代游戏开发的核心工具,它通过封装底层图形渲染、物理模拟和音频处理等复杂系统,为开发者提供高效的创作框架。其工作原理基于场景图、实体组件和资源管理等架构,将游戏对象抽象为可组合的模块。在技术价值上,开源引擎如Godot降低了开发门槛,使独立开发者和中小团队能够以低成本实现创意,并通过节点化设计提升代码复用性和可维护性。典型应用场景包括2D/3D游戏原型开发、教育模拟和交互式媒体创作。本文以Godot引擎为例,深入解析其独特的场景树架构和GDScript脚本语言,涵盖从角色控制、碰撞检测到性能优化的

weixin_30883311的博客 322

HarmonyOS开发实战:图片全屏查看器:Swiper 轮播 + 缩略图导航

页面预览前言“海风日记“的图片查看器使用 Swiper 轮播展示图片,配合缩略图预览条和底部操作栏,提供完整的图片浏览体验。本文将从源码出发,深入讲解图片查看器的完整实现。一、完整布局二、总结本文通过

LEO11110的博客 280

Godot 2D游戏开发入门:从零开始的项目初始化与最佳实践指南

游戏引擎是现代游戏开发的核心工具,它通过封装底层图形、物理和音频等复杂系统,为开发者提供高效的创作框架。其工作原理在于将游戏对象抽象为可组合的组件或节点,并通过场景树进行组织与管理,从而提升开发效率与代码复用性。在众多引擎中,Godot以其开源免费、轻量化和独特的节点化架构脱颖而出,特别适合独立开发者和初学者快速上手2D游戏制作。对于刚接触游戏开发的新手,掌握引擎的初始设置与项目配置是构建稳定开发环境的关键一步。本文聚焦于Godot引擎的**项目初始化**流程,详细解析从版本选择、渲染器配置到项目设置优化的

368

图片缩放技术实战:放大与缩小的实现详解

回顾这场从像素操作到系统设计的技术之旅,我们会发现:图像缩放这件事,表面看是“改变大小”,实质却是“信息重建”的艺术。它教会我们的不仅是某个算法怎么写,更是如何在质量、速度、资源三者之间做出权衡的艺术。就像人生中的许多选择一样,没有完美解,只有最合适当下情境的答案。未来的发展方向也非常明确:更智能的 AI-based 超分算法(如 ESRGAN、Real-ESRGAN)正在逐步进入生产环境;

weixin_30789053的博客 409

ImageViewerPage:全屏黑色背景 + Swiper 图片轮播

本文介绍了「海风日记」中图片查看器页面的设计与实现,采用全屏黑色背景+Swiper轮播的核心架构。页面分为四部分:顶部操作栏、主图轮播区、分页指示器+缩略图条、底部操作栏。关键实现包括:禁用Swiper循环模式保证浏览顺序清晰,使用Contain模式完整显示图片,分页圆点通过动画平滑切换,缩略图条支持横向滚动和自动定位当前项。整体设计遵循iOS风格,通过单击切换UI显隐实现沉浸式体验,同时保持功能完整性和操作流畅性。

weixin_54000324的博客 196

iOS之彻底弄懂resizableImageWithCapInsets

Demo程序源码 博文链接:https://zhong871004.iteye.com/blog/2287009

谈UIView Animation编程艺术

原文链接:http://www.jianshu.com/p/51ce7966a038 “Action!”,欢迎收看这期大型扯谈实用类技术节目,《小明讲故事》,大家好我是小明! 有人会这么问,“小明,no zuo no die,你觉得哪个城市的人最作?”。“我觉得~伦敦的人比较作,相当作,作得有风格,作得有国际范!因为~有一个伦敦人叫

iOS_开发 262

iOS图片拉伸的4种方法

主要为大家详细介绍了iOS图片拉伸的4种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

手把手教你用scATAC-seq分析拟南芥根尖染色质可及性(附代码实战)

本文详细介绍了使用scATAC-seq技术分析拟南芥根尖染色质可及性的完整流程,涵盖从实验设计、数据质控、细胞分群到差异分析和多组学整合的实战步骤。通过具体的代码示例,帮助植物研究者掌握单细胞表观组学分析的核心方法,揭示细胞异质性和基因调控动态。

weixin_29291185的博客 265

HTML5 视频播放全攻略:从基础标签到跨浏览器兼容

本文全面解析HTML5视频播放技术,从基础<video>标签使用、MP4/WebM/OGG多格式兼容方案,到JavaScript进阶控制与跨浏览器实战技巧。重点探讨了移动端适配、性能优化及第三方播放器选型,帮助开发者构建流畅、兼容的网页视频播放体验。

docker7nomad的博客 1041

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 1013

响应式Web初级入门

当你乘坐各种交通工具(公交、地铁、轻轨、火车)时你会发现,人们都个个低下头在玩自己的手机、平板、Kindle,没错,你正在处于一个多终端设备的时代!手机用户连年上升,前几天我们在感叹以前玩沙包、陀螺,现在小孩的娱乐就是玩手机–。另外,微软的Xbox和任天堂的Wii等游戏设备也有自己的浏览器。设备真的来了。

hacke2' Blog 4253

达梦慢sql和统计信息收集

各计划节点的执行顺序为:缩进越多的越先执行,同样缩进的上面的先执行,下面的后执行,上下的优先级高于内外。在建立索引的时候,要考虑索引的最左匹配原则(在使用 SQL 语句时,如果 where 部分的条件不符合最左匹配原则,可能导致索引失效,或者不能完全发挥建立的索引的功效);执行计划是 SQL 语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。生产系统中,对于频繁变动的数据表,多次执行计划可能会出现不一致的问题,这往往是由于统计信息不准导致的,索引定期收集统计信息就很有必要了。

m0_37680131的博客 1715

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 730

favicon配置全指南:多格式兼容与跨浏览器精准显示

favicon(网站图标)是Web页面最基础的视觉标识,本质是HTML中通过<link>声明的资源关系,其加载依赖DOCTYPE声明、UTF-8编码及标准HTML结构等底层规范。它并非简单图片引用,而是涉及尺寸适配(16×16至192×192)、格式选择(.ico/.png/SVG)、MIME类型(image/x-icon)、路径语义(根相对URI)与平台扩展(apple-touch-icon、manifest)的系统工程。技术价值在于建立用户第一印象可信度、提升书签点击率与PWA安装成功率,并成为调试网络

aibi9196的博客 679

从微服务到 Agent 服务:架构思维的迁移

微服务的概念最早在2014年由Martin Fowler提出,核心是“将单体应用拆分为一组小的服务,每个服务运行在独立的进程中,服务之间采用轻量级的通信机制互相协作,每个服务围绕具体业务构建,并且可以独立部署到生产环境”。单一职责:每个微服务只负责一个业务领域的功能,比如订单服务只处理订单相关的逻辑,用户服务只处理用户相关的逻辑被动响应:微服务是“哑的”,只有收到外部请求的时候才会执行逻辑,本身没有主动决策的能力固定流程:微服务的逻辑是硬编码的,执行流程是提前定义好的,只能按照程序员写的代码处理请求。

AI智能探索者的博客 275
上一篇: iOS经典讲解之UIButton改变图片和文字的位置
下一篇: iOS 中 Autolayout 优先级的使用
刘新林
博客等级 码龄11年 72粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值