iPhone开发:可拉伸的图片

2023-05-16

还记得在Windows下用MFC或WTL写用户界面程序的时候,为了给可改变大小的对话框加上背景图案,需要对设计师提供的图片进行裁剪。把图片切成九块,其中四个角是不拉伸的,四条棱边可以在一个方向上拉伸,中间区域则可任意拉伸。其过程是相当烦琐的。在Mac下,一切都变的及其简单,UIImage类已经为我们提供了处理拉伸的方法。

以下内容适用于iOS 2.0+,或在iOS 5.0+中使用替换的方法。

UIImage有一个叫做端帽(end cap)的概念,利用它来指定图片中哪一部分(通常在图片的中央)是可以拉伸的,哪些部分(四周一圈)不可拉伸。在iOS 5.0以前,通过stretchableImageWithLeftCapWidth:topCapHeight:来得到可以按照指定方式拉伸的图片。特别要注意的一点,我在第一次用它的时候没有注意到,就是这个方法并不会改变当前的UIImage实例,而是会返回一个新的实例。这样的设计可能是为了让通过imageNamed方法得到的UIImage实例能够最大限度地复用吧。

stretchableImage方法有两个整数参数,分别用来指定图片的左边和上边分别有多少点(points)是不能被拉伸的(端帽宽度)。并没有参数用来指定右边和下边的端帽宽度,开始我误以为右边和下边的端帽宽度就分别等于左边和上边的端帽宽度,然而仔细阅读官方文档之后发现并非如此:

The middle (stretchable) portion is assumed to be 1 pixel wide. The right end cap is therefore computed by adding the size of the left end cap and the middle portion together and then subtracting that value from the width of the image:


  
  
rightCapWidth = image.size.width - (image.leftCapWidth + 1 );

The middle (stretchable) portion is assumed to be 1 pixel wide. The bottom end cap is therefore computed by adding the size of the top end cap and the middle portion together and then subtracting that value from the height of the image:


  
  
bottomCapHeight = image.size.height - (image.topCapHeight + 1 );

原来已经规定了中间可拉伸区域必须是1x1的,因此右边和下边的端帽宽度就由图片的宽度和高度、左边和上边的端帽宽度决定。在设计非对称图案时需要注意一下。

从iOS 5.0开始,stretchableImage方法被弃用,取而代之的是resizableImageWithCapInsets:。后者只需要一个UIEdgeInsets类型的参数,通过此参数,可以设置四个端帽的宽度。而中心剩余的部分都是可以拉伸的(不再局限于1x1大小)。

下面这个程序片段给试图添加了三个UIImageView,分别显示原始大小的图片、无端帽拉伸之后的图片、和指定了正确的端帽宽度(用stretchableImage)后拉伸的图片。


- (void)viewDidLoad {   
    [super viewDidLoad];   // Do any additional setup after loading the view, typically from a nib.     
    UIImage* image = [UIImage imageNamed:@"circle.png"];   
    UIImage* stretchableImage = [image stretchableImageWithLeftCapWidth:10 topCapHeight:10];     
    UIImageView* imageView1 = [[[UIImageView alloc] initWithImage:image] autorelease];   
    imageView1.center = CGPointMake(20, 20);   
    [self.view addSubview:imageView1];    
    
    UIImageView* imageView2 = [[[UIImageView alloc] initWithImage:image] autorelease];   
    imageView2.frame = CGRectMake(0, 0, 260, 200);   
    imageView2.center = CGPointMake(160, 120);   
    [self.view addSubview:imageView2];     
    
    UIImageView* imageView3 = [[[UIImageView alloc] initWithImage:stretchableImage] autorelease];   
    imageView3.frame = CGRectMake(0, 0, 260, 200);   
    imageView3.center = CGPointMake(160, 340);   
    [self.view addSubview:imageView3];
}


 
 
  

运行后效果如下图示:

resizable_image

UIImage拉伸示意(左上角:原始图片;上:直接拉伸;下:按照端帽拉伸)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone开发:可拉伸的图片 的相关文章

