初探第一響應者/Frame+按鈕添加點擊事件

作為一個初學者,我們無法立即“認識”一個事物的本質,只能去“感知”它.
只有當對事物的認知以一種更高的形式存在的時候,我們才能脫離“感知”,真正的“認識”它.
如上所述,視覺上的感知是我們接觸iOS的最好的切入點.

  • 問:什么是UI?
    答:User Interface,用戶界面,用來顯示內容或者作為容器儲存其他UI.我們在手機上看得到的都是UI.

  • 問:誰來管理UI?
    答:Controller-控制器.控制器作為UI的靈魂,它負責管理UI的生命周期(創(chuàng)建/添加/銷毀等),監(jiān)聽并響應用戶與UI之間的交互.

Demo01:加法計算器

  • 我們采用storyboard與代碼結合的方式來理解這個Demo:storyboard負責界面布局,代碼負責邏輯實現.

1.在Main.storyboard中拖入UI控件:

  • TestField 監(jiān)聽用戶輸入數字
    屬性:Placeholder 負責在用戶輸入之前顯示提示信息,占位.
    Keyboard Type 設置彈出鍵盤的類型(數字鍵盤,全鍵盤等)

  • Label 負責顯示文本,比如本個Demo的加號,等號和計算結果
    屬性:Font 字體大小
    Lines 文字行數(如果設置為0,表示自動換行)
    Alignment 文字對齊方式

  • Button 點擊計算/清空內容
    屬性:根據State Config來設置

Snip20170307_19.png

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

Snip20170307_22.png

3.代碼實現計算邏輯
通過連線創(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

通過連線創(chuàng)建按鈕的點擊事件

- (IBAction)calculator:(UIButton *)sender {
    //記錄TextField數字并計算結果
    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];
}

總結:

至此,我們的第一個Demo計算器就完成了,期間我們接觸到了一個新名詞:第一響應者.

問:什么是第一響應者
答:當前響應用戶觸摸的屏幕上的對象,在APP生命周期內,First Responder負責用戶與UI之間的交互.用戶觸摸TextField的時候,它就變成了第一響應者,并且成為活動的文本區(qū)域(可以輸入).

  • 問:撤銷第一響應者
    答:我用了兩種方法
[self.textNum1 resignFirstResponder];

[self.view endEditing:YES];

都可以用來撤銷TextField的第一響應者身份,達到隱藏鍵盤的效果.

  • 問:連線的屬性為什么不放到.h中?
    答:放入延展類,防止外部對象訪問,達到私有化效果

  • 問:連線方法為什么不放到類擴展中?
    答:沒有必要聲明方法

  • 問:什么是IBOutlet和IBAction?
    答:IBOutlet表示連線的是一個屬性
    IBAction表示連線的是一個方法

  • 問:控件為什么用weak修飾?
    答:weak表示弱引用,相關內容在UI基礎-02中詳細解答

Tips:
1.刪除方法的時候,一定要把storyboard中的連線刪除
2.快捷鍵:
顯示/隱藏左側導航區(qū)域 Command+0
顯示/隱藏右側實用工具欄Command+option+0
打開/關閉輔助編譯器
打開 Command+option+enter
關閉 Command+enter
查找頭文件 shift+Command+o
離線文檔 shift+Command+0

Demo02:小飛機

點擊方向鍵,讓小飛機移動

plane.gif

1.設置界面

- (void)viewDidLoad {
    [super viewDidLoad];
    //設置背景
    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.設置小飛機
    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)聽
    [arrow addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
    
}

2.實現按鈕的點擊事件

-(void)clickButton:(UIButton *)button{
    CGRect tempFrame=self.button.frame;
    tempFrame.origin.y-=10;
    self.button.frame=tempFrame;
}

Tips
1.按鈕的狀態(tài)和相關設置:
Default:默認
Highlighted:被點擊高亮
Selected:id類型的Sender就是表示按鈕本身,按鈕selected屬性,默認為No,修改為YES表示被選中,isSelected屬性判斷是否被選中
Disable:enabled屬性,默認值為YES,可以接收用戶點擊事件,修改為NO,不可以接收用戶點擊事件,isEnabled判斷是否能夠點擊

background image和image:
設置background image和title:background image在底層,title在圖片上層
設置image和title:image在左側,title在右側(默認狀態(tài),可以通過offset修改位置)
設置background image:圖片按照按鈕尺寸
設置按鈕的image:按鈕按照圖片尺寸

按鈕使用注意:image/backgroundimage/title,一定要分狀態(tài)設置

2.OC中的坐標系
我們以這個項目為例

Snip20170317_16.png

frame:表示子view在父view的位置
center:子view中心在父view的位置,根據frame確定
bounds:view相對于自身,左上角為坐標原點,根據frame確定

修改frame:不能直接修改對象結構體中的內容
基本實現:獲取對象的frame賦值給臨時frame-修改臨時frame-給frame賦值

CGRect tempFrame=self.OBJect.frame;
CGRect tempFrame=self.OBJect.frame;
self.NSObject.frame=tempFrame;

3.UIView的Tag:view的標記

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容