2012-05-17 1 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에서 그것을 보여줍니다 :

내 코드는 그냥 UITextField에 textFieldDidBeginEditing 및 textFieldDidEndEditing.Move의 대표에게까지 parentview의 프레임을 구현해야

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

질문 제목에 질문 태그를 반복하지 않아도됩니다. – yoozer8

답변

3

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]; 
    } 

를 구현해야합니다. 키보드로 숨기지 않고 표시하려는 다른보기가 있으면 이동해야합니다. 두 위치의 프레임을 재조정하는 두 가지 방법이 있습니다. 하나는 키보드를 표시 할 때, 다른 하나는 숨길 때 텍스트 필드 편집을 마치면 다음 텍스트 필드 대리 메서드에서 다른 메서드를 호출하는 것입니다.

당신은 숨기거나하지 될 프레임의 위치를 ​​변경하고보기를 변경하는 두 가지 도움말 방법에
- (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. 
} 

, 나는 개인적으로 매우 마이클 타이슨로 TPKeyboardAvoiding를 사용하는 것이 좋습니다 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'를 사용하여'autoresizeForKeyboard'를'YES'로 설정하고,'TTCatalog' 앱에서'TableControlsTestController'를 확인하십시오.'autoresizeForKeyboard'를'initWithNibName'에'TTTableViewController'를 서브 클래 싱하는 것만 큼 간단합니다 YES를 선택하고'dataSource'를 컨트롤로 채 웁니다. 'keyboardDidAppear'이 자동으로 호출되어 키보드가 나타날 때마다 테이블을 첫 번째 응답자로 스크롤합니다. 'TTCatalog'를 설치하여 다른 멋진 기능을 볼 수도 있습니다. –

-2

keyboardDidAppear 구현을 참조하십시오. (읽기 내에서 인용) 그것은 사용하기 매우 쉽게

... : 있는 UITableViewController 클래스와 함께 사용

는 TPKeyboardAvoidingTableView.m 및 TPKeyboardAvoidingTableView 놓습니다.h를 프로젝트에 추가하고 UITableView를 xKey에 TPKeyboardAvoidingTableView 으로 만듭니다. 컨트롤러와 함께 xib를 사용하지 않는다면, 나는 의 UITableView를 사용자 정의 클래스로 만들 수있는 쉬운 방법이 없다는 것을 알고 있습니다. 최소 의 경로는 xib를 생성하는 것입니다. 비 UITableViewControllers를 들어

, 프로젝트에 TPKeyboardAvoidingScrollView.m 및 TPKeyboardAvoidingScrollView.h 소스 파일을 드롭보기 컨트롤러의 XIB에있는 UIScrollView 팝, TPKeyboardAvoidingScrollView에 스크롤 뷰의 클래스를 설정하고 모든 넣어 해당 컨트롤 내에서 해당 컨트롤 . xib를 사용하지 않고 프로그래밍 방식으로 프로그램을 만들 수도 있습니다. 최상위 수준 인 보기로 TPKeyboardAvoidingScrollView를 사용하면됩니다.

관련 문제