当前位置: 首页 > 编程日记 > 正文

IOS类似9.png

图形用户界面中的图形有两种实现方式,一种是用代码画出来,比如Quartz 2D技术,狠一点有OpenGL ES,另一种则是使用图片。 
代码画的方式比较耗费程序员脑力,CPU或GPU; 图片则耗费磁盘空间,会增加app的体积.一般的app我们会偏重于使用图片来构建用户界面. 
设计师一般会使用PS来设计界面,所以在直接使用之前,有一个PSD到png的切图(Image Slicing)过程.下面是切图过程中可能要注意的几点. 

一.可重复元素

在用户界面的图形元素中,重复随处可见 ,所以我们利用好框架提供的接口, 以比较高的性价比创建用户界面。

1.Color Pattern

Color Pattern在Web设计中也经常会遇到比如网页的背景,甚至网络中可以找到专门收集各类可重复的纹理图案的站点,比如 http://subtlepatterns.com. 下面这是一个小图片模板

circles

UIColor *circleColorPattern = [UIColor colorWithPatternImage: [UIImage imageNamed:@"circle_pattern.png"]];

这样便可以得到一个颜色模板,用这个颜色画或者填充某个区域的时候,模板图片会在指定的区域中进行平铺.比如把一个View的背景颜色设置成上面这个颜色,便会得到如下结果

circles_fill

2.resizableImage

除了整体平铺之外,很多时候我们希望某个图片的局部进行平铺,而其余部分则保持不变. 比如常见的按钮,聊天的气泡背景或者图片的阴影边框. 这里举个按钮的例子,一般情况下为了方便做按钮就直接切个按钮背景,如下图button-blue但是自己看,你会发现按钮中间大都数像素都是横向重复的,所以可以使用iOS的图片接口来使用体积更小的图片实现相同的效果. 首先使用PS的切图工具进行切图,下图中的切图逻辑是,左边切14像素(13像素加1像素,1像素为中间重复部分),右边切13像素.

Retina屏幕下一个单位对应着两个像素,这里的例子是非Retina下的情况,请注意

button-blue-slicing



切图后将左右合并,变成最终所需要的图片

button-blue-sliced

图片宽度为27像素宽,中间第14个像素为中间重复的部分.

UIImage *buttonBackgroundImage = [[UIImage imageNamed:@"button_bkg.png"]  resizableImageWithCapInsets:UIEdgeInsetsMake(0,13,0,13)]; [button setBackgroundImage:buttonBackgroundImage  forState:UIControlStateNormal];

resizableImageWithCapInsets:的参数是一个UIEdgeInsets的结构体类型,被capInsets覆盖到的区域将会保持不变,而未覆盖到的部分将会被用来平铺.

在iOS 5.0之前并没有这个方法,而是使用的另一个方法

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

这个方法有局限性,它只能指定leftCapWidth和topCapHeight,然后只有一个像素能够重复,也就是rightCapWidth为 imageWidth-leftCapWidth-1,而bottomCapHeight为 imageHeight - topCapHeight -1,所以重复的始终是中间的那一个像素.



二.图片边缘锯齿和抗锯齿问题

1.需要抗锯齿

有时候需要在旋转的动画中使用到图片,比如按钮的旋转,图片的旋转,为了避免在旋转的过程中出现边缘锯齿,我们需要在切图的时候,在边缘上多留至少一像素的透明像素,因为iOS在处理图片的时候对于外边缘是不做抗锯齿处理的,但是对于图片内部的边缘则会做抗锯齿处理.

2.需要去除抗锯齿效果

当某个imageView的frame的origin.x或者origin.y 不为整数的时候,会出现你不想要的抗锯齿效果,这个时候本来清晰的图片边缘会变得模糊,而这不是你想要的,所以这个时候我们就要对frame的起点进行取整。

转载于:https://www.cnblogs.com/lgphp/p/4109607.html

相关文章:

Shell 编程

Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。它类似于 DOS 下的 command 和后来的 cmd.exe。Shell 既是一种命令语言,又是一种程序设计语言。Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell 脚本编…

表现层框架Struts/Tapestry/JSF架构比较 [转]

http://www.jdon.com/artichect/sjt.htm Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术。从诞生时间上看,Struts应该比较早,使用得非常广泛,Tapestry 3.0逐渐引起广泛的重视,正当Tapestry即将大显身手时期,S…

1022 Digital Library

1. 关键数据结构 map<string,vector<string> > mp[6] 其中mp[1]代表从书名映射到id&#xff08;id可能无&#xff0c;可能不止一个&#xff0c;所以要用vector&#xff09;&#xff0c;mp[2]是从作者映射到id……mp[5]代表从year映射到id。 2. 卡住的第一个地方是…

event.keyCode用法及列表

