亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫)

 更新時間:2016年09月25日 08:48:30   作者:rookieJX  
這篇文章主要介紹了iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫) 的相關(guān)資料,需要的朋友可以參考下

•文本框(UITextField)

  本章節(jié)繼續(xù)編輯 JXHypnoNerd 。文件地址 。

  首先我們繼續(xù)編輯 JXHypnosisViewController.m 修改 loadView 方法,向 view 中添加一個 UITextField 對象:

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
@end

  構(gòu)建并運行應(yīng)用,項目中會顯示一個文本框,該文本框就是剛才我們添加的 UITextField 對象。點擊文本框,這時屏幕底部就會彈出鍵盤,用于向文本框中輸入文字,下面我們介紹一下第一響應(yīng)者。

•UIResponder

  UIResponder 是 UIKit 框架中的一個抽象類。之前我們了解過他的幾個子類。

1.  UIView

2.  UIViewController

3. UIApplication

  UIResponder 定義了一系列方法,用于接收和處理用戶事件,例如 觸摸事件、運動事件(搖晃設(shè)備)和功能控制事件(如編輯文本或者音樂播放)等。 UIResponder 的子類會覆蓋這些方法,實現(xiàn)自己的事件響應(yīng)代碼。

  在以上事件中,觸摸事件顯然應(yīng)該由被觸摸的視圖負責(zé)處理。系統(tǒng)會將觸摸事件直接發(fā)送給被觸摸的視圖。

  其他類型的事件則會由第一響應(yīng)者負責(zé)處理,UIWindow 有一個 firstResponder 屬性指向第一響應(yīng)者。例如,當(dāng)用戶點擊 UITextField 對象時, UITextField 對象就會成為第一響應(yīng)者。UIWindow 會將 firstResponder 指向該對象,之后,如果應(yīng)用接收到運動事件和功能控制事件,都會發(fā)送給 UITextField 對象。

  當(dāng)某個 UITextField 對象或 UITextView 對象成為第一響應(yīng)者時,屏幕就會彈出鍵盤。除了用戶點擊之外,還可以在代碼中向 UITextField 對象發(fā)送 becomeFirstResponder 消息,使其成為第一響應(yīng)者。相反,如果要關(guān)閉鍵盤,則可以向 UITextField 對象發(fā)送 resignFirstResponder 消息,且要求改對象放棄第一響應(yīng)者狀態(tài)。一旦第一響應(yīng)者不是 UITextField 對象,鍵盤就會消失。

  實際上,大部分視圖都不需要成為第一響應(yīng)者。例如 UISlider 對象,該對象只會處理觸摸事件(用戶拖拽滑塊),而不會接收其他類型的事件,因此它不需要成為第一響應(yīng)者。

•設(shè)置 UITextField 的鍵盤

  UITextField 對象有一系列屬性,用于設(shè)置彈出的鍵盤。下面就修改這些屬性,為 UITextField 對象添加占位符文本,并修改鍵盤的換行鍵盤類型。

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
// 修改占位符
textField.placeholder = @"Hypontize me";
// 修改鍵盤類型
textField.returnKeyType = UIReturnKeyDone;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
@end

  構(gòu)建并運行,在程序中就會發(fā)現(xiàn)有一行占位符文本 Hypontize me ,當(dāng)用戶在程序中輸入文字的時候,占位文本就會消失。換行鍵不再顯示默認的 Return,而是 Done。

  但是,如果我們點擊 Done 就會發(fā)現(xiàn)沒有任何反應(yīng)。實際上,修改換行鍵盤的類型知識改變了換行鍵的外觀,如果需要實現(xiàn)用戶點擊換行鍵后的功能,必須實現(xiàn)編寫響應(yīng)的代碼。在編寫代碼之前,在介紹 UITextField 對象中另外介個有用的屬性

