如何避免鍵盤遮擋UITextField的解決方案(上)

這篇文章我曾在另一個博客發(fā)表過既忆,3年過去了驱负,之前一直沒有寫博客的習(xí)慣,一拖就是三年患雇,是時候?qū)懴乱黄说缦薄R韵率侵暗陌徇\,并在排版上有些調(diào)整庆亡。

其實吧。我覺得這個功能應(yīng)該系統(tǒng)自動實現(xiàn)的捞稿。那既然現(xiàn)在沒有這個功能又谋,我們手動來實現(xiàn)吧。

我之前遇到這個問題的時候網(wǎng)上找過很多方案娱局,但皆不盡如人意彰亥。可能因為我有多個text field衰齐,按return會自動聚焦到下一個任斋。情況就復(fù)雜了。

后經(jīng)過我反復(fù)調(diào)試耻涛,找到了一個比較穩(wěn)定的方案废酷。

注:我調(diào)試的時候發(fā)現(xiàn)排版有問題,模擬器的話試下不同尺寸的iphone抹缕。為方便閱讀澈蟆,每一步的新加代碼都是紅色會用注釋標(biāo)明。其他黑色的代碼作為上下文位置的參考卓研。如果還是覺得?看起來很吃力的話趴俘,還請留言吧睹簇,我給優(yōu)化一下。

1.新建一個Single View Application寥闪,不用加其他的文件太惠。


22091753-b9d0e732f42548e392358c65e4b6fc3f.png

2.先給界面加上必要的控件,UITextField X 3 , UIButton X 1疲憋。并關(guān)聯(lián)到.h文件中凿渊。

22091821-a3253f0589434fe8ada1be5228ca0cdb.png

3.簡單實現(xiàn)一下click的動作,就顯示一個UIAlertView吧柜某。

//-----------新代碼-----------
- (IBAction)click:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Job Done!"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];    
    [alert show];
} 
//---------------------------

4.實現(xiàn)一下鍵盤的return事件嗽元。 首先加上必要的成員變量和聲明繼承的protocol,用一個NSArray來遍歷UITextField喂击。

//.h

//-----------新代碼-----------
@interface ViewController : UIViewController<UITextFieldDelegate> {
    NSArray *_inputFocuses;
    BOOL _pressedReturn;
}
//---------------------------
@property (weak, nonatomic) IBOutlet UITextField *textField1;
@property (weak, nonatomic) IBOutlet UITextField *textField2;
@property (weak, nonatomic) IBOutlet UITextField *textField3;
@property (weak, nonatomic) IBOutlet UIButton *button; 

- (IBAction)click:(id)sender; 

@end 

//.m

- (void)viewDidLoad {
    [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
    //-----------新代碼-----------
    _textField1.delegate = self;
    _textField2.delegate = self;
    _textField3.delegate = self; 
    _inputFocuses = [NSArray arrayWithObjects:_textField1, _textField2, _textField3, nil];
    //---------------------------
}   

//-----------新代碼-----------
#pragma mark - UITextFieldDelegate 

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    int index = [_inputFocuses indexOfObject:textField];
    if (index == [_inputFocuses count] - 1) {//如果是最后一個text field時按return 就點擊按鈕
        [self click:_button];
    }
    else {//如果沒有到最后一個text field就將焦點轉(zhuǎn)向下一個text field
        UITextField *nextTextField = [_inputFocuses objectAtIndex:(index + 1)];
        [nextTextField becomeFirstResponder];
    }  
    UITextField *currentTextField = [_inputFocuses objectAtIndex:index];                       
    [currentTextField resignFirstResponder]; 
    return NO;
} 
//---------------------------

Test Run:點擊任意text field剂癌,按下鍵盤的return,焦點會一個個下移翰绊,雖然我們現(xiàn)在還看不到佩谷,不過,相信我监嗜,是這樣的谐檀。。裁奇。最后按到了按鈕桐猬,彈出了alert,這個不用質(zhì)疑刽肠。

5.再添加一個點擊非鍵盤區(qū)域就讓鍵盤消失的功能吧溃肪。首先要補(bǔ)上一個回調(diào)方法的實現(xiàn)在此之前先聲明一些新的要用到的變量。

