初探第一響應(yīng)者/Frame+按鈕添加點(diǎn)擊事件

作為一個(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è)置

Snip20170307_19.png

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

Snip20170307_22.png

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)

plane.gif

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)目為例

Snip20170317_16.png

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)記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容