•委托

  我們知道 目標(biāo)-動作(Target-Action)設(shè)計模式。目標(biāo)-動作 是 UIKit 中通常用的設(shè)計模式之一。目標(biāo)-動作的工作方式為:當(dāng)某個特定的事件發(fā)生時(例如按下按鈕),發(fā)生事件的一方會向指定的目標(biāo)對象發(fā)送一個之前設(shè)定好的動作消息。所有繼承 UIControl 對象都可以設(shè)置目標(biāo)-動作。

  在 目標(biāo)-動作中,針對不同的事件,需要創(chuàng)建不同的動作消息。UIButton 對象的事件比較簡單,通常只需要處理點擊事件:相反,像 UITextField 這類事件復(fù)雜的對象,偉大的蘋果使用了 委托設(shè)計模式 。UITextField 對象具有一個委托屬性,通過為 UITextField 對象設(shè)置委托,UITextField 對象會在發(fā)生事件時向委托發(fā)送響應(yīng)的消息,由委托處理該時間。例如,對于編輯 UITextField 對象文本內(nèi)容的事件,有對象的委托方法。

@protocol UITextFieldDelegate <NSObject>
@optional
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; // return NO to disallow editing.
- (void)textFieldDidBeginEditing:(UITextField *)textField; // became first responder
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField; // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
- (void)textFieldDidEndEditing:(UITextField *)textField; // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
- (BOOL)textFieldShouldClear:(UITextField *)textField; // called when clear button pressed. return NO to ignore (no notifications)
- (BOOL)textFieldShouldReturn:(UITextField *)textField; // called when 'return' key pressed. return NO to ignore.
@end

  注意:在委托方法中,通常應(yīng)該將對象自身作為第一個參數(shù)。多個對象可能具有相同的委托,當(dāng)委托收到消息的時候,需要根據(jù)該參數(shù)判斷發(fā)送該消息的對象。例如,如果某個視圖控制器中包含多個 UITextField 對象,它們的委托都是該視圖控制器,那么視圖控制器就需要根據(jù) textField 參數(shù)獲取響應(yīng)的 UITextField 對象并執(zhí)行不同的操作。

  下面我們就將 UITextField 對象所位于的視圖控制器- JXHypnosisViewController 設(shè)置為它的委托,并實現(xiàn) textFieldShouldReturn: 委托方法,當(dāng)用戶點擊 Done 按鈕時,UITextField 對象就會調(diào)用該方法。

  打開 JXHypnosisViewController 修改 loadView 方法,將 UITextField 對象的委托屬性設(shè)置為 JXHypnosisViewController 自身。

   textFieldShouldReturn: 只有一個參數(shù),就是用戶點擊換行鍵的相應(yīng) UITextField 對象。目前,應(yīng)用只會向控制臺輸出 UITextField 對象的文本內(nèi)容。

  接下來在代碼中實現(xiàn) textFieldShouldReturn: 方法。

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
// 修改占位符
textField.placeholder = @"Hypontize me";
// 修改鍵盤類型
textField.returnKeyType = UIReturnKeyDone;
textField.delegate = self;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%@",textField.text);
return YES;
}
@end

  構(gòu)建并運行程序,就可以在控制臺打印信息,但是這里會有一處警告,暫時先不管。

  請注意, JXHypnosisViewController 不需要實現(xiàn) UITextField 對象的所有委托方法,UITextField 對象會在運行時檢查委托方法是否實現(xiàn)了某個方法,如果沒有實現(xiàn) UITextField 對象就不會調(diào)用該方法。

