2012-04-25 47 views
0

使用xcode 4.3.2。我希望這是我最後一次乞求幫助。滾動鍵盤隱藏的內容。 xcode 4.3.2

我有一個屏幕有4個文本字段。編輯時底部2被鍵盤隱藏。我希望能夠向下滾動,這樣可以編輯這兩個隱藏的字段。我粘貼了我的.m和.h文件。有些事情並不完全正確。

Viewcontroller.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController; 
@property (strong, nonatomic) IBOutlet UIScrollView *scrollview; 
@property (strong, nonatomic) IBOutlet UITextField *TextField1; 
@property (strong, nonatomic) IBOutlet UITextField *TextField2; 
@property (strong, nonatomic) IBOutlet UITextField *TextField3; 
@property (strong, nonatomic) IBOutlet UITextField *TextField4; 
@property (strong, nonatomic) IBOutlet UITextField *activefield; 

- (IBAction)HideKeyBoard:(id)sender; 

viewcontroler.m

@interface ViewController() 
@end 
@implementation ViewController 

@synthesize scrollview; 
@synthesize TextField1; 
@synthesize TextField2; 
@synthesize TextField3; 
@synthesize TextField4; 
@synthesize activefield; 


- (void)viewDidLoad 

{ 

[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
} 



- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
activefield = textField; 
} 
- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
activefield = nil; 
} 
- (void)registerForKeyboardNotifications 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWasShown:) 
               name:UIKeyboardDidShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillBeHidden:) 
               name:UIKeyboardWillHideNotification object:nil]; 
} 
// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] 
        CGRectValue].size; 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    scrollview.contentInset = contentInsets; 
    scrollview.scrollIndicatorInsets = contentInsets; 
    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activefield.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, 
              activefield.frame.origin.y-kbSize.height); 
     [scrollview setContentOffset:scrollPoint animated:YES]; 

    }  

} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
    { 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
scrollview.contentInset = contentInsets; 
scrollview.scrollIndicatorInsets = contentInsets; 
} 


- (void)viewDidUnload 
{ 

[self setScrollview:nil]; 
[self setActivefield:nil]; 
[self setTextField1:nil]; 
[self setTextField2:nil]; 
[self setTextField3:nil]; 
[self setTextField4:nil]; 
[super viewDidUnload]; 
// Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

- (IBAction)HideKeyBoard:(id)sender { 

} 


@end 

回答

0

Sliding UITextFields around to avoid the keyboard

我已經遇到過這個問題。上面的鏈接真的幫助我。我希望它會幫助你太

在.h文件中,你必須創建這樣

@property CGFloat animatedDistance; 

屬性,然後在.m文件,你必須補充一點:

@synthesize animatedDistance; 

static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; 
static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; 
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; 
static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216; 
static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162; 

那麼你必須添加此方法:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    CGRect textFieldRect = 
     [self.view.window convertRect:textField.bounds fromView:textField]; 
    CGRect viewRect = 
     [self.view.window convertRect:self.view.bounds fromView:self.view]; 

CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height; 
CGFloat numerator = 
    midline - viewRect.origin.y 
     - MINIMUM_SCROLL_FRACTION * viewRect.size.height; 
CGFloat denominator = 
    (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) 
     * viewRect.size.height; 
CGFloat heightFraction = numerator/denominator; 

if (heightFraction < 0.0) 
{ 
    heightFraction = 0.0; 
} 
else if (heightFraction > 1.0) 
{ 
    heightFraction = 1.0; 
} 

UIInterfaceOrientation orientation = 
    [[UIApplication sharedApplication] statusBarOrientation]; 
if (orientation == UIInterfaceOrientationPortrait || 
    orientation == UIInterfaceOrientationPortraitUpsideDown) 
{ 
    animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction); 
} 
else 
{ 
    animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction); 
} 

    CGRect viewFrame = self.view.frame; 
    viewFrame.origin.y -= animatedDistance; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; 

    [self.view setFrame:viewFrame]; 

    [UIView commitAnimations]; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    CGRect viewFrame = self.view.frame; 
    viewFrame.origin.y += animatedDistance; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; 

    [self.view setFrame:viewFrame]; 

    [UIView commitAnimations]; 
} 



- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

就是這樣。祝你好運:))