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

iOS开发UI篇—transframe属性(形变)

iOS开发UI篇—transframe属性(形变)

1. transform属性

在OC中,通过transform属性可以修改对象的平移、缩放比例和旋转角度

常用的创建transform结构体方法分两大类

(1) 创建“基于控件初始位置”的形变

CGAffineTransformMakeTranslation(平移)

CGAffineTransformMakeScale(缩放)

CGAffineTransformMakeRotation(旋转)

(2) 创建“基于transform参数”的形变

CGAffineTransformTranslate

CGAffineTransformScale

CGAffineTransformRotate

补充:

在OC中,所有跟角度相关的数值,都是弧度值,180° = M_PI

正数表示顺时针旋转

负数表示逆时针旋转

提示:由于transform属性可以基于控件的上一次的状态进行叠加形变,例如,先旋转再平移。因此在实际动画开发中,当涉及位置、尺寸形变效果时,大多修改控件的transform属性,而不是frame、bounds、center 。

2.代码示例

//
//  YYViewController.m
//  01-练习使用按钮的frame和center属性
//
//  Created by apple on 14-5-21.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"//私有扩展
@interface YYViewController ()@property(nonatomic,weak)IBOutlet UIButton *headImageView;
@end@implementation YYViewController//枚举类型,从1开始
//枚举类型有一个很大的作用,就是用来代替程序中的魔法数字
typedef enum
{ktopbtntag=1,kdownbtntag,krightbtntag,kleftbtntag
}btntag;//viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作
- (void)viewDidLoad
{//在viewDidLoad方法中,不要忘记调用父类的方法实现
    [super viewDidLoad];//手写控件代码//一、写一个按钮控件,上面有一张图片//1.使用类创建一个按钮对象// UIButton *headbtn=[[UIButton alloc] initWithFrame:CGRectMake(100 ,100, 100, 100)];//设置按钮对象为自定义型UIButton *headbtn=[UIButton buttonWithType:UIButtonTypeCustom];//2.设置对象的各项属性//(1)位置等通用属性设置headbtn.frame=CGRectMake(100, 100, 100, 100);//(2)设置普通状态下按钮的属性[headbtn setBackgroundImage:[UIImage imageNamed:@"i"] forState:UIControlStateNormal];[headbtn setTitle:@"点我!" forState:UIControlStateNormal];[headbtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];//(3)设置高亮状态下按钮的属性[headbtn setBackgroundImage:[UIImage imageNamed:@"a"] forState:UIControlStateHighlighted];[headbtn setTitle:@"还行吧~" forState:UIControlStateHighlighted];[headbtn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];//3.把对象添加到视图中展现出来
    [self.view addSubview:headbtn];//注意点!self.headImageView=headbtn;//二、写四个控制图片左右上下移动方向的按钮控件/**================向上的按钮=====================*///1.创建按钮对象UIButton *topbtn=[UIButton buttonWithType:UIButtonTypeCustom];//2.设置对象的属性topbtn.frame=CGRectMake(100, 250, 40, 40);[topbtn setBackgroundImage:[UIImage imageNamed:@"top_normal"] forState:UIControlStateNormal];[topbtn setBackgroundImage:[UIImage imageNamed:@"top_highlighted"] forState:UIControlStateHighlighted];[topbtn setTag:1];//3.把控件添加到视图中
    [self.view addSubview:topbtn];//4.按钮的单击控制事件
    [topbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];/**================向下的按钮=====================*///1.创建按钮对象UIButton *downbtn=[UIButton buttonWithType:UIButtonTypeCustom];//2.设置对象的属性downbtn.frame=CGRectMake(100, 350, 40, 40);[downbtn setBackgroundImage:[UIImage imageNamed:@"bottom_normal"] forState:UIControlStateNormal];[downbtn setBackgroundImage:[UIImage imageNamed:@"bottom_highlighted"] forState:UIControlStateHighlighted];[downbtn setTag:2];//3.把控件添加到视图中
    [self.view addSubview:downbtn];//4.按钮的单击控制事件
    [downbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];/**================向左的按钮=====================*///1.创建按钮对象UIButton *leftbtn=[UIButton buttonWithType:UIButtonTypeCustom];//2.设置对象的属性leftbtn.frame=CGRectMake(50, 300, 40, 40);[leftbtn setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal];[leftbtn setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted];[leftbtn setTag:4];//3.把控件添加到视图中
    [self.view addSubview:leftbtn];//4.按钮的单击控制事件
    [leftbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];/**================向右的按钮=====================*///1.创建按钮对象UIButton *rightbtn=[UIButton buttonWithType:UIButtonTypeCustom];//2.设置对象的属性rightbtn.frame=CGRectMake(150, 300, 40, 40);[rightbtn setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal];[rightbtn setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted];[rightbtn setTag:3];//3.把控件添加到视图中
    [self.view addSubview:rightbtn];//4.按钮的单击控制事件
    [rightbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];//三、写两个缩放按钮/**================放大的按钮=====================*///1.创建对象UIButton *plusbtn=[UIButton buttonWithType:UIButtonTypeCustom];//2.设置属性plusbtn.frame=CGRectMake(75, 400, 40, 40);[plusbtn setBackgroundImage:[UIImage imageNamed:@"plus_normal"] forState:UIControlStateNormal];[plusbtn setBackgroundImage:[UIImage imageNamed:@"plus_highlighted"] forState:UIControlStateHighlighted];[plusbtn setTag:1];//3.添加到视图
    [self.view addSubview:plusbtn];//4.单击事件
    [plusbtn addTarget:self action:@selector(Zoom:) forControlEvents:UIControlEventTouchUpInside];/**================缩小的按钮=====================*/UIButton *minusbtn=[UIButton buttonWithType:UIButtonTypeCustom];minusbtn.frame=CGRectMake(125, 400, 40, 40);[minusbtn setBackgroundImage:[UIImage imageNamed:@"minus_normal"] forState:UIControlStateNormal];[minusbtn setBackgroundImage:[UIImage imageNamed:@"minus_highlighted"] forState:UIControlStateHighlighted];[minusbtn setTag:0];[self.view addSubview:minusbtn];[minusbtn addTarget:self action:@selector(Zoom:) forControlEvents:UIControlEventTouchUpInside];/**================向左旋转按钮=====================*/UIButton *leftrotatebtn=[UIButton buttonWithType:UIButtonTypeCustom];[leftrotatebtn setFrame:CGRectMake(175, 400, 40, 40)];[leftrotatebtn setBackgroundImage:[UIImage imageNamed:@"left_rotate_normal"] forState:UIControlStateNormal];[leftrotatebtn setBackgroundImage:[UIImage imageNamed:@"left_rotate_highlighted"] forState:UIControlStateHighlighted];[leftrotatebtn setTag:1];[self.view addSubview:leftrotatebtn];[leftrotatebtn addTarget:self action:@selector(Rotate:) forControlEvents:UIControlEventTouchUpInside];/**================向右旋转按钮=====================*/UIButton *rightrotatebtn=[UIButton buttonWithType:UIButtonTypeCustom];[rightrotatebtn setFrame:CGRectMake(225, 400, 40, 40)];[rightrotatebtn setBackgroundImage:[UIImage imageNamed:@"right_rotate_normal"] forState:UIControlStateNormal];[rightrotatebtn setBackgroundImage:[UIImage imageNamed:@"right_rotate_highlighted"] forState:UIControlStateHighlighted];[rightbtn setTag:0];[self.view addSubview:rightrotatebtn];[rightrotatebtn addTarget:self action:@selector(Rotate:) forControlEvents:UIControlEventTouchUpInside];
}//控制方向的多个按钮调用同一个方法
-(void)Click:(UIButton *)button
{//练习使用frame属性//CGRect frame=self.headImageView.frame;/**注意,这里如果控制位置的两个属性frame和center同时使用的话,会出现很好玩的效果,注意分析*///练习使用center属性CGPoint center=self.headImageView.center;switch (button.tag) {case ktopbtntag:center.y-=30;break;case kdownbtntag:center.y+=30;break;case kleftbtntag://发现一个bug,之前的问题是因为少写了break,造成了它们的顺序执行,sorry//center.x=center.x-30;center.x-=50;break;case krightbtntag:center.x+=50;break;}//  self.headImageView.frame=frame;//首尾式设置动画效果
    [UIView beginAnimations:nil context:nil];self.headImageView.center=center;//设置时间[UIView setAnimationDuration:2.0];[UIView commitAnimations];NSLog(@"移动!");}
-(void)Zoom:(UIButton *)btn
{//使用bounds,以中心点位原点进行缩放CGRect bounds = self.headImageView.bounds;if (btn.tag) {bounds.size.height+=30;bounds.size.width+=30;}else{bounds.size.height-=50;bounds.size.width-=50;}//设置首尾动画
    [UIView beginAnimations:nil context:nil];self.headImageView.bounds=bounds;[UIView setAnimationDuration:2.0];[UIView commitAnimations];
}-(void)Rotate:(UIButton *)rotate
{//位移(不累加)//self.headImageView.transform=CGAffineTransformMakeTranslation(50, 200);//缩放//self.headImageView.transform=CGAffineTransformMakeScale(1.2, 10);//在原有的基础上位移(是累加的)//self.headImageView.transform=CGAffineTransformTranslate(self.headImageView.transform, 50, 50);//在原有的基础上进行缩放//self.headImageView.transform=CGAffineTransformScale(self.headImageView.transform, 1.5, 1.6);//在原有的基础上进行旋转if (rotate.tag) {//旋转角度为1/pi,逆时针self.headImageView.transform=CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);}else{//旋转的角度为pi/2,顺时针self.headImageView.transform=CGAffineTransformRotate(self.headImageView.transform, M_PI_2);}}
@end

实现效果:

3.viewDidLoad

viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作

在viewDidLoad方法中,一定不要忘记调用父类的方法实现

[super viewDidLoad];

转载于:https://www.cnblogs.com/yipingios/p/5547432.html

相关文章:

docker一步安装mysql,docker的魅力就在于此

正常来说,使用docker安装东西的步骤是serach它有没有,然后pull它 这里其实只要一步(如果你没有安装过、没有端口占用等问题的话!!) $ docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORDroo…

python-day05正则表达式

相关参考文档地址:http://bbs.fishc.com/thread-57073-1-1.html(小甲鱼论坛) 摘录老师之精华 re模块用于对python的正则表达式的操作。 字符: . 匹配除换行符以外的任意字符  \w 匹配字母或数字或下划线或汉字  \s 匹配任意的空白符  \…

Vim编辑器的常用快捷键.

Linux中的文本操作离不开Vim编辑器的使用. Vim编辑器的使用相对门槛较高.需要挺长一段时间的适应. 总结一些Vim使用过程中常用的命令(这些命令基本上都是在vim的命令模式下使用) 1.跳转到文本的开头gg 2.跳转到文本的末尾G (shiftg) 3.查看文本的总共有多少行(:set nu) 关于这个…

在docker上安装部署tomcat项目 超简单,拿来主义

在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可。以下将详细讲解流程: 在windows中打好包以后用winSPC拖放到linux系统中,我的直接放在了/home/ub…

docker停止、删除容器、删除镜像 一看就理解

当你的容器中出现问题(比如我改坏了文件)需要重新部署一台的时候,就需要将这个容器实例删除 接着: #查看当前的容器ID $ docker ps这里你会看到有两列id,一列是镜像id,一列是容器id,我们要分清…

JavaScript对象掺杂点原型

我读完权威指南一部分的理解,对象和原型的关系:任何对象都可以充当原型 转载于:https://www.cnblogs.com/gaizaotuling/p/5553130.html

docker镜像的备份和恢复

在使用docker的时候总会出现这种情况:下载东西很慢很慢,下载完配置完以后,突然,一个地方配置出现了问题,无法恢复,需要重新装载,那么,之前的所有配置、安装、下载都没了,…

黑盒测试方法案例

1.根据下面给出的规格说明,利用等价类进行测试用例的设计。 一个程序读入3个正整数,把这三个数值看作一个三角形的3条边的长度值。这个程序要打印出信息,说明这个三角形是普通的、是等腰的、还是等边的。 a.找出输入输出条件,列出…

Dockerfile 入门看这篇就够了

在使用docker时,有很多像往容器中复制war包、修改容器配置之类的操作,很繁琐,配置失败或异常时就又是一遍重复的操作,这时候,就要用到这个脚本文件–Dockerfile 以下是我对Dockerfile的理解: 1、首先 Docke…

【DSP开发】C6000非多核非KeyStone系列DSP中断系统

C6000系列DSP的中断系统 上一篇介绍了C6455的GPIO系统,最后把GPIO4配置成了中断/事件模式,本文将介绍C6455的中断系统,介绍完基本概念后,给出把GPIO4映射到INT4的代码。 完成了GPIO和中断的配置,我们就可以开始着手DSP…

SVN用法大全,SVN除了update、commit还有什么

svn除了大家都知道的update、commit以外还有什么常用功能呢? 点击TortoiseSVN后,出现了右图的列表,这其中有哪些是常用的功能呢?最近在家办公,有些东西要svn操作,就了解了下。 咱们从上面开始 1、Show log…

递归删除目录下的所有文件

import java.io.File; public class DeleteDirectory { /** * 删除空目录 * param dir 将要删除的目录路径 */ private static void doDeleteEmptyDir(String dir) { boolean success (new File(dir)).delete(); if (success) { System.out.println("Successfully delete…

Web项目使用nginx实现代理端口访问,看这篇就够了

在搭建服务器的时候,项目部署在tomcat上,要访问项目,则需要加上端口号,如何隐藏端口号来访问呢,这就用到了nginx. nginx可以在docker上安装,也可以在linux上安装,这里我建议使用linux&#xff0…

java.lang.Thread使用及总结

1 public class mainThread{2 public static void main(String args[]){3 //第一种方式启动线程4 otherThread otnew otherThread();5 Thread tnew Thread(ot);6 t.start();7 8 //第二种方式启动线程9 itemThread…

linux/docker个人服务器项目中文变问号??,时间差8小时问题解决方法,最新,最有效

前段时间在腾讯云上面买了一台个人服务器,在搭建好web项目的时候,在项目中录入中文,全部变成了问号,时间也错了,百思不得其解,后来我尝试着修改docker编码,修改系统语言,都无法改变。后来我把项…

Android手机指令操作释疑

有人问我一个关于Android手机root与否的问题,她说明明iTools显示已取得root权限,但她就是没法在该手机上运行需要root权限的App如钛备份等等.我告诉她最好的确认方式便是以adb指令进到 /data/data路径之下,再执行 ls –al,若能顺利得到执行结果,而不会提示”Permission denied”…

伍六七带你学算法 入门篇-矩形重叠

力扣解题-----每日一题-836 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。 如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。 给出…

[摘录]代码优化规则

<<代码优化&#xff1a;有效使用内存>>代码优化建议&#xff1a; 1. 展开读取内存的循环 2. 消除数据相关性 如果请求的RAM单元存在地址数据相关性&#xff08;也就是说&#xff0c;一个单元含有另一个单元的地址&#xff09;&#xff0c;那么CPU不能…

伍六七带你学算法 入门篇-拼写单词

力扣解题&#xff0c;每日一题 1160. 拼写单词 难度- 简单 给你一份『词汇表』&#xff08;字符串数组&#xff09; words 和一张『字母表』&#xff08;字符串&#xff09; chars。 假如你可以用 chars 中的『字母』&#xff08;字符&#xff09;拼写出 words 中的某个『单…

linux内核调优参考

对于新部署的机器&#xff0c;需要做一些基本的调优操作&#xff0c;以更改一些默认配置带来的性能问题 1 修改打开文件数 rootmysql:/data/tools/db# vim /etc/security/limits.conf * soft nofile 65535 * soft nproc 65535…

伍六七带你学算法 入门篇-最长回文串

力扣解题&#xff0c;每日一题&#xff1a;409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串&#xff0c;找到通过这些字母构造成的最长的回文串。 在构造过程中&#xff0c;请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。 注意: 假设字符串…

bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节。。 点分治&#xff1a;时空复杂度$O(n\log^2n)$&#xff0c;常数巨大 主要就是3个堆的初始状态 C堆&#xff1a;每个节点一个&#xff0c;为子树中的点到它父亲的距离的堆。 B堆&#xff1a;每个节点一个&#xff0c…

伍六七带你学算法 入门篇-最小的k个数

java面试题-最小的k个数 难度-简单 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] …

伍六七带你学算法 进阶篇-三数之和

三数之和 难度-中等 题目&#xff1a;给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

伍六七带你学算法 入门篇-链表的中间节点

力扣-876链表的中间节点 难度-简单 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;[1,2,3,4,5] 输出&#xff1a;此列表中的结点 3 (序列化形式&#xf…

伍六七带你学算法 入门篇-卡牌分组

力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题&#xff0c;提交通过率令人深思 &#xff0c;思考它是不是一道简单的题… 开始正题&#xff1a; 给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌…

伍六七带你学算法 进阶篇-排序算法

给定一个整数数组 nums&#xff0c;将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;[5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;[5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 各排序算法解法如下&#xff1a; (如想要了解算法排序原理…

伍六七带你学算法 进阶篇-生命游戏

有趣的算法题–生命游戏 难度-中等 根据 百度百科 &#xff0c;生命游戏&#xff0c;简称为生命&#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 想要体验生命游戏的小伙伴可以到这里——>生命游戏 进入正题&#xff1a; 给定一个包含 m n 个格子的…

Linux下docker安装配置oracle,oracle创建用户并远程连接,实测可用!

最近在给同学弄毕业设计的数据库&#xff0c;因为oracle在个人电脑上极不稳定&#xff0c;所以他的电脑数据库崩溃了&#xff0c;这时候我就在docker上为他拉了一个oracle&#xff0c;解决了问题。 docker的安装共有以下几步&#xff0c;实测没问题&#xff0c;直接搬去永久可以…

plsql配置多数据源,想换哪个换哪个

现在的公司内部普遍使用plsql对数据库进行管理。而数据库非常多&#xff0c;从测试到线上环境数据库那么多&#xff0c;我们通常使用同一配置管理&#xff0c;便于切换。那么配置数据库连接就成为了很重要的一步。 1、安装plsql &#xff08;这里大家去下载安装一下&#xff0…