2012-04-25 20 views
0

xcodeの使用4.3.2。私はこれが私が助けを求めなければならない最後の時であることを願っています。キーボードで隠されたコンテンツをスクロールします。 xcode 4.3.2

4つのテキストフィールドを持つ画面があります。下の2は編集時にキーボードによって隠されています。これらの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

私もこの問題に直面しています。上記のリンクが本当に私を助けました。

@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; 
:私はあなたがこれを追加する必要がありますが、.mファイルで、この

@property CGFloat animatedDistance; 

のようなプロパティを作成する必要があり、それは.hファイルであなたにすぎ

を助けることを願っています

この方法を追加する必要があります。

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

これはそれです。幸運:)

関連する問題