1.拖一個Scroll View視圖填充View窗口,將Scroll View視圖拖大一些,使其超出屏幕。
2.向Scroll View拖(添加)多個Label視圖和Text View視圖。
3.在.h頭文件中添加如下代碼:
- #import?<UIKit/UIKit.h> ??
- ??
- ??
- @interface?ShowTextFiled?:?UIViewController?{??
- ????IBOutlet?UIScrollView?*myscrollview;??
- ??????
- ????UITextField?*?currentTextfield;//當前的文本筐 ??
- ????BOOL?keyboardIsShown;??
- }??
- @property?(nonatomic,retain)UIScrollView?*myscrollview;??
- ??
- @end??
#import <UIKit/UIKit.h>
@interface ShowTextFiled : UIViewController {
IBOutlet UIScrollView *myscrollview;
UITextField * currentTextfield;//當前的文本筐
BOOL keyboardIsShown;
}
@property (nonatomic,retain)UIScrollView *myscrollview;
@end
4.在Interface Builer中,將每個Text Field的delegate連接到File‘s Owner。這一步很重要,因為它使得文本筐的各種事件如:textFieldDidBeginEditing。textFieldDidEndEditing等可被試圖控制器處理。
5.在viewDidLoad方法里面修改ScrollView的內容大小:
- -?(void)viewDidLoad??
- {??
- ????//下面這兩句話必須寫,否則scrollview不可以動 ??
- ????myscrollview.frame?=?CGRectMake(0,?0,?320,?460);??
- ????[myscrollview?setContentSize:CGSizeMake(320,651?)];??
- ????[super?viewDidLoad];??
- ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib. ??
- }??
- (void)viewDidLoad
{
//下面這兩句話必須寫,否則scrollview不可以動
myscrollview.frame = CGRectMake(0, 0, 320, 460);
[myscrollview setContentSize:CGSizeMake(320,651 )];
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
6.在View窗口顯示以前注冊兩個通知,這兩個通知可以告訴你鍵盤何時顯示或消失,在viewWillAppear方法里面注冊:
- //頁面加載前調用的方法,注冊兩個通知:一個是鍵盤彈出來的通知,另外一個是鍵盤隱藏的通知,不同的通知調用不同的方法進行處理 ??
- -(void)?viewWillAppear:(BOOL)animated{??
- ????//鍵盤彈起的通知 ??
- ????[[NSNotificationCenter?defaultCenter]???
- ?????addObserver:self??
- ?????selector:@selector(keyboardDidShow:)???
- ?????name:UIKeyboardDidShowNotification??
- ?????object:self.view.window];??
- ????//鍵盤隱藏的通知 ??
- ????[[NSNotificationCenter?defaultCenter]??
- ?????addObserver:self??
- ?????selector:@selector(keyboardDidHide:)???
- ?????name:UIKeyboardDidHideNotification???
- ?????object:nil];??
- }??
//頁面加載前調用的方法,注冊兩個通知:一個是鍵盤彈出來的通知,另外一個是鍵盤隱藏的通知,不同的通知調用不同的方法進行處理
-(void) viewWillAppear:(BOOL)animated{
//鍵盤彈起的通知
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:self.view.window];
//鍵盤隱藏的通知
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:nil];
}
7.上面的通知中,當鍵盤彈起的時候會調用 keyboardDidShow方法,當鍵盤消失會調用keyboardDidHide方法,這兩個方法定義如下:
- //鍵盤彈起后處理scrollView的高度使得textfield可見 ??
- -(void)keyboardDidShow:(NSNotification?*)notification{??
- ????if?(keyboardIsShown)?{??
- ????????return;??
- ????}??
- ????NSDictionary?*?info?=?[notification?userInfo];??
- ????NSValue?*avalue?=?[info?objectForKey:UIKeyboardFrameEndUserInfoKey];??
- ????CGRect?keyboardRect?=?[self.view?convertRect:[avalue?CGRectValue]?fromView:nil];??
- ????CGRect?viewFrame?=?[myscrollview?frame];??
- ????viewFrame.size.height?-=?keyboardRect.size.height;??
- ????myscrollview.frame?=?viewFrame;??
- ????CGRect?textFieldRect?=?[currentTextfield?frame];??
- ????[myscrollview?scrollRectToVisible:textFieldRect?animated:YES];??
- ????keyboardIsShown?=?YES;??
- }??
//鍵盤彈起后處理scrollView的高度使得textfield可見
-(void)keyboardDidShow:(NSNotification *)notification{
if (keyboardIsShown) {
return;
}
NSDictionary * info = [notification userInfo];
NSValue *avalue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [self.view convertRect:[avalue CGRectValue] fromView:nil];
CGRect viewFrame = [myscrollview frame];
viewFrame.size.height -= keyboardRect.size.height;
myscrollview.frame = viewFrame;
CGRect textFieldRect = [currentTextfield frame];
[myscrollview scrollRectToVisible:textFieldRect animated:YES];
keyboardIsShown = YES;
}
- //鍵盤隱藏后處理scrollview的高度,使其還原為本來的高度 ??
- -(void)keyboardDidHide:(NSNotification?*)notification{??
- ????NSDictionary?*info?=?[notification?userInfo];??
- ????NSValue?*avalue?=?[info?objectForKey:UIKeyboardFrameEndUserInfoKey];??
- ????CGRect?keyboardRect?=?[self.view?convertRect:[avalue?CGRectValue]?fromView:nil];??
- ????CGRect?viewFrame?=?[myscrollview?frame];??
- ????viewFrame.size.height?+=?keyboardRect.size.height;??
- ????myscrollview.frame?=?viewFrame;??
- ????keyboardIsShown?=?NO;??
- }??
//鍵盤隱藏后處理scrollview的高度,使其還原為本來的高度
-(void)keyboardDidHide:(NSNotification *)notification{
NSDictionary *info = [notification userInfo];
NSValue *avalue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [self.view convertRect:[avalue CGRectValue] fromView:nil];
CGRect viewFrame = [myscrollview frame];
viewFrame.size.height += keyboardRect.size.height;
myscrollview.frame = viewFrame;
keyboardIsShown = NO;
}
8.重寫TextField的三個事件方法:
當點擊TextField視圖時會促發如下方法:這個方法會將當前點擊的文本筐賦值給currentTextField成員變量
- -(void)textFieldDidBeginEditing:(UITextField?*)textFieldView{??
- ????currentTextfield?=?textFieldView;??
- }??
-(void)textFieldDidBeginEditing:(UITextField *)textFieldView{
currentTextfield = textFieldView;
}
當用戶點擊鍵盤中的Return鍵時,會促發如下方法:
- -(BOOL)textFieldShouldReturn:(UITextField?*)textFieldView{??
- ????[textFieldView?resignFirstResponder];??
- ????return?NO;??
- }??
-(BOOL)textFieldShouldReturn:(UITextField *)textFieldView{
[textFieldView resignFirstResponder];
return NO;
}
上一個方法中的resignFirstResponder會隱藏鍵盤,這樣會促發另外一個方法:這里將currentTextField設為nil
- -(void)textFieldDidEndEditing:(UITextField?*)textFieldView{??
- ????currentTextfield?=?nil;??
- }??
-(void)textFieldDidEndEditing:(UITextField *)textFieldView{
currentTextfield = nil;
}
9.最后不要忘了在View窗口關閉之前移除前面注冊的通知:
- //頁面消失前取消通知 ??
- -(void)viewWillDisappear:(BOOL)animated{??
- ????[[NSNotificationCenter?defaultCenter]??
- ?????removeObserver:self??
- ?????name:UIKeyboardDidShowNotification??
- ?????object:nil];??
- ??????
- ????[[NSNotificationCenter?defaultCenter]??
- ?????removeObserver:self??
- ?????name:UIKeyboardDidHideNotification??
- ?????object:nil];??
- }??
//頁面消失前取消通知
-(void)viewWillDisappear:(BOOL)animated{
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardDidHideNotification
object:nil];
}


生命在于運動,先去打球,晚上回來在繼續,哈哈。