随机推荐

  • 第三章实验

    第一题 span class token keyword class span span class token class name Student span span class token punctuation span span
  • 洛谷P1025 数的划分(DFS+剪枝)

    题目描述 将整数 nn 分成 kk 份 xff0c 且每份不能为空 xff0c 任意两个方案不相同 xff08 不考虑顺序 xff09 例如 xff1a n 61 7n 61 7 xff0c k 61 3k 61 3 xff0c 下面三种分
  • Armbian 更换清华大学源

    修改 sources list 文件 sudo nano etc apt sources list 把官方源前面加上 号注释掉 xff0c 最下面加上下面的清华大学源列表 清华大学源 deb https mirrors tuna tsing
  • sem_wait sem_post信号量操作进本函数

    sem wait sem post 信号量的数据类型为结构sem t xff0c 它本质上是一个长整型的数 函数sem init xff08 xff09 用来初始化一个信号量 它的原型为 xff1a extern int sem init
  • Windows下重启Linux子系统(WSL)

    Linux子系统 xff08 WSL xff09 是基于 LxssManager 服务运行的 重启WSL的话只需要将 LxssManager 重启即可 命令重启 以管理员权限运行cmd命令即可 停止LxssManager服务 net sto
  • Mac安装dmg程序提示无可装载的文件系统

    安装dmg程序是提示 无可装在的文件系统 1 查看SIP状态 在终端中输入csrutil status xff0c 就可以看到是 enabled 还是 disabled 2 关闭SIP 重启MAC xff0c 按住commond 43 R直
  • windows恶意软件删除工具 MRT.EXE

    MRT 是微软自Windows7开始就自带的一款绿色的恶意软件删除工具 具体路径为C WINDOWS system32 MRT exe 默认已经在系统环境变量中 所以我们直接 win 43 R 输入 mrt 即可运行 操作也极其简单 xff
  • BitLocker正在等待激活,怎样可以关闭?

    问题 xff1a 装完win10系统后有时候会显示 BitLocker正在等待激活 一直有个黄色的小锁图标看着有些头疼 xff0c 怎样才能取消启用Bitlocker呢 xff0c 也没有关闭的按钮 处理方法 控制面板 在 Bitlocke
  • PROXMOX 开源虚拟服务器系统安装及配置

    前言 说到学习Linux xff0c 在适应图形化界面后 xff0c 我们逐渐可以通过一些shell命令来操作Linux系统 xff0c 此时何曾不想多尝试几个不同的Linux系统 xff0c 但是每每安装配置虚拟机又很麻烦 xff0c 如
  • Deepin 深度操作系统安装教程

    简介 深度操作系统 deepin 是一个致力于为全球用户提供美观易用 安全稳定服务的Linux发行版 xff0c 同时也一直是排名最高的来自中国团队研发的Linux发行版 xff0c 下面我们开始从下载镜像到安装系统一步步进行讲解 系统下载
  • 香橙派 OrangPi PC 安装Lakka游戏系统及使用指南

    香橙派 Orange Pi PC Orange Pi PC 采用了全志四核A7高性能处理器Allwinner H3 xff0c 集成以太网 DC电源输入 视频 音频输出等接口 xff0c 支持HDMI AVOUT视频输出等功能 尽管体积很小
  • 我把华为云的Ubuntu 18.04升级到了Ubuntu 22.04

    华为云建站有些年头了 xff0c 当时装的是ubuntu18 04 xff0c 停止维护更新日期是2023年4月 xff0c 只剩半年时间就该停服了 xff0c 这么看来是时候升级以下系统版本了 xff0c 不然升级版本都可能会有问题 由于
  • Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法

    之前将ubuntu server 22 04 安装了 Budgie Desktop 桌面环境 xff0c 系统语言是英文的 xff0c 如果要作为桌面使用还有些不适应 xff0c 我们要如何将系统语言切换为中文并支持中文输入呢 xff1f
  • OpenKylin常用软件安装

    由于OpenKylin仍处于测试阶段 xff0c 应用商店软件并不全 xff0c 所以很多软件的安装非常麻烦 xff0c 以下列出了一些常用软件的安装方法 需要的童鞋可以直接复制命令后进行安装 xff0c 安装软件需要使用root权限 xf
  • 利用sourceinsight宏(Quicker.em)提高编码效率和质量

    利用sourceinsight宏 Quicker em 提高编码效率和质量 Marco是sourceinsight软件一个强大的功能 xff0c 用户可以通过编写宏来实现自定义功能 这里有个比较流行的宏文件quicker em xff0c
  • Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

    如果您在尝试克隆Git存储库时得到 SSL certificate problem unable to get local issuer certificate 的错误 这意味着Git无法验证远程存储库的SSL证书 如果SSL证书是自签名的
  • 树莓派从源码构建安装Git最新版

    1 查看Git版本 首先我们通过SSH客户端连接树莓派 在树莓派中通过查看 Git 版本信息 xff0c 我们只能看到最高版本显示为 2 30 2 xff0c 并且通过apt安装也无法将Git更新到最新版 git version sudo
  • linux安装部署免费confluence wiki

    Centos7安装部署免费confluence wiki 知识库 详细操作步骤 前言 xff1a confluence是团队协作软件 xff0c 改变团队工作方式 xff0c 作为现代化办公不可缺少的工具 wiki所需的安装包 xff1a
  • 对printf源码的分析

    对printf源码的分析 一 printf的源码如下 span class token macro property span class token directive keyword include span span class to
  • iPhone开发:可拉伸的图片

    还记得在Windows下用MFC或WTL写用户界面程序的时候 xff0c 为了给可改变大小的对话框加上背景图案 xff0c 需要对设计师提供的图片进行裁剪 把图片切成九块 xff0c 其中四个角是不拉伸的 xff0c 四条棱边可以在一个方向