•協(xié)議

  凡是支持委托的對象,其背后都有一個相應(yīng)的協(xié)議,聲明可以向該對象(例如:UITextField)的委托對象(例如:JXHypnosisViewController)發(fā)送的消息。委托對象(例如:JXHypnosisViewController)需要根據(jù)這個協(xié)議為其響應(yīng)的事件實現(xiàn)響應(yīng)的方法。如果一個類實現(xiàn)了某個協(xié)議中規(guī)定的方法,就稱這個類遵守該協(xié)議。

  聲明協(xié)議的語法是,使用 @protocol 指令開頭,后跟協(xié)議的名稱(例如:UITextFieldDelegate)。尖括號里的 NSObject 是指只 NSObject 協(xié)議,其作用是聲明 UITextFieldDelegate 中包含 NSObject 協(xié)議的全部方法。接著聲明新協(xié)議特有的方法,最后使用 @end 指令來結(jié)束。

  協(xié)議不是類,只是一組方法聲明。不能為協(xié)議創(chuàng)建對象,或者添加實例變量。協(xié)議自身不實現(xiàn)方法,需要由遵守相應(yīng)協(xié)議的類來實現(xiàn)。

  協(xié)議所聲明的方法可以是必須的(required)或者是可選的(optional)。協(xié)議方法默認都是必須的,所以當(dāng)我們自定義協(xié)議的時候最好設(shè)置一下。使用 @optional 指令,可以將寫在該指令之后的方法去全部聲明為可選的。

  發(fā)送方在發(fā)送可選方法之前,都會先向其委托發(fā)送另一個名為 respondsToSelector: 的消息。所有Objective-C 對象都從 NSObject 繼承了 respondsToSelector: 方法,該方法能在運行時檢查對象是否實現(xiàn)了指定的方法。 @selector() 指令可以將選擇器(selector)轉(zhuǎn)換成數(shù)值,以便將其作為參數(shù)進行傳遞。

- (void)clearButtonTapped {
// textFieldShouldClear:是可選方法,需要先檢查委托是否實現(xiàn)了該方法
SEL clearSelector = @selector(textFieldShouldClear:);
if ([self.delegate respondsToSelector:clearSelector]) {
self.text = @"";
}
}

  如果某個方法是必須的,那么發(fā)送發(fā)可以直接向其委托對象發(fā)送相應(yīng)的消息,不用檢查委托對象是否實現(xiàn)了該方法。這也就意味著,如果委托對象沒有實現(xiàn)相應(yīng)的方法,應(yīng)用就會拋出位置選擇器(unrecognized selector)異常,導(dǎo)致應(yīng)用崩潰。

  為了防止問題,編譯器會檢查某個類是否實現(xiàn)了相關(guān)協(xié)議的必須方法。要讓編譯器能夠執(zhí)行此類檢查,必須將相應(yīng)的類聲明為遵守指定的協(xié)議,其語法格式為:在頭文件或類擴展 @interface 指令末尾,將類所遵守的協(xié)議以都好分隔的列表形式寫在尖括號里。

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()<UITextFieldDelegate>
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
// 修改占位符
textField.placeholder = @"Hypontize me";
// 修改鍵盤類型
textField.returnKeyType = UIReturnKeyDone;
textField.delegate = self;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%@",textField.text);
return YES;
}
@end

  幾乎所有的委托都是弱引用屬性。這是為了避免對象及其委托之間產(chǎn)生強引用循環(huán)。例如: JXHypnosisViewController 是 UITextField 對象的委托,而且 UITextField 對象是 JXHypnosisViewController 的強引用屬性,如果 UITextField 對象再對其委托保持強引用就會在兩者之間產(chǎn)生強引用循環(huán)。

