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對象隨着傾斜方向移動。