功能分析
步驟分析
@PRoperty(nonatomic) CGRect frame;
1 // 2 // ViewController.m 3 // 按鈕使用1 4 // 5 // Created by 大帥 on 15-2-28. 6 // Copyright (c) 2015年 dashuai. All rights reserved. 7 // 8 9 #import "ViewController.h"10 11 @interface ViewController ()12 @property (weak, nonatomic) IBOutlet UIButton *HeadImageView;13 14 @end15 16 @implementation ViewController17 //up方向鍵進行連線18 -(IBAction)move19 {20 //使用 frame 修改headimageview 的位置21 //注意,在 oc 中,不可以直接修改"對象"的"結構體屬性"的"成員"22 //frame 是結構體,里面的 orign 等等都是結構體23 //并且,這里 orign 是 frame 的成員,不能直接去修改,如下寫法在 oc 是不對的24 25 // self.HeadImageView.frame.origin.y = self.HeadImageView.frame.origin.y - 10;26 27 //應該間接修改28 //1、取出結構體屬性29 CGRect rect = self.HeadImageView.frame;30 //2、修改結構體里面的成員,此時取出之后,frame已經不是對象了31 rect.origin.y -= 20;32 //3、把值賦回來,就是這三個步驟。必須有這步。33 self.HeadImageView.frame = rect;34 }35 36 @end
三步驟:取出結構體屬性,修改結構體的成員,把值賦回來。
好嘞,熟悉之后,重新連接四個控件,把 move 對象方法修改為帶參數
-(IBAction)move:(UIButton *)button
刪掉舊的連接,重新連接新的 move 方法,點擊上下左右,都可以調用 move 方法,只要能區分就行了。使用 tag:
@property(nonatomic) NSInteger tag;
控件的ID(標識),父控件可以通過tag來找到對應的子控件,在屬性查看器里,依次設置修改即可讓控件 button 通過 tag 的值,找到不同的子控件。
button.tag
魔法數字的概念(避免硬編碼)
術語:其他程序員看到后,不能見名知意的數字,不是好習慣,在程序開發中需要避免出現魔法數字(Magic Number),在 oc ,可以使用枚舉類型,宏定義來避免在程序中出現魔法數字。 在其它一些編程語言里,也類似,要避免硬編碼。
1> 枚舉類型實質上就是一個整數,其作用就是用來替代魔法數字
2> 枚舉類型中,指定了第一個整數之后,后面的數字會遞增
記住,定死的一些東西,統一放到程序主體的上面,統一定義,避免硬編碼
1 #import "ViewController.h" 2 3 //10是 up,11是 down,12是 left,13是 right 4 //枚舉, 5 typedef enum 6 { 7 kMovingDirTop = 10, 8 kMovingDirBottom, 9 kMovingDirLeft,10 kMovingDirRight11 } kMovingDir;12 //宏定義 偏移量13 #define kMovingDelta 2014 15 @interface ViewController ()16 @property (weak, nonatomic) IBOutlet UIButton *HeadImageView;17 18 @end19 20 @implementation ViewController21 //方向鍵進行連線22 -(IBAction)move:(UIButton *)button23 {24 //1、取出結構體屬性25 CGRect rect = self.HeadImageView.frame;26 //2、修改結構體里面的成員,此時取出之后,frame已經不是對象了27 switch (button.tag) {28 case kMovingDirTop:29 rect.origin.y -= kMovingDelta;30 break;31 case kMovingDirBottom:32 rect.origin.y += kMovingDelta;33 break;34 case kMovingDirLeft:35 rect.origin.x -= kMovingDelta;36 break;37 case kMovingDirRight:38 rect.origin.x += kMovingDelta;39 break;40 default:41 break;42 }43 //3、把值賦回來,就是這三個步驟。必須有這步。44 self.HeadImageView.frame = rect;45 }
效果如下 :
//該位置是 orign,改大小是 size屬性- (IBAction)zoom:(UIButton *)button { CGRect rect = self.HeadImageView.frame; //如果為1,則是放大,否則縮小 if (button.tag) { rect.size.height += kMovingDelta; rect.size.width += kMovingDelta; } else { rect.size.height -= kMovingDelta; rect.size.width -= kMovingDelta; } self.HeadImageView.frame = rect;}
1> frame可以修改對象的位置和尺寸
2> bounds可以修改對象的尺寸(這里使用 bounds 可以實現四周的增大縮小,而不是原點不變了,bounds 的寬高和邊框是相等的!先記住。)
3> center可以修改對象的位置
- (IBAction)zoom:(UIButton *)button { CGRect rect = self.HeadImageView.bounds; //如果為1,則是放大,否則縮小 if (button.tag) { rect.size.height += kMovingDelta; rect.size.width += kMovingDelta; } else { rect.size.height -= kMovingDelta; rect.size.width -= kMovingDelta; } self.HeadImageView.bounds = rect;}
這樣修改之后效果就是四周的變大縮小,而不是原點不變
// beginAnimations表示此后的代碼要“參與到”動畫中[UIView beginAnimations:nil context:nil];// setAnimationDuration用來指定動畫持續時間[UIView setAnimationDuration:2.0];self.headImageView.bounds = rect;......// commitAnimations,將beginAnimation之后的所有動畫提交并生成動畫[UIView commitAnimations];
有了動畫效果之后,是先修改寬和高,再修改中心點,可以設置持續的時間。不加動畫之前,看不出來,很快。
//該位置是 orign,改大小是 size屬性- (IBAction)zoom:(UIButton *)button { CGRect rect = self.HeadImageView.bounds; //如果為1,則是放大,否則縮小 if (button.tag) { rect.size.height += kMovingDelta; rect.size.width += kMovingDelta; } else { rect.size.height -= kMovingDelta; rect.size.width -= kMovingDelta; } //動畫開始,以后的代碼全部參與到動畫里 [UIView beginAnimations:nil context:nil]; //設置動畫持續時間2秒 [UIView setAnimationDuration:2.0]; self.HeadImageView.bounds = rect; //oc里透明度,1是完全看見,0是完全看不見,變變化大小,邊消失的效果 self.HeadImageView.alpha = 0; //提交,并生成動畫 [UIView commitAnimations];}
也可以使用 center 屬性改變對象位置(只能改變位置,不能改變大小,而 orign 可以改變大小和位置)
關于 git
點擊上圖中的標志,可以查看和上次提交的版本不一樣的地方,也就是修改的情況的查看
通過此操作,來實現代碼的版本提交
如下,文件后面有 m 表示這個文件被修改過。
//應該間接修改 //1、取出結構體屬性 CGRect rect = self.HeadImageView.frame; //2、修改結構體里面的成員,此時取出之后,frame已經不是對象了 rect.origin.y -= 20; //3、把值賦回來,就是這三個步驟。必須有這步。 self.HeadImageView.frame = rect;
如果沒有第三步,則無法成功修改屬性,因為 rect 不是指針,地址和 frame 的地址不一樣,修改完畢,必須重新賦值回去,才能生效。
修改結構體屬性的成員方法如下:
1> 使用臨時變量記錄對象的結構體屬性
2> 修改臨時變量的屬性
3> 將臨時變量重新設置給對象的結構體屬性
6、同一個項目中,盡量不要重復的代碼去完成類似的功能,不要經常性的復制一樣的代碼。造成很大冗余。要盡量精簡。
1> frame可以修改對象的位置和尺寸
2> bounds可以修改對象的尺寸
3> center可以修改對象的位置
13、首尾式動畫效果,透明度的設置alpha,記住蘋果里,動畫是廉價的,很容易就能實現非常絢麗的效果。
14、git 入門
15、如果發現通過代碼無法修改控件的位置或者尺寸時,應該去掉storyboard里面的autolayout功能,這是自iOS6開始出現的特性,顧名思義,autolayout是用來自動布局的,用來束縛控件的位置和尺寸。去掉這個功能,控件的位置和尺寸就不再有一些固定的束縛。
16、UIButton的狀態
新聞熱點
疑難解答