国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

IOS開發(fā)筆記-基礎(chǔ)UI(3)按鈕的使用(放大縮小、改變位置,首尾式動(dòng)畫)和學(xué)習(xí)案例

2019-11-14 19:31:23
字體:
供稿:網(wǎng)友
UIKit框架提供了非常多的UI控件,但并不是每一個(gè)都很常用,有些控件可能1年內(nèi)都用不上,有些控件天天用,比如UIButton、UILabel、UIImageView、UITableView等等,按鈕控件是非常重要且比較基礎(chǔ)的一個(gè)UI控件---UIButton,一般情況下,點(diǎn)擊某個(gè)控件后,會(huì)做出相應(yīng)反應(yīng)的都是按鈕,按鈕的功能比較多,既能顯示文字,又能顯示圖片,還能隨時(shí)調(diào)整內(nèi)部圖片和文字的位置。
 
案例:

功能分析

(1)左下角4個(gè)方向按鈕,控制頭像按鈕的位置
(2)右下角分別是放大、縮小按鈕,控制頭像的尺寸
(3)頭像按鈕既有背景圖片,又有文字

步驟分析

(1)搭建UI界面
(2)監(jiān)聽按鈕點(diǎn)擊
(3)修改頭像按鈕的屬性來調(diào)整位置和尺寸
 
1、先準(zhǔn)備素材
Xcode5之后,都是把圖片素材,統(tǒng)一放到
點(diǎn)擊,拖拽即可
 
2、進(jìn)行 UI 設(shè)計(jì)
 
按鈕的點(diǎn)擊狀態(tài)
 
在 ios7之后,出現(xiàn)的一個(gè)設(shè)置,在屬性查看器里,type 下默認(rèn)選擇的是 system,就是讓系統(tǒng)去改變,如果改為 custom,就是自定義,可以自己定義變化,而不讓系統(tǒng)去幫我們改變。
比如:設(shè)計(jì)一個(gè)圖片式的按鈕之后,點(diǎn)的剎那是高亮的,松開就是恢復(fù)到原樣。
點(diǎn)擊之前的樣子
 
點(diǎn)擊下去的樣子,按鈕顯式高亮狀態(tài),松開之后,回復(fù)到原樣
 
把屬性 type 改為 custom ,進(jìn)行自定義的修改,同時(shí)修改state config 選項(xiàng),也就是要修改 高亮狀態(tài),還有同時(shí)修改文本標(biāo)題,文本顏色,按鈕的背景等。如下:
運(yùn)行,再次點(diǎn)擊下去,高亮就不是以前那樣了,改變?yōu)椋?/div>
松開之后,恢復(fù)原樣。
 
設(shè)置上下左右四個(gè)方向鍵(當(dāng)相同的控件很多的時(shí)候,使用復(fù)制,粘貼,比較省事),同時(shí)記得修改高亮狀態(tài)下背景,點(diǎn)擊下,變?yōu)榫G色。
連線,進(jìn)行監(jiān)聽
先設(shè)置 up 方向,學(xué)習(xí)修改控件屬性的過程三步驟:
@PRoperty(nonatomic) CGRect frame;
控件所在矩形框在父控件中的位置和尺寸(以父控件的左上角為坐標(biāo)原點(diǎn)),可以定義位置(origin),大小(size),frame 本身是結(jié)構(gòu)體,里面的成員都是結(jié)構(gòu)體屬性的成員。
 
 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 }

效果如下 :

繼續(xù),放大縮小的功能實(shí)現(xiàn)
不要和 move 的方法混在一起,因?yàn)樽龅氖莾深愂虑椋謥韺?shí)現(xiàn)。類似位置的改變,orign
//該位置是 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;}
oc 從 Xcode4.6開始,有了一個(gè)自動(dòng)布局系統(tǒng) autolayout,由于這個(gè)系統(tǒng),一些設(shè)置和改變,就不會(huì)起效,蘋果規(guī)定,當(dāng)使用了自動(dòng)布局系統(tǒng)之后,就不要在使用代碼控制位置了。在程序運(yùn)行中,每個(gè)控件的大小和位置,都應(yīng)該交給自動(dòng)布局系統(tǒng)來決定。所以不會(huì)發(fā)生改變。
 
把它勾掉,就可以起效了
 
那么問題來了,縮小放大的時(shí)候原點(diǎn)不變。因?yàn)楦淖兊氖?size 屬性,沒有改變原點(diǎn)位置,記住:

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)不變

 

 

介紹一個(gè)動(dòng)畫效果:首尾式動(dòng)畫效果代碼實(shí)現(xià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è)文件被修改過。

一旦 xcode 退出后,在使用撤銷就不管用了,那么此時(shí) git 出來了,通過查看和上次版本的變化,很有用,幫助提高開發(fā)效率,和改錯(cuò),回顧。故創(chuàng)建項(xiàng)目的時(shí)候,要勾選 git,當(dāng)階段性開發(fā)告一段落,選擇提交到 git,餅編寫注釋,下次通過版本查看即可。即使關(guān)閉 xcode,打開之后還能撤銷上次的修改,很方便。
 
小結(jié):
1、cmd+shift+h 是模擬器里 home 健的快捷鍵
2、當(dāng)相同的控件很多的時(shí)候,使用復(fù)制,粘貼,比較省事,但是注意,這樣也會(huì)把相應(yīng)的連線給一起復(fù)制。
3、oc中,大多數(shù)控件的監(jiān)聽方法的第一個(gè)參數(shù)就是控件本身,也就是 sender 發(fā)送者,且回憶,方法名是name:,不要丟冒號(hào)。
4、
UIView的常見屬性
@property(nonatomic,readonly) UIView *superview;獲得自己的父控件對(duì)象
 
@property(nonatomic,readonly,copy) NSArray *subviews;獲得自己的所有子控件對(duì)象(一個(gè)父親可 u 有多個(gè)兒子,但是一個(gè)兒子只有一個(gè)父親)
 
@property(nonatomic) NSInteger tag;控件的ID(標(biāo)識(shí)),父控件可以通過tag來找到對(duì)應(yīng)的子控件
 
@property(nonatomic) CGAffineTransform transform;控件的形變屬性(可以設(shè)置旋轉(zhuǎn)角度、比例縮放、平移等屬性)
 
@property(nonatomic) CGRect frame;控件所在矩形框在父控件中的位置和尺寸(以父控件的左上角為坐標(biāo)原點(diǎn))
可以定義位置(origin),大小(size)
 
@property(nonatomic) CGRect bounds;控件所在矩形框的位置和尺寸(以自己左上角為坐標(biāo)原點(diǎn),所以bounds的x、y一般為0,這個(gè)屬性很神奇,暫時(shí)先這么理解,以后鉆研)
可以定義大小(size),無法定義位置
 
@property(nonatomic) CGPoint center;控件中點(diǎn)的位置(以父控件的左上角為坐標(biāo)原點(diǎn))
可以定義位置,無法定義大小
 
UIView的常見方法
- (void)addSubview:(UIView *)view;添加一個(gè)子控件view
- (void)removeFromSuperview;從父控件中移除
- (UIView *)viewWithTag:(NSInteger)tag;根據(jù)一個(gè)tag標(biāo)識(shí)找出對(duì)應(yīng)的控件(一般都是子控件)
 
5、注意指針的問題,修改屬性,不是指針和是指針的區(qū)別,比如:
    //應(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ù)制一樣的代碼。造成很大冗余。要盡量精簡。

7、Xcode5之后,經(jīng)常會(huì)有一些莫名其妙的問題出現(xiàn),解決不了,可以嘗試退出重新打開,再看看。
 
8、在 oc 中,不可以直接修改"對(duì)象"的"結(jié)構(gòu)體屬性"的"成員",要三部曲間接修改。
 
9、switch 語句中的default
當(dāng)變量的取值不在分支里任何一個(gè)case的情況下,語句要做的處理,其實(shí)也是一種case,只不過就是指“除了指定的幾個(gè)case以外的其他情況”,是一個(gè)中安全的編程方式。
 
10、注意魔法數(shù)字的問題避免,枚舉的作用,宏定義
 
11、圖片素材統(tǒng)一放到images.xcassets里面,從Xcode5開始,圖片資源都放到Images.xcassets中進(jìn)行管理
 
12、注意三個(gè)屬性的用處

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)

normal(普通狀態(tài))
默認(rèn)情況(Default)
對(duì)應(yīng)的枚舉常量:UIControlStateNormal
 
highlighted(高亮狀態(tài))
按鈕被按下去的時(shí)候(手指還未松開)
對(duì)應(yīng)的枚舉常量:UIControlStateHighlighted
 
disabled(失效狀態(tài),不可用狀態(tài))
如果enabled屬性為NO,就是處于disable狀態(tài),代表按鈕不可以被點(diǎn)擊
對(duì)應(yīng)的枚舉常量:UIControlStateDisabled
 
17、設(shè)置按鈕在不同狀態(tài)下的背景圖片時(shí),為了保證高亮狀態(tài)下的圖片正常顯示,必須設(shè)置按鈕的type為custom(自定義)
 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黎平县| 南溪县| 广河县| 枝江市| 宣武区| 汤阴县| 云霄县| 乌海市| 马龙县| 竹溪县| 永年县| 潮州市| 珲春市| 衡阳市| 伽师县| 凤山市| 开鲁县| 宁城县| 志丹县| 特克斯县| 上林县| 西和县| 蒲城县| 吉林省| 东光县| 博乐市| 齐河县| 普洱| 邛崃市| 寿宁县| 公主岭市| 赫章县| 广南县| 启东市| 通许县| 信阳市| 万安县| 石柱| 湄潭县| 万年县| 鄯善县|