//.h

@interface ViewController : UIViewController {
    //-----------新代碼-----------
    BOOL _isKeyboardShowing;
    UITextField *_activeTextField;
    BOOL _addedObserver;
    //---------------------------
    NSArray *_inputFocuses;
    BOOL _pressedReturn;
}

//.m

#pragma mark - UITextFieldDelegate
//-----------新代碼-----------
// 點擊文本框會先觸發(fā)這個代理
-(void)textFieldDidBeginEditing:(UITextField *)textField {
    _pressedReturn = NO;//按下return和直接點擊text field都會觸發(fā)這個方法音五,所以用一個標(biāo)示的變量來區(qū)分惫撰,后面會發(fā)揮作用的。
    _activeTextField = textField;
}
//---------------------------

然后重寫這個方法

//-----------新代碼-----------
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];
    NSLog(@"location : (%.2f,%.2f)", location.x, location.y);
    if (_isKeyboardShowing && _activeTextField) {
        [_activeTextField resignFirstResponder];
    }
}
//---------------------------

這樣躺涝,編輯的時候就能記下當(dāng)前的text field到_activeTextField了厨钻。

然后標(biāo)記一下鍵盤正在顯示。

//.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //-----------新代碼-----------
    if (!_addedObserver) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
        _addedObserver = YES;
    }
    //---------------------------
    _textField1.delegate = self;
    _textField2.delegate = self;
    _textField3.delegate = self;
    _inputFocuses = [NSArray arrayWithObjects:_textField1, _textField2, _textField3, nil];
}

//-----------新代碼-----------
#pragma mark - KeyboardNotification

// 觸發(fā)文本框代理以后觸發(fā)這個消息
- (void)KeyboardWillShow:(NSNotification *)notification {
    _isKeyboardShowing = YES;
}

- (void)KeyboardWillHide:(NSNotification *)notification {
    //這個方法等后面再實現(xiàn)坚嗜,先占個坑夯膀。因為和現(xiàn)在要做的步驟無關(guān)。
}
//---------------------------

到這里為止苍蔬,我們把準(zhǔn)備工作做的很充分了棍郎,接下來就要玩一些更有趣的操作了。

我已經(jīng)把這篇的代碼新開一個工程測試過了银室,基本上復(fù)制黏貼就能一步步實現(xiàn)涂佃。如果發(fā)現(xiàn)有問題的話励翼,還請留個言。

那接下去的就放到下一篇吧辜荠,接下來就是獲取鍵盤高度汽抚,調(diào)整view的位置了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伯病,一起剝皮案震驚了整個濱河市造烁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌午笛,老刑警劉巖惭蟋,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異药磺,居然都是意外死亡告组,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門癌佩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來木缝,“玉大人,你說我怎么就攤上這事围辙∥业” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵姚建,是天一觀的道長矫俺。 經(jīng)常有香客問我,道長掸冤,這世上最難降的妖魔是什么厘托? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮贩虾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沥阱。我一直安慰自己缎罢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布考杉。 她就那樣靜靜地躺著策精,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崇棠。 梳的紋絲不亂的頭發(fā)上咽袜,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音枕稀,去河邊找鬼询刹。 笑死谜嫉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凹联。 我是一名探鬼主播沐兰,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔽挠!你這毒婦竟也來了住闯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤澳淑,失蹤者是張志新(化名)和其女友劉穎比原,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杠巡,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡量窘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忽孽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绑改。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兄一,靈堂內(nèi)的尸體忽然破棺而出厘线,到底是詐尸還是另有隱情,我是刑警寧澤出革,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布造壮,位于F島的核電站,受9級特大地震影響骂束,放射性物質(zhì)發(fā)生泄漏耳璧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一展箱、第九天 我趴在偏房一處隱蔽的房頂上張望旨枯。 院中可真熱鬧,春花似錦混驰、人聲如沸攀隔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆汹。三九已至,卻和暖如春婴栽,著一層夾襖步出監(jiān)牢的瞬間满粗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工愚争, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留映皆,地道東北人挤聘。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像劫扒,于是被迫代替她去往敵國和親檬洞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容