iOS學習日記(十九)委託與文本輸入

1,文本框 UITextField
UILabel可以在界面中顯示文本,但是用戶無法選擇或者編輯,相反,UITextField可以接受用戶輸入的文本,例如在登錄界面中,如果需要用戶輸入用戶名和密碼,就可以使用UITextField

打開BNRHypnosisViewContro.m 修改loadView方法,向view中添加一個UITextField對象:

- (void)loadView
{
    CGRect frame = [UIScreen mainScreen].bounds;
    BNRHypnosisView *backgroundView = [[BNRHypnosisView alloc] initWithFrame:frame];
    
    CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
    UITextField *textField=[[UITextField alloc] initWithFrame:textFieldRect];
    textField.borderStyle=UITextBorderStyleRoundedRect;
    [backgroundView addSubview:textField];
    self.view = backgroundView;
}

在這裏插入圖片描述
構建並運行,比原來多顯示了一個文本框,點擊文本框會彈出鍵盤。

設置UITextField的鍵盤
UITextField對象有一系列屬性用來設置彈出的鍵盤,下面修改2個,添加佔位符文本並修改鍵盤的換行鍵類型。
textField.placeholder=@"Hypnotize me ";
textField.returnKeyType=UIReturnKeyDone;
在這裏插入圖片描述
看到 return 變成了done
2,委託

像UITextField這類複雜的對象,apple使用委託設計模式。這個對象有一個委託屬性,通過爲這個對象設置委託,會在發生事件時間向委託發送相應的消息,由委託處理該事件。
例如編輯UITextField對象文本內容的事件,有以下兩個對應的委託方法:

- (void)textFieldDidEndEditing:(UITextField *)textField;
- (void)textFieldDidBeginEditing:(UITextField *)textField;
還有一類帶有返回時的委託方法,用於委託中查詢需要的信息,例如
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSLog(@"%@",textField.text);
    return YES;
}
輸入文字,點擊done,控制檯會輸出文字。

3,協議
凡是支持協議的對象,背後都有一個相應的協議(接口),聲明可以向該對象的委託對象發送的消息,委託對象根據這個協議爲其感興趣的事件實現相應的方法。如果一個類實現了某個協議中規定的方法,就稱這個類遵守該協議。

聲明協議的語法是
@protocol開頭 +協議名稱+<xxx協議包含>
接着聲明新協議特有方法

分兩類 一類@optional 是可選的協議,和必須協議。協議方法默認是必須的,使用@optional可以把後面的方法聲明爲可選的

@end結束

例如

@protocol UITextFieldDelegate<NSObject>

@optional

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;
- (BOOL)textFieldDidBeginEditing:(UITextField *)textField;
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;
- (void)textFieldDidEndEditing:(UITextField *)textField;
@end

要讓編譯器能夠執行檢查某個類是否實現了相應協議的必須方法,把相應的類聲明爲遵守指定的協議,語法格式在頭文件或者類擴展的@interface指令末尾 加尖括號裏把協議以逗號分隔的列表形式寫進去。

例如把BNRHypnosisViewController聲明爲遵循UITextFieldDelegate協議
代碼如下

@interface BNRHypnosisViewController()<UITextFieldDelegate>
@end

4,向屏幕中添加UILabel對象
增強HypnoNerd的催眠效果,本節添加出現在屏幕隨機位置的UILabel對象。

首先在BNRHypnosisViewController.m中添加新方法如下

- (void)drawHypnoticMessage:(NSString *)message
{
    for(int i = 0; i < 20; i++)
    {
        UILabel *messageLabel = [[UILabel alloc] init];
        messageLabel.backgroundColor = [UIColor clearColor];
        messageLabel.textColor = [UIColor whiteColor];
        messageLabel.text = message;
        
        [messageLabel sizeToFit];
        //獲取隨機的X Y座標
        int width=(int)(self.view.bounds.size.width - messageLabel.bounds.size.width);
        int x = arc4random() % width;
        int height=(int)(self.view.bounds.size.height - messageLabel.bounds.size.height);
        int y = arc4random() % height;
        //把UILabel對象添加到BNR的view中
        CGRect frame = messageLabel.frame;
        frame.origin = CGPointMake(x, y);
        messageLabel.frame = frame;
        [self.view addSubview:messageLabel];
    }
}

接下來修改textFieldShouldReturn:
點擊done之後將要發生的事情:
發送添加對象,重置文本,收齊鍵盤

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [self drawHypnoticMessage:textField.text];
    
    textField.text=@"";
    [textField resignFirstResponder];
    return YES;
}

構建並運行,輸入文字,點擊done 輸出的文字隨機出現在屏幕的各個位置。

增加運動效果
通過UIInterpolatingMotionEffect 類實現效果,設置方向,鍵路徑,相對最大最小值,添加到某個視圖上

在BNRHypnosisViewController.m 中,修改drawHypnoticMessage:方法,爲UILabel對象分別添加水平方向和垂直方向的視察效果,使UILabel對象的中心點座標在每個方向上最多移動25點。

//添加視覺效果
        UIInterpolatingMotionEffect *motionEffecet;
        motionEffecet = [[UIInterpolatingMotionEffect alloc]
        initWithKeyPath:@"center.x"
                type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
        motionEffecet.minimumRelativeValue = @(-25);
        motionEffecet.maximumRelativeValue = @(25);
        [messageLabel addMotionEffect:motionEffecet];
        
        motionEffecet = [[UIInterpolatingMotionEffect alloc]
                         initWithKeyPath:@"center.y"
                                    type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
        motionEffecet.minimumRelativeValue = @(-25);
        motionEffecet.maximumRelativeValue = @(25);
        [messageLabel addMotionEffect:motionEffecet];

在真實設備中運行纔可看到效果,傾斜屏幕看到UILabel對象隨着傾斜方向移動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章