2012-05-17 104 views
1

當我想將文本放入我的UITextField時,鍵盤顯示在其頂部,並覆蓋該字段。如何防止這一點?我剛剛閱讀:this solution但我不知道在哪裏調整大小?這是一個好方法?鍵盤掩蓋了輸入字段

我的代碼是:

UITextField * passwordTextField = [[[UITextField alloc] init] autorelease]; 
passwordTextField.keyboardType = UIKeyboardTypeDefault; 
passwordTextField.delegate = self; 
passwordTextField.placeholder = NSLocalizedString(@"somestr", @""); 
passwordTextField.secureTextEntry = YES; 
[_controls setObject:passwordTextField forKey:keyPassword]; 

然後我展示它在Three20是:

[email protected]"", 
[NSArray arrayWithObjects: 
    [TTTableControlItem itemWithCaption:nil control:passwordTextField],   
    nil],... 
+0

沒有必要重複問題標題中的問題標籤。 – yoozer8

回答

3

你一定要實現的UITextField textFieldDidBeginEditing和textFieldDidEndEditing.Move的代表parentview起來的框架通過調用textFieldDidBeginEditing時的某個值,並在調用委託方法textFieldDidEndEditing時通過相同的值恢復它。

另一種方法是爲UIKeyboardDidShowNotification添加觀察器,並在UIKeyboardDidHideNotification觸發時向上移動框架並向下移動框架。

樣品: -

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:)name:UIKeyboardDidShowNotification object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil]; 

,並更改選擇的框架: -

- (void)keyboardDidShow:(NSNotification *)aNotification 
{  
if (keyBDidShow)   
return;  
NSTimeInterval animationDuration = 0.300000011920929;   
CGRect frame = self.view.frame;   
frame.origin.y -= 60;     
[UIView beginAnimations:@"Rollback" context:nil];   
[UIView setAnimationDuration:animationDuration];   
self.view.frame = frame;   
[UIView commitAnimations]; 
viewUp= YES;    
}  
keyBDidShow= YES; 
} 
- (void)keyboardWasHidden:(NSNotification *)aNotification 
{  
if (viewUp) 
{     
NSTimeInterval animationDuration = 0.300000011920929;   
CGRect frame = self.view.frame;   
frame.origin.y += 60;     
[UIView beginAnimations:@"Rollback" context:nil];   
[UIView setAnimationDuration:animationDuration];   
self.view.frame = frame;   
[UIView commitAnimations];   
viewUp = NO;  
}  
keyBDidShow= NO; 
} 

同樣能BR做了文本框代表。

-1

你應該實現你應該重新調整文本框框架的實現下面的方法

- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField{ 
     [self adjustFramesWhenKeyoradIsShown]; 
    } 

。如果您還有其他視圖需要顯示,而且沒有被鍵盤隱藏,則應該移動它們。它是有幫助的有兩個方法調整幀2個職位(1個時,會顯示鍵盤和一個當它是隱藏的,所以一旦文本字段完成編輯您撥打以下文本字段的委託方法的另一種方法:

在這兩種救助方式更改幀位置並更改視圖被隱藏或不
- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
     [self adjustFramesWhenKeyoradIsHidden]; 
    } 

,它會看起來更好,如果你它們的動畫,這樣的事情:

- (void) adjustFramesWhenKeyoradIsShown{ 
      [UIView animateWithDuration:0.3 
         delay:0.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        logoArea.hidden = YES; 
        loginFieldsArea.frame = CGRectMake(0, 0, 320, 250); 
       } 
       completion:^(BOOL finished){ 
       }]; 
    } 
+0

這只是讓我的視野更小,不會向上移動我的屏幕,而且還覆蓋了 – Kuba

+0

視角越來越小?不要改變任何框架的大小,但原點..把正確的值,沒有什麼會變小。 –

+0

@SimpleMan我相信這個解決方案'loginFieldsArea'是一個帶有可能調用鍵盤的控件的子視圖,在這種情況下,代碼將控件框架移動到根視圖的頂部邊緣。最簡單,沒有花哨,難以重用和重構,但它的工作原理,實現起來很快並且很容易理解(通過代碼中的適當註釋)。 –

0

調整大小應該被應用到根視圖:想法是將視圖框設置爲與第一響應者仍然可見時的鍵盤縮小的可見區域相匹配。 TTBaseViewController財產autoresizesForKeyboard和相應的方法

/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardWillAppear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardWillDisappear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardDidDisappear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 

對於你不需要改變大小的表視圖,看到keyboardDidAppear實施TTTableViewController

/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds { 
    [super keyboardDidAppear:animated withBounds:bounds]; 
    self.tableView.frame = TTRectContract(self.tableView.frame, 0, bounds.size.height); 
    [self.tableView scrollFirstResponderIntoView]; 
    [self layoutOverlayView]; 
    [self layoutBannerView]; 
} 
+0

當我粘貼這個和實現layoutOverlayView和layoutBannerView方法時,鍵盤顯示一切消失 – Kuba

+0

@SimpleMan這是內部'TTTableViewController'方法,我不認爲你需要重寫它。使用'TTTableViewController'你需要將'autoresizesForKeyboard'設置爲'YES',從'TTCatalog'應用程序中檢查'TableControlsTestController',就像在'initWithNibName'中設置'autoresizesForKeyboard'的子類'TTTableViewController'一樣簡單。 'YES'並用控件填充'dataSource'。 'keyboardDidAppear'將自動調用,並在出現鍵盤時將表格滾動到第一個響應者。您也可以安裝'TTCatalog'來查看其他很酷的功能。 –

-2

我個人強烈建議由邁克爾·泰森使用TPKeyboardAvoiding

它非常容易使用...(從自述引用):

對於的UITableViewController類使用降 TPKeyboardAvoidingTableView.m和TPKeyboardAvoidingTableView。h寫入 您的項目,並在xib中將您的UITableView設置爲TPKeyboardAvoidingTableView 。如果你沒有使用你的控制器的xib,我知道 沒有簡單的方法來使它的UITableView成爲一個自定義的類:阻力最小的路徑是爲它創建一個xib。

對於非UITableViewControllers,刪除 TPKeyboardAvoidingScrollView.m和TPKeyboardAvoidingScrollView.h 源文件到您的項目,彈出一個UIScrollView到您的視圖 控制器的廈門國際銀行,滾動視圖的類設置爲 TPKeyboardAvoidingScrollView,並把所有您在該滾動視圖中的控件。您也可以使用編程方式創建它,而不使用 xib - 只需使用TPKeyboardAvoidingScrollView作爲頂級 視圖。