•向屏幕中添加UILabel對象

  下面我們在 JXHypnosisViewController 中添加一個新方法,在屏幕中隨機位置繪制20個 UILabel 對象。同時,該方法有一個 NSString 類型的參數(shù),表示 UILabel 對象顯示的文字。

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()<UITextFieldDelegate>
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
// 修改占位符
textField.placeholder = @"Hypontize me";
// 修改鍵盤類型
textField.returnKeyType = UIReturnKeyDone;
textField.delegate = self;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%@",textField.text);
return YES;
}
- (void)drawHypnoticMessage:(NSString *)message {
for (NSInteger i = 0; i < 20; i++) {
UILabel * messageLabel = [[UILabel alloc] init];
// 設(shè)置 UIlabel 對象的文字和顏色
messageLabel.backgroundColor = [UIColor clearColor];
messageLabel.textColor = [UIColor whiteColor];
messageLabel.text = message;
//根據(jù)要顯示的文字調(diào)整 UILabel 對象的大小
[messageLabel sizeToFit];
// 獲取隨機 x 坐標(biāo)
// 使 UILabe 對象的寬度不超出控制器的 view 寬度
NSInteger width = self.view.bounds.size.width - messageLabel.bounds.size.width;
NSInteger x = arc4random() % width;
// 獲取隨機 y 坐標(biāo)
// 使 UILabel 對象的高度不超出控制器的 view 寬度
NSInteger height = self.view.bounds.size.height - messageLabel.bounds.size.height;
NSInteger y = arc4random() % height;
// 設(shè)置 UILabel 對象的 frame
CGRect frame = messageLabel.frame;
frame.origin = CGPointMake(x, y);
messageLabel.frame = frame;
// 將 UILabel 對象添加到控制器的 view 中
[self.view addSubview:messageLabel];
}
}
@end

  接下來修改 textFieldShouldReturn: 將 UITextField 對象的文本內(nèi)容作為 參數(shù),調(diào)動我們自定義的方法,之后清空文本內(nèi)容,最后調(diào)用 resignFirstResponder 關(guān)閉鍵盤。

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()<UITextFieldDelegate>
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
// 修改占位符
textField.placeholder = @"Hypontize me";
// 修改鍵盤類型
textField.returnKeyType = UIReturnKeyDone;
textField.delegate = self;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%@",textField.text);
[self drawHypnoticMessage:textField.text];
textField.text = @"";
[textField resignFirstResponder];
return YES;
}
- (void)drawHypnoticMessage:(NSString *)message {
for (NSInteger i = 0; i < 20; i++) {
UILabel * messageLabel = [[UILabel alloc] init];
// 設(shè)置 UIlabel 對象的文字和顏色
messageLabel.backgroundColor = [UIColor clearColor];
messageLabel.textColor = [UIColor whiteColor];
messageLabel.text = message;
//根據(jù)要顯示的文字調(diào)整 UILabel 對象的大小
[messageLabel sizeToFit];
// 獲取隨機 x 坐標(biāo)
// 使 UILabe 對象的寬度不超出控制器的 view 寬度
NSInteger width = self.view.bounds.size.width - messageLabel.bounds.size.width;
NSInteger x = arc4random() % width;
// 獲取隨機 y 坐標(biāo)
// 使 UILabel 對象的高度不超出控制器的 view 寬度
NSInteger height = self.view.bounds.size.height - messageLabel.bounds.size.height;
NSInteger y = arc4random() % height;
// 設(shè)置 UILabel 對象的 frame
CGRect frame = messageLabel.frame;
frame.origin = CGPointMake(x, y);
messageLabel.frame = frame;
// 將 UILabel 對象添加到控制器的 view 中
[self.view addSubview:messageLabel];
}
}
@end

  構(gòu)建并運行。

•運動效果

  iOS設(shè)備內(nèi)嵌了許多功能強大的傳感器,例如加速傳感器,磁場傳感器和三軸陀螺儀等。應(yīng)用可以通過這些傳感器了解設(shè)備加速,方向和角度,并實現(xiàn)有用的功能。例如,應(yīng)用可以根據(jù)設(shè)備的方向自動將界面調(diào)整為橫屏或者豎屏模式。從iOS7開始,蘋果引用了一些新 API 可以輕松為應(yīng)用添加一種通過傳感器實現(xiàn)的視覺差效果。

  我們可以想象自己坐在一輛飛馳的大奔中,我們看想窗外,會發(fā)現(xiàn)遠處的景物的倒退速度比近處的慢很多。這是大腦對空間和速度差異產(chǎn)生的一種錯覺,稱之為視差。在iOS7 及之后這種效果隨處可見,例如,在主屏幕中,如果稍微傾斜設(shè)備,可以發(fā)現(xiàn)主屏幕中的圖標(biāo)會隨著傾斜方向相對于壁紙移動。

  應(yīng)用可以通過 UIInterpolatingMotionEffect 類來實現(xiàn)相同的效果,我們只需要創(chuàng)建一個 UIInterpolatingMotionEffect 對象,設(shè)置其方向(垂直或者水平)、鍵路勁(key path,需要使用視差效果的屬性)和相對最小/最大值(視覺差的范圍),再將其添加到某個視圖上,該視圖就能獲得相應(yīng)的視差效果。

