2011-05-20 39 views
0

當我們點擊文本字段時,我已經使用以下代碼向上移動屏幕,此代碼與xcode 3一起工作正常,但它不能與xcode 4一起使用, ,它不給任何錯誤,但是當我們觸摸文本字段屏幕上生病上行至更高的高度,,有時不會使用下面的代碼我打電話上述方法回來TI原來的位置當我們點擊文本字段時向上移動屏幕時出現問題

- (void)keyboardWasShown:(NSNotification *)aNotification { 
    if (keyboardShown) 
     return; 

    if ((activeField==tfText[4])||(activeField==tfText[5])) 
    { 


#if __IPHONE_OS_VERSION_MIN_REQUIRED <= __IPHONE_3_2 
     CGRect _keyboardEndFrame; 

     [[aNotification.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue:&_keyboardEndFrame]; 
     CGFloat keyboardSize; 
     if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) 
     { 
      keyboardSize = _keyboardEndFrame.size.height; 
     } 
     else { 
      keyboardSize = _keyboardEndFrame.size.width; 
     } 

     NSTimeInterval animationDuration = 0.300000011920929; 
     CGRect frame = self.view.frame; 
     frame.origin.y -= keyboardSize-70; 
     frame.size.height += keyboardSize-70; 
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
     [UIView setAnimationDuration:animationDuration]; 
     self.view.frame = frame; 
     [UIView commitAnimations]; 
#else 
     NSDictionary *info = [aNotification userInfo]; 
     NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey]; 
     CGSize keyboardSize = [aValue CGRectValue].size; 

     NSTimeInterval animationDuration = 0.300000011920929; 
     CGRect frame = self.view.frame; 
     frame.origin.y -= keyboardSize.height-70; 
     frame.size.height += keyboardSize.height-70; 
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
     [UIView setAnimationDuration:animationDuration]; 
     self.view.frame = frame; 
     [UIView commitAnimations]; 





#endif 

     viewMoved = YES; 
    } 

    keyboardShown = YES; 
} 


- (void)keyboardWasHidden:(NSNotification *)aNotification { 
    if (viewMoved) { 

#if __IPHONE_OS_VERSION_MIN_REQUIRED <= __IPHONE_3_2 
     CGRect _keyboardEndFrame; 
     [[aNotification.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue:&_keyboardEndFrame]; 
     CGFloat keyboardSize; 
     if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) { 
      keyboardSize = _keyboardEndFrame.size.height; 
     } 
     else { 
      keyboardSize = _keyboardEndFrame.size.width; 
     } 

     NSTimeInterval animationDuration = 0.300000011920929; 
     CGRect frame = self.view.frame; 
     frame.origin.y += keyboardSize-70; 
     frame.size.height -= keyboardSize-70; 
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
     [UIView setAnimationDuration:animationDuration]; 
     self.view.frame = frame; 
     [UIView commitAnimations]; 
#else 
     NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey]; 
     CGSize keyboardSize = [aValue CGRectValue].size; 

     NSTimeInterval animationDuration = 0.300000011920929; 
     CGRect frame = self.view.frame; 
     frame.origin.y += keyboardSize.height-70; 
     frame.size.height -= keyboardSize.height-70; 
     [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
     [UIView setAnimationDuration:animationDuration]; 
     self.view.frame = frame; 
     [UIView commitAnimations]; 



#endif 

     viewMoved = NO; 
    } 

    keyboardShown = NO; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
} 


- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    activeField = nil; 
    // Additional Code 
} 

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWasShown:) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWasHidden:) 
               name:UIKeyboardDidHideNotification 
               object:nil]; 
} 
+0

檢查此鏈接 http://stackoverflow.com/questions/1126726/how-to-make-a-uitextfield-move-up-when-keyboard-is-present – sujay 2011-09-12 07:17:40

回答

1
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

// register for keyboard notifications 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
              name:UIKeyboardWillShowNotification 
              object:self.view.window]; 
// register for keyboard notifications 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillHide:) 
              name:UIKeyboardWillHideNotification 
              object:self.view.window]; 
    keyboardIsShown = NO; 
     //make contentSize bigger than your scrollSize (you will need to figure out for your own use case) 
    CGSize scrollContentSize = CGSizeMake(320, 345); 
    self.scrollView.contentSize = scrollContentSize; 
    } 


- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 

    // unregister for keyboard notifications while not visible. 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillShowNotification 
                object:nil]; 
    // unregister for keyboard notifications while not visible. 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillHideNotification 
                object:nil]; 

} 

- (void)keyboardWillHide:(NSNotification *)n 
{ 
    NSDictionary* userInfo = [n userInfo]; 

    // get the size of the keyboard 
    NSValue* boundsValue = [userInfo objectForKey:UIKeyboardBoundsUserInfoKey]; 
    CGSize keyboardSize = [boundsValue CGRectValue].size; 


    // resize the scrollview 
    CGRect viewFrame = self.scrollView.frame; 
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView. 
    viewFrame.size.height += (keyboardSize.height - kTabBarHeight); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    // The kKeyboardAnimationDuration I am using is 0.3 
    [UIView setAnimationDuration:kKeyboardAnimationDuration]; 
    [self.scrollView setFrame:viewFrame]; 
    [UIView commitAnimations]; 

    keyboardIsShown = NO; 
} 

- (void)keyboardWillShow:(NSNotification *)n 
{ 
    // This is an ivar I'm using to ensure that we do not do the frame size adjustment on the UIScrollView if the keyboard is already shown. This can happen if the user, after fixing editing a UITextField, scrolls the resized UIScrollView to another UITextField and attempts to edit the next UITextField. If we were to resize the UIScrollView again, it would be disastrous. NOTE: The keyboard notification will fire even when the keyboard is already shown. 
    if (keyboardIsShown) { 
     return; 
    } 

    NSDictionary* userInfo = [n userInfo]; 

    // get the size of the keyboard 
    NSValue* boundsValue = [userInfo objectForKey:UIKeyboardBoundsUserInfoKey]; 
    CGSize keyboardSize = [boundsValue CGRectValue].size; 

    // resize the noteView 
    CGRect viewFrame = self.scrollView.frame; 
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView. 
    viewFrame.size.height -= (keyboardSize.height - kTabBarHeight); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    // The kKeyboardAnimationDuration I am using is 0.3 
    [UIView setAnimationDuration:kKeyboardAnimationDuration]; 
    [self.scrollView setFrame:viewFrame]; 
    [UIView commitAnimations]; 

    keyboardIsShown = YES; 
} 
相關問題