作為一個(gè)初學(xué)者,我們無(wú)法立即“認(rèn)識(shí)”一個(gè)事物的本質(zhì),只能去“感知”它.
只有當(dāng)對(duì)事物的認(rèn)知以一種更高的形式存在的時(shí)候,我們才能脫離“感知”,真正的“認(rèn)識(shí)”它.
如上所述,視覺(jué)上的感知是我們接觸iOS的最好的切入點(diǎn).
問(wèn):什么是UI?
答:User Interface,用戶界面,用來(lái)顯示內(nèi)容或者作為容器儲(chǔ)存其他UI.我們?cè)谑謾C(jī)上看得到的都是UI.問(wèn):誰(shuí)來(lái)管理UI?
答:Controller-控制器.控制器作為UI的靈魂,它負(fù)責(zé)管理UI的生命周期(創(chuàng)建/添加/銷毀等),監(jiān)聽(tīng)并響應(yīng)用戶與UI之間的交互.
Demo01:加法計(jì)算器
- 我們采用storyboard與代碼結(jié)合的方式來(lái)理解這個(gè)Demo:storyboard負(fù)責(zé)界面布局,代碼負(fù)責(zé)邏輯實(shí)現(xiàn).
1.在Main.storyboard中拖入U(xiǎn)I控件:
TestField 監(jiān)聽(tīng)用戶輸入數(shù)字
屬性:Placeholder 負(fù)責(zé)在用戶輸入之前顯示提示信息,占位.
Keyboard Type 設(shè)置彈出鍵盤的類型(數(shù)字鍵盤,全鍵盤等)Label 負(fù)責(zé)顯示文本,比如本個(gè)Demo的加號(hào),等號(hào)和計(jì)算結(jié)果
屬性:Font 字體大小
Lines 文字行數(shù)(如果設(shè)置為0,表示自動(dòng)換行)
Alignment 文字對(duì)齊方式Button 點(diǎn)擊計(jì)算/清空內(nèi)容
屬性:根據(jù)State Config來(lái)設(shè)置

2.關(guān)聯(lián)storyboard和Controller
Command+option+enter 打開(kāi)輔助編譯器
Command+enter 關(guān)閉輔助編譯器
按住control建立storyboard和Controller的聯(lián)系

3.代碼實(shí)現(xiàn)計(jì)算邏輯
通過(guò)連線創(chuàng)建屬性
@interface ViewController ()
//創(chuàng)建屬性
@property (weak, nonatomic) IBOutlet UITextField *textNum1;
@property (weak, nonatomic) IBOutlet UITextField *textNum2;
@property (weak, nonatomic) IBOutlet UILabel *labelText;
@end
通過(guò)連線創(chuàng)建按鈕的點(diǎn)擊事件
- (IBAction)calculator:(UIButton *)sender {
//記錄TextField數(shù)字并計(jì)算結(jié)果
int n1=[self.textNum1.text intValue];
int n2=[self.textNum2.text intValue];
int sum=n1+n2;
//修改label
self.labelText.text=[NSString stringWithFormat:@"%d",sum];
//撤銷第一擁有者身份 隱藏鍵盤
[self.textNum1 resignFirstResponder];
[self.textNum2 resignFirstResponder];
}
- (IBAction)removeAll:(UIButton *)sender {
//清空
self.textNum1.text=@"";
self.textNum2.text=@"";
self.labelText.text=@"0";
//隱藏鍵盤
[self.view endEditing:YES];
}
總結(jié):
至此,我們的第一個(gè)Demo計(jì)算器就完成了,期間我們接觸到了一個(gè)新名詞:第一響應(yīng)者.
問(wèn):什么是第一響應(yīng)者
答:當(dāng)前響應(yīng)用戶觸摸的屏幕上的對(duì)象,在APP生命周期內(nèi),First Responder負(fù)責(zé)用戶與UI之間的交互.用戶觸摸TextField的時(shí)候,它就變成了第一響應(yīng)者,并且成為活動(dòng)的文本區(qū)域(可以輸入).
- 問(wèn):撤銷第一響應(yīng)者
答:我用了兩種方法
[self.textNum1 resignFirstResponder];
[self.view endEditing:YES];
都可以用來(lái)撤銷TextField的第一響應(yīng)者身份,達(dá)到隱藏鍵盤的效果.
問(wèn):連線的屬性為什么不放到.h中?
答:放入延展類,防止外部對(duì)象訪問(wèn),達(dá)到私有化效果問(wèn):連線方法為什么不放到類擴(kuò)展中?
答:沒(méi)有必要聲明方法問(wèn):什么是IBOutlet和IBAction?
答:IBOutlet表示連線的是一個(gè)屬性
IBAction表示連線的是一個(gè)方法問(wèn):控件為什么用weak修飾?
答:weak表示弱引用,相關(guān)內(nèi)容在UI基礎(chǔ)-02中詳細(xì)解答
Tips:
1.刪除方法的時(shí)候,一定要把storyboard中的連線刪除
2.快捷鍵:
顯示/隱藏左側(cè)導(dǎo)航區(qū)域 Command+0
顯示/隱藏右側(cè)實(shí)用工具欄Command+option+0
打開(kāi)/關(guān)閉輔助編譯器
打開(kāi) Command+option+enter
關(guān)閉 Command+enter
查找頭文件 shift+Command+o
離線文檔 shift+Command+0
Demo02:小飛機(jī)
點(diǎn)擊方向鍵,讓小飛機(jī)移動(dòng)