#import "JXHypnosisViewController.h"
#import "JXHypnosisView.h"
@interface JXHypnosisViewController ()<UITextFieldDelegate>
@end
@implementation JXHypnosisViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// 設(shè)置標(biāo)簽項的標(biāo)題
self.tabBarItem.title = @"Hypnotize";
// 從圖片文件創(chuàng)建一個 UIImage 對象
UIImage * i = [UIImage imageNamed:@"Hypno"];
// 將 UIImage 對象賦值給標(biāo)簽項的 iamge 屬性
self.tabBarItem.image = i;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)loadView {
// 創(chuàng)建一個 JXHypnosisView 對象
JXHypnosisView * backgroundView = [[JXHypnosisView alloc] init];
CGRect textFieldRect = CGRectMake(40, 70, 240, 30);
UITextField * textField = [[UITextField alloc] init];
textField.frame = textFieldRect;
// 設(shè)置 UITextField 對象的邊框樣式,便于查看它在屏幕上的位置
textField.borderStyle = UITextBorderStyleRoundedRect;
// 修改占位符
textField.placeholder = @"Hypontize me";
// 修改鍵盤類型
textField.returnKeyType = UIReturnKeyDone;
textField.delegate = self;
[backgroundView addSubview:textField];
// 將 JXHypnosisView 對象賦給視圖控制器的view 屬性
self.view = backgroundView;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[self drawHypnoticMessage:textField.text];
textField.text = @"";
[textField resignFirstResponder];
return YES;
}
- (void)drawHypnoticMessage:(NSString *)message {
for (NSInteger i = 0; i < 20; i++) {
UILabel * messageLabel = [[UILabel alloc] init];
// 設(shè)置 UIlabel 對象的文字和顏色
messageLabel.backgroundColor = [UIColor clearColor];
messageLabel.textColor = [UIColor whiteColor];
messageLabel.text = message;
//根據(jù)要顯示的文字調(diào)整 UILabel 對象的大小
[messageLabel sizeToFit];
// 獲取隨機 x 坐標(biāo)
// 使 UILabe 對象的寬度不超出控制器的 view 寬度
NSInteger width = self.view.bounds.size.width - messageLabel.bounds.size.width;
NSInteger x = arc4random() % width;
// 獲取隨機 y 坐標(biāo)
// 使 UILabel 對象的高度不超出控制器的 view 寬度
NSInteger height = self.view.bounds.size.height - messageLabel.bounds.size.height;
NSInteger y = arc4random() % height;
// 設(shè)置 UILabel 對象的 frame
CGRect frame = messageLabel.frame;
frame.origin = CGPointMake(x, y);
messageLabel.frame = frame;
// 將 UILabel 對象添加到控制器的 view 中
[self.view addSubview:messageLabel];
UIInterpolatingMotionEffect * motionEffect;
motionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
motionEffect.minimumRelativeValue = @(-25);
motionEffect.maximumRelativeValue = @(25);
[messageLabel addMotionEffect:motionEffect];
motionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
motionEffect.minimumRelativeValue = @(-25);
motionEffect.maximumRelativeValue = @(25);
[messageLabel addMotionEffect:motionEffect];
}
}
@end

  測試運動效果必須在真機上。

•深入學(xué)習(xí):main() 和 UIApplication

  用C語言編寫的程序,其至此那個入口都是 main() 。用 Objective-C 語言編寫的程序也是這樣。

  在 JXHypnoNerd 項目中我們在 mian.m,可以看到有如下代碼

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

  這段代碼中的 UIApplicationMain 函數(shù)會創(chuàng)建一個 UIApplication 對象。 每個iOS應(yīng)用都有且只有一個UIApplication對象,該對象的作用就是維護運行循環(huán)。一旦程序創(chuàng)建了某個 UIApplication 對象,該對象的運行循環(huán)就會一直循環(huán)下去,main() 的執(zhí)行也會因此堵塞。

  此外, UIApplicationMain 函數(shù)還會創(chuàng)建某個指定類的對象,并將其設(shè)置為 UIApplication 對象的 delegate 。該對象的類是由 UIApplicationMain 函數(shù)的最后一個實參指定的,該實參的類型是 NSString 對象,代表的是某個類的類名。所以在以上這段代碼中, UIApplicationMain 會創(chuàng)建一個 AppDelegate 對象,并將其設(shè)置為 UIApplication 對象的 delegate 。

  在應(yīng)用啟動運行循環(huán)并開始接收事件之前,UIApplication 對象會向其委托發(fā)送一個特性的消息,使應(yīng)用能有機會完成相應(yīng)的初始化工作。這個消息的名稱是

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

以上所述是小編給大家介紹的iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • IOSdrawRect實現(xiàn)雪花飄落效果

    IOSdrawRect實現(xiàn)雪花飄落效果

    這篇文章主要為大家詳細介紹了IOSdrawRect實現(xiàn)雪花飄落效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • IOS利用CocoaHttpServer搭建手機本地服務(wù)器

    IOS利用CocoaHttpServer搭建手機本地服務(wù)器

    這篇文章主要介紹了IOS利用CocoaHttpServer搭建手機本地服務(wù)器的步驟,幫助大家更好的理解和學(xué)習(xí)使用ios開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • ios的簽名機制詳解

    ios的簽名機制詳解

    這篇文章主要介紹了ios的簽名機制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用ios開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • iOs遷至WKWebView跨過的一些坑

    iOs遷至WKWebView跨過的一些坑

    這篇文章主要給大家介紹了關(guān)于iOs遷至WKWebView跨過的一些坑,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • iOS實現(xiàn)淘寶上拉進入詳情頁交互效果

    iOS實現(xiàn)淘寶上拉進入詳情頁交互效果

    最近遇到一個項目,項目中某個新需求的交互要求仿照淘寶上拉從下往上彈出寶貝詳情。所以死打開淘寶APP仔細看了看,然后自己寫了寫,現(xiàn)在感覺效果差不多了,記錄一下分享給大家,方法自己和大家需要的時候查看借鑒,感興趣的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • iOS 斷點上傳文件的實現(xiàn)方法

    iOS 斷點上傳文件的實現(xiàn)方法

    這項目開發(fā)中,有時候我們需要將本地的文件上傳到服務(wù)器,簡單的幾張圖片還好,但是針對iPhone里面的視頻文件進行上傳,為了用戶體驗,我們有必要實現(xiàn)斷點上傳。這篇文章主要介紹了iOS 斷點上傳文件的實現(xiàn)方法,需要的朋友可以參考下
    2017-12-12
  • iOS 解決按鈕背景圖片拉伸問題(推薦)

    iOS 解決按鈕背景圖片拉伸問題(推薦)

    這篇文章主要介紹了iOS 解決按鈕背景圖片拉伸問題(推薦),需要的朋友可以參考下
    2017-10-10
  • ios設(shè)備使用iframe寬度超出屏幕的解決方法

    ios設(shè)備使用iframe寬度超出屏幕的解決方法

    這篇文章主要給大家介紹了關(guān)于ios設(shè)備使用iframe寬度超出屏幕的解決方法,文中通過示例代碼介紹的非常詳細,對各位ios開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 深入理解IOS控件布局之Masonry布局框架

    深入理解IOS控件布局之Masonry布局框架

    本篇文章主要介紹了深入理解IOS控件布局之Masonry布局框架 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • iOS中UITableView使用的常見問題總結(jié)

    iOS中UITableView使用的常見問題總結(jié)

    這篇文章主要總結(jié)了iOS中UITableView使用的常見問題,其中包括如何設(shè)置headerView以及其高度、去掉多余cell的分割線 以及如何設(shè)置section數(shù)、行數(shù)等一系列的問題,文中介紹的更詳細,需要的朋友們下面來一起看看詳細介紹吧。
    2017-03-03

最新評論