用户名&#xff1a;<input type"text" id"UserAccount" onKeyPress"JumpByEnter(UserPwd)" />密码&#xff1a;<input name"UserPwd" type"password" onKeyPress"IsEnterKeyPress()"> JavaScript&…

网络游戏术语(转)

转自&#xff1a;https://site.douban.com/149989/widget/notes/8053161/note/231207595/ AC – Armor Class&#xff0c;盔甲等级、级别Account – 账号&#xff0c;与密码Password相对Add – 一只玩家加入到组队中&#xff0c;如果请求别人组队&#xff0c;可说Add me pls.AO…

vim的一些快捷键,备忘

vim的一些快捷键&#xff0c;备忘 快捷键 作用ctrlg 显示当前行的信息G 跳到某一行:%s/oldtxt/newtxt/g …

1051 Pop Sequence(两种双指针思路)

目录 思路一&#xff1a;以入栈序列为总纲&#xff0c;2层循环&#xff0c;外for内while 思路二&#xff1a;一层while 思路一&#xff1a;以入栈序列为总纲&#xff0c;2层循环&#xff0c;外for内while 注意弹栈之前要判空&#xff0c;不然会出现段错误。 AC代码 #inclu…

iOS底层原理 - 常驻线程

iOS底层原理 - 常驻线程 在 AFN 2.0 时代&#xff0c;会经常看到 AFN 创建一个常驻线程的方式&#xff1a; 0️⃣ AFN 2.0 时代的常驻线程 (NSThread *)networkRequestThread {static NSThread *_networkRequestThread nil;static dispatch_once_t oncePredicate;dispatch_on…

A monad tutorial for Clojure programmers (part 3)

Before moving on to the more advanced aspects of monads, let’s recapitulate what defines a monad (see part 1 and part 2 for explanations): A data structure that represents the result of a computation, or the computation itself. We haven’t seen an example…

Flex精华摘要--使用AS脚本

在MXML文件中实现ActionScript逻辑的几种方法&#xff1a;最简单的方法&#xff0c;在一个MXML文件中通过组件的事件直接书写简单的逻辑控制&#xff0c;但是并不推荐。 <?xml version"1.0" encoding"utf-8"?> <mx:Application xmlns:mx"h…

(C++)自定义链表并写入

确定链表节点的组成&#xff0c;一般由数据和指针构成 struct node{int data;//数据域node* next;//指针域 }; 使用new运算符为节点分配内存空间 node* p new node; 编写创建列表函数&#xff0c;参数为链表的长度(从用户输入读入)&#xff0c;返回值为创建的列表的头指针…

Unicode转义(\uXXXX)的编码和解码

在涉及Web前端开发时, 有时会遇到\uXXXX格式表示的字符, 其中XXXX是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和\n \r同属于转义字符. 在其他语言中也有类似的, 可能还有其它变形的格式. 多数时候遇到需要解码的情况多点, 所以会先介绍解码decode, 后介绍…

BZOJ 2004 [Hnoi2010]Bus 公交线路

题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id2004 题解 状压dp&#xff0c;记f[i][S]f[i][S]f[i][S]表示[1,i−p][1,i-p][1,i−p]的车都被安排好了&#xff0c;而[i−p1,i][i-p1,i][i−p1,i]的车中&#xff0c;SSS中有111的位置都安排有车停&#xff0c;并且恰…

【转载】C语言编译全过程

今天在blog.chinaunix.net/u3博客看到一篇关于语言编译过程的文章&#xff0c;觉得精简&#xff0c;清晰所以摘录下来我的blog。作为一个程序员了解编译过程对程序的编写也很有帮助。下面是博文的内容&#xff1a;编译的概念&#xff1a;编译程序读取源程序&#xff08;字符流&…

5层模型中数据从源主机到目的主机之旅

报文是用户发送的数据 传输层可能对报文进行拆分&#xff0c;加上段头 网络层会加上网络层的头&#xff0c;构成的协议数据单元叫做数据报 链路层会加头加尾构造帧 路由器的链路层会去掉帧头帧尾&#xff0c;还原到网络层数据报 再次封装成链路层的数据帧 目的主机的链路层再…

JavaScript模式读书笔记 第5章 对象创建模式

1&#xff0c;命名空间模式 namespace <script>var myApp {};//通过全局变量来实现命名空间maApp.Parent function (){};myApp.Child function(){};</script>通用命名空间函数<script>//不安全代码var myApp {};//安全代码if(typeof myApp "undef…

174. Dungeon Game

一、题目 1、审题 2、分析 只能向右、向下移动的王子&#xff0c;从左上角要到右下角救公主&#xff0c;每经过一个方格&#xff0c;可能获得血瓶加血量&#xff0c;或者碰到怪物减血量&#xff0c;当王子血量 < 1 时就挂了&#xff0c;为了能成功救得公主&#xff0c;求王子…

DotNetNuke安装与下载

【下载专区】 DotNetNuke (DNN) 5.1 稳定版正式发布 http://www.dnnmix.com/dotnetnuke-dnn-51-released/ DotNetNuke (DNN) 资源共享 http://www.dnnmix.com/resources/ DotNetNuke官方下载 http://www.dotnetnuke.com/tabid/125/default.aspx 【安装教程】 DotNetNuke安装大…

1025 反转链表

1. 第一次做链表题&#xff0c;但是这题其实也就是套了个链表的壳子&#xff0c;虽然在结点的结构体里面有下一节点地址next这个属性&#xff0c;但是也只在最初给结点标序号时用到&#xff0c;由于没有真正对链表实施倒序&#xff0c;所以后面输出的下一结点的地址实际上只是算…

关于margin

<html><body><div style"width:200px;height:200px;background-color:red;> <div style"width:100px;height:100px;background-color:black;margin-left:300px;"></div></div></body></html> 左边是火狐显示&a…

DNS迭代式和递归式域名查询对比

背景知识&#xff1a;DNS数据库是树状的层次式的 本地域名服务器并不在这个体系当中&#xff0c;它相当于这个体系面向用户的代理。 迭代式&#xff1a;DNS server告诉用户&#xff1a;我不认识这域名&#xff0c;但我知道你可以问哪个DNS服务器 递归式&#xff1a;用户告诉D…

UIActionSheet在iOS8中被弃用造成的错误

UIActionSheet在iOS7.0中效果图如下&#xff1a; UIActionSheet在iOS8中效果图如下&#xff1a; 造成这样的原因&#xff0c;是因为此控件在iOS8中被弃用了&#xff0c;而使用了UIAlertViewController替代的原因&#xff0c;具…

SQL分页语句(转)

有关分页 SQL 的资料很多&#xff0c;有的使用存储过程&#xff0c;有的使用游标。本人不喜欢使用游标&#xff0c;我觉得它耗资、效率低&#xff1b;使用存储过程是个不错的选择&#xff0c;因为存储过程是经过预编译的&#xff0c;执行效率高&#xff0c;也更灵活。先看看单条…

一个考查作用域以及闭包的题目

var a 2;var func (function(){ var a 3; return function(){a;console.log(a); } })(); func();func(); 1.涉及的知识点&#xff1a; &#xff08;1&#xff09;JS变量的作用域 &#xff08;2&#xff09;闭包2.变量的作用域&#xff0c;通俗来说就是变量所能起到作用的范围…

弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态

目录 进程实体的三个部分 1.PCB 2.程序段 3.相关的数据段 进程的四大特征 1.动态性 2.并发性 3.独立性 4.异步性 进程的状态(3个基本挂起) 1.三个基本状态 2.挂起状态 进程实体的三个部分 1.PCB 作用是让参与并发执行的每个程序独立运行&#xff0c;或者说&…

解决Failed to execute goal org.apache.maven.plugins

1.Maven构建失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin: 2.3 . 2 :compile ( default-compile) on project oecp: Compilation failure 2.解决方法 把jdk换成自己安装的jdk 换后&#xff0c;再maven install就可以了转载于:https://www.cnb…

P4722 【模板】最大流

P4722 【模板】最大流 加强版 / 预流推进 今日心血来潮&#xff0c;打算学习hlpp 然后学了一阵子。发现反向边建错了。容量并不是0.qwq 然后就荒废了一晚上。 算法流程的话。有时间补上 #include<cstdio> #include<algorithm> #include<iostream> #include&l…

与我们的书合影——在2009北京国际图书展(BIBF)

2009年9月5日&#xff0c;武汉博文编辑许莹、夏青观看了于国展旧馆&#xff08;静安庄&#xff09;举行的2009北京国际图书展&#xff08;BIBF&#xff09;“专业场”。在电子工业出版社展台&#xff0c;编辑兴奋地与我们的几本畅销书&#xff08;《把时间当作朋友》、《走出软…

弄懂“进程”(下):进程的控制、同步和通信

进程控制 是进程管理的主要功能&#xff0c;负责创建和终止进程、进程执行过程中的状态转换。 由操作系统内核通过原语实现。 1.OS内核 常驻内存的、紧靠硬件的软件层次&#xff0c;运行在系统态(又称管态、内核态)&#xff0c;以免遭到用户程序的破坏。 主要包括&#xf…

(转自Timon's wang blogs)C#实现web信息自动抓取

原文转自&#xff1a;http://www.csharp.net.cn/post/C实现web信息自动抓取.html主要为了学习一下相关的网络蜘蛛&#xff0c;为自己获取信息使用背景 随着Internet的普及&#xff0c;网络信息正以极高的速度增长&#xff0c;在这么多数据中找到自己需要的信息是一件很繁琐的事…