1.設(shè)置界面
- (void)viewDidLoad {
[super viewDidLoad];
//設(shè)置背景
UIImageView *backgroundImage=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)];
//創(chuàng)建UIImage
UIImage *image=[UIImage imageNamed:@"background"];
//修改屬性
backgroundImage.image=image;
//添加到屏幕上
[self.view addSubview:backgroundImage];
//2.設(shè)置小飛機(jī)
UIButton *plane=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 48,48)];
self.button=plane;
plane.center=CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2);
[plane setBackgroundImage:[UIImage imageNamed:@"hero2"] forState:UIControlStateNormal];
[plane setBackgroundImage:[UIImage imageNamed:@"hero1"] forState:UIControlStateHighlighted];
[self.view addSubview:plane];
//3.添加方向鍵
UIButton *arrow=[[UIButton alloc] initWithFrame:CGRectMake(100, 100, 48,48)];
[arrow setBackgroundImage:[UIImage imageNamed:@"top_normal"] forState:UIControlStateNormal];
[arrow setBackgroundImage:[UIImage imageNamed:@"top_highlighted"] forState:UIControlStateHighlighted];
[self.view arrow];
//添加按鈕的監(jiān)聽(tīng)
[arrow addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
}
2.實(shí)現(xiàn)按鈕的點(diǎn)擊事件
-(void)clickButton:(UIButton *)button{
CGRect tempFrame=self.button.frame;
tempFrame.origin.y-=10;
self.button.frame=tempFrame;
}
Tips
1.按鈕的狀態(tài)和相關(guān)設(shè)置:
Default:默認(rèn)
Highlighted:被點(diǎn)擊高亮
Selected:id類型的Sender就是表示按鈕本身,按鈕selected屬性,默認(rèn)為No,修改為YES表示被選中,isSelected屬性判斷是否被選中
Disable:enabled屬性,默認(rèn)值為YES,可以接收用戶點(diǎn)擊事件,修改為NO,不可以接收用戶點(diǎn)擊事件,isEnabled判斷是否能夠點(diǎn)擊
background image和image:
設(shè)置background image和title:background image在底層,title在圖片上層
設(shè)置image和title:image在左側(cè),title在右側(cè)(默認(rèn)狀態(tài),可以通過(guò)offset修改位置)
設(shè)置background image:圖片按照按鈕尺寸
設(shè)置按鈕的image:按鈕按照?qǐng)D片尺寸
按鈕使用注意:image/backgroundimage/title,一定要分狀態(tài)設(shè)置
2.OC中的坐標(biāo)系
我們以這個(gè)項(xiàng)目為例

frame:表示子view在父view的位置
center:子view中心在父view的位置,根據(jù)frame確定
bounds:view相對(duì)于自身,左上角為坐標(biāo)原點(diǎn),根據(jù)frame確定
修改frame:不能直接修改對(duì)象結(jié)構(gòu)體中的內(nèi)容
基本實(shí)現(xiàn):獲取對(duì)象的frame賦值給臨時(shí)frame-修改臨時(shí)frame-給frame賦值
CGRect tempFrame=self.OBJect.frame;
CGRect tempFrame=self.OBJect.frame;
self.NSObject.frame=tempFrame;
3.UIView的Tag:view的標(biāo)記