
功能分析
步驟分析


點(diǎn)擊之前的樣子
點(diǎn)擊下去的樣子,按鈕顯式高亮狀態(tài),松開之后,回復(fù)到原樣
松開之后,恢復(fù)原樣。
@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方向鍵進(jìn)行連線18 -(IBAction)move19 {20 //使用 frame 修改headimageview 的位置21 //注意,在 oc 中,不可以直接修改"對(duì)象"的"結(jié)構(gòu)體屬性"的"成員"22 //frame 是結(jié)構(gòu)體,里面的 orign 等等都是結(jié)構(gòu)體23 //并且,這里 orign 是 frame 的成員,不能直接去修改,如下寫法在 oc 是不對(duì)的24 25 // self.HeadImageView.frame.origin.y = self.HeadImageView.frame.origin.y - 10;26 27 //應(yīng)該間接修改28 //1、取出結(jié)構(gòu)體屬性29 CGRect rect = self.HeadImageView.frame;30 //2、修改結(jié)構(gòu)體里面的成員,此時(shí)取出之后,frame已經(jīng)不是對(duì)象了31 rect.origin.y -= 20;32 //3、把值賦回來,就是這三個(gè)步驟。必須有這步。33 self.HeadImageView.frame = rect;34 }35 36 @end
三步驟:取出結(jié)構(gòu)體屬性,修改結(jié)構(gòu)體的成員,把值賦回來。
好嘞,熟悉之后,重新連接四個(gè)控件,把 move 對(duì)象方法修改為帶參數(shù)
-(IBAction)move:(UIButton *)button

刪掉舊的連接,重新連接新的 move 方法,點(diǎn)擊上下左右,都可以調(diào)用 move 方法,只要能區(qū)分就行了。使用 tag:
@property(nonatomic) NSInteger tag;
控件的ID(標(biāo)識(shí)),父控件可以通過tag來找到對(duì)應(yīng)的子控件,在屬性查看器里,依次設(shè)置修改即可讓控件 button 通過 tag 的值,找到不同的子控件。
button.tag
魔法數(shù)字的概念(避免硬編碼)
術(shù)語:其他程序員看到后,不能見名知意的數(shù)字,不是好習(xí)慣,在程序開發(fā)中需要避免出現(xiàn)魔法數(shù)字(Magic Number),在 oc ,可以使用枚舉類型,宏定義來避免在程序中出現(xiàn)魔法數(shù)字。 在其它一些編程語言里,也類似,要避免硬編碼。
1> 枚舉類型實(shí)質(zhì)上就是一個(gè)整數(shù),其作用就是用來替代魔法數(shù)字
2> 枚舉類型中,指定了第一個(gè)整數(shù)之后,后面的數(shù)字會(huì)遞增
記住,定死的一些東西,統(tǒng)一放到程序主體的上面,統(tǒng)一定義,避免硬編碼
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 //方向鍵進(jìn)行連線22 -(IBAction)move:(UIButton *)button23 {24 //1、取出結(jié)構(gòu)體屬性25 CGRect rect = self.HeadImageView.frame;26 //2、修改結(jié)構(gòu)體里面的成員,此時(shí)取出之后,frame已經(jīng)不是對(duì)象了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、把值賦回來,就是這三個(gè)步驟。必須有這步。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可以修改對(duì)象的位置和尺寸
2> bounds可以修改對(duì)象的尺寸(這里使用 bounds 可以實(shí)現(xiàn)四周的增大縮小,而不是原點(diǎn)不變了,bounds 的寬高和邊框是相等的!先記住。)
3> center可以修改對(duì)象的位置
- (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;}
這樣修改之后效果就是四周的變大縮小,而不是原點(diǎn)不變

// beginAnimations表示此后的代碼要“參與到”動(dòng)畫中[UIView beginAnimations:nil context:nil];// setAnimationDuration用來指定動(dòng)畫持續(xù)時(shí)間[UIView setAnimationDuration:2.0];self.headImageView.bounds = rect;......// commitAnimations,將beginAnimation之后的所有動(dòng)畫提交并生成動(dòng)畫[UIView commitAnimations];
有了動(dòng)畫效果之后,是先修改寬和高,再修改中心點(diǎn),可以設(shè)置持續(xù)的時(shí)間。不加動(dòng)畫之前,看不出來,很快。
//該位置是 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; } //動(dòng)畫開始,以后的代碼全部參與到動(dòng)畫里 [UIView beginAnimations:nil context:nil]; //設(shè)置動(dòng)畫持續(xù)時(shí)間2秒 [UIView setAnimationDuration:2.0]; self.HeadImageView.bounds = rect; //oc里透明度,1是完全看見,0是完全看不見,變變化大小,邊消失的效果 self.HeadImageView.alpha = 0; //提交,并生成動(dòng)畫 [UIView commitAnimations];}
也可以使用 center 屬性改變對(duì)象位置(只能改變位置,不能改變大小,而 orign 可以改變大小和位置)
關(guān)于 git

點(diǎn)擊上圖中的標(biāo)志,可以查看和上次提交的版本不一樣的地方,也就是修改的情況的查看
通過此操作,來實(shí)現(xiàn)代碼的版本提交
如下,文件后面有 m 表示這個(gè)文件被修改過。

//應(yīng)該間接修改 //1、取出結(jié)構(gòu)體屬性 CGRect rect = self.HeadImageView.frame; //2、修改結(jié)構(gòu)體里面的成員,此時(shí)取出之后,frame已經(jīng)不是對(duì)象了 rect.origin.y -= 20; //3、把值賦回來,就是這三個(gè)步驟。必須有這步。 self.HeadImageView.frame = rect;
如果沒有第三步,則無法成功修改屬性,因?yàn)?rect 不是指針,地址和 frame 的地址不一樣,修改完畢,必須重新賦值回去,才能生效。
修改結(jié)構(gòu)體屬性的成員方法如下:
1> 使用臨時(shí)變量記錄對(duì)象的結(jié)構(gòu)體屬性
2> 修改臨時(shí)變量的屬性
3> 將臨時(shí)變量重新設(shè)置給對(duì)象的結(jié)構(gòu)體屬性
6、同一個(gè)項(xiàng)目中,盡量不要重復(fù)的代碼去完成類似的功能,不要經(jīng)常性的復(fù)制一樣的代碼。造成很大冗余。要盡量精簡。
1> frame可以修改對(duì)象的位置和尺寸
2> bounds可以修改對(duì)象的尺寸
3> center可以修改對(duì)象的位置
13、首尾式動(dòng)畫效果,透明度的設(shè)置alpha,記住蘋果里,動(dòng)畫是廉價(jià)的,很容易就能實(shí)現(xiàn)非常絢麗的效果。
14、git 入門
15、如果發(fā)現(xiàn)通過代碼無法修改控件的位置或者尺寸時(shí),應(yīng)該去掉storyboard里面的autolayout功能,這是自iOS6開始出現(xiàn)的特性,顧名思義,autolayout是用來自動(dòng)布局的,用來束縛控件的位置和尺寸。去掉這個(gè)功能,控件的位置和尺寸就不再有一些固定的束縛。
16、UIButton的狀態(tài)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注