iOS transfrom屬性的使用

1.transform屬性

在OC中杆怕,通過transform屬性可以修改對象的平移宛裕、縮放比例和旋轉(zhuǎn)角度

常用的創(chuàng)建transform結(jié)構(gòu)體方法分兩大類

(1) 創(chuàng)建“基于控件初始位置”的形變

CGAffineTransformMakeTranslation(平移)

CGAffineTransformMakeScale(縮放)

CGAffineTransformMakeRotation(旋轉(zhuǎn))

(2) 創(chuàng)建“基于transform參數(shù)”的形變

CGAffineTransformTranslate

CGAffineTransformScale

CGAffineTransformRotate

補充:

在OC中,所有跟角度相關(guān)的數(shù)值,都是弧度值,180° = M_PI

正數(shù)表示順時針旋轉(zhuǎn)

負數(shù)表示逆時針旋轉(zhuǎn)

提示:

由于transform屬性可以基于控件的上一次的狀態(tài)進行疊加形變赞季,例如,先旋轉(zhuǎn)再平移奢驯。因此在實際動畫開發(fā)中申钩,當涉及位置、尺寸形變效果時瘪阁,大多修改控件的transform屬性撒遣,而不是frame、bounds管跺、center 义黎。

//代碼示例

//? SLViewController.m

//? 01-練習使用按鈕的frame和center屬性

//

//? Created by Anthony on 15/6/4.

//? Copyright ? 2016年 Anthony. All rights reserved.

//

#import "SLViewController.h"

// 私有擴展

@interface SLViewController ()

@property(nonatomic,weak)IBOutlet UIButton *headImageView;

@end

@implementation SLViewController

// 枚舉類型,從1開始

typedef enum

{

ktopbtntag = 1,

kdownbtntag,

krightbtntag,

kleftbtntag

}btntag;

// viewDidLoad是視圖加載完成后調(diào)用的方法豁跑,通常在此方法中執(zhí)行視圖控制器的初始化工作

- (void)viewDidLoad

{

//? 在viewDidLoad方法中廉涕,不要忘記調(diào)用父類的方法實現(xiàn)

[super viewDidLoad];

//? 手寫控件代碼

// 一、寫一個按鈕控件,上面有一張圖片

// 1.使用類創(chuàng)建一個按鈕對象

//? 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)設置普通狀態(tài)下按鈕的屬性

[headbtn setBackgroundImage:[UIImage imageNamed:@"圖片名"] forState:UIControlStateNormal]; // 圖片名自己更改

[headbtn setTitle:@"點我狐蜕!" forState:UIControlStateNormal];

[headbtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

// (3)設置高亮狀態(tài)下按鈕的屬性

[headbtn setBackgroundImage:[UIImage imageNamed:@"圖片名"] forState:UIControlStateHighlighted];

[headbtn setTitle:@"還行吧~" forState:UIControlStateHighlighted];

[headbtn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];

// 3.把對象添加到視圖中展現(xiàn)出來

[self.view addSubview:headbtn];

// 注意點:保存對象給其他方法獲得

self.headImageView = headbtn;

// 二宠纯、寫四個控制圖片左右上下移動方向的按鈕控件

/**** 向上的按鈕 ****/

// 1.創(chuàng)建按鈕對象

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.創(chuàng)建按鈕對象

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.創(chuàng)建按鈕對象

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.創(chuàng)建按鈕對象

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.創(chuàng)建對象

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];

}

// 控制方向的多個按鈕調(diào)用同一個方法

-(void)Click:(UIButton *)button

{

// 練習使用frame屬性

// CGRect frame = self.headImageView.frame;

/**注意层释,這里如果控制位置的兩個屬性frame和center同時使用的話婆瓜,會出現(xiàn)很好玩的效果,注意分析*/

// 練習使用center屬性

CGPoint center = self.headImageView.center;

switch (button.tag) {

case ktopbtntag:

center.y-= 30;

break;

case kdownbtntag:

center.y+= 30;

break;

case kleftbtntag:

center.x-= 50;

break;

case krightbtntag:

center.x+= 50;

break;

}

// 首尾式設置動畫效果

[UIView beginAnimations:nil context:nil];

self.headImageView.center = center;

// 設置時間

[UIView setAnimationDuration:2.0];

// 提交結(jié)束動畫效果

[UIView commitAnimations];

NSLog(@"移動!");

}

-(void)Zoom:(UIButton *)btn

{

/*

// 使用frame贡羔,以自己的左上角(自己的原點)為原點

CGRect frame = self.headImageView.frame;

if (btn.tag) {

frame.size.height += 30;

frame.size.width += 30;

}

else

{

frame.size.width -= 50;

frame.size.height -= 50;

}

self.headImageView.frame = frame;

*/

// 使用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);

// 在原有的基礎(chǔ)上位移(是累加的)

// self.headImageView.transform = CGAffineTransformTranslate(self.headImageView.transform, 50, 50);

// 在原有的基礎(chǔ)上進行縮放

// self.headImageView.transform = CGAffineTransformScale(self.headImageView.transform, 1.5, 1.6);

// 在原有的基礎(chǔ)上進行旋轉(zhuǎn)

if (rotate.tag) {

// 旋轉(zhuǎn)角度為1/pi,逆時針

self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);

}

else

{

// 旋轉(zhuǎn)的角度為pi/2乖寒,順時針

self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, M_PI_2);

}

}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒙秒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宵统,更是在濱河造成了極大的恐慌,老刑警劉巖覆获,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件马澈,死亡現(xiàn)場離奇詭異,居然都是意外死亡弄息,警方通過查閱死者的電腦和手機痊班,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摹量,“玉大人涤伐,你說我怎么就攤上這事∮С疲” “怎么了凝果?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長睦尽。 經(jīng)常有香客問我器净,道長,這世上最難降的妖魔是什么当凡? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任山害,我火速辦了婚禮,結(jié)果婚禮上沿量,老公的妹妹穿的比我還像新娘浪慌。我一直安慰自己,他們只是感情好朴则,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布权纤。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妖碉。 梳的紋絲不亂的頭發(fā)上涌庭,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音欧宜,去河邊找鬼坐榆。 笑死,一個胖子當著我的面吹牛冗茸,可吹牛的內(nèi)容都是我干的席镀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼夏漱,長吁一口氣:“原來是場噩夢啊……” “哼豪诲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挂绰,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤屎篱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后葵蒂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體交播,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年践付,在試婚紗的時候發(fā)現(xiàn)自己被綠了秦士。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡永高,死狀恐怖隧土,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情命爬,我是刑警寧澤曹傀,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站饲宛,受9級特大地震影響卖毁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜落萎,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一亥啦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧练链,春花似錦翔脱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽错妖。三九已至,卻和暖如春疚沐,著一層夾襖步出監(jiān)牢的瞬間暂氯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工亮蛔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痴施,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓究流,卻偏偏與公主長得像辣吃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芬探,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容