webentwicklung-frage-antwort-db.com.de

Xcode / iOS5: Bewegen Sie UIView nach oben, wenn die Tastatur angezeigt wird

Ich möchte meine Ansicht nach oben verschieben, wenn die Tastatur angezeigt wird. Die Tastatur (Höhe: 216) sollte meine Ansicht mit ihrer Höhe nach oben drücken. Ist das mit einem einfachen Code möglich?

49
filou

Um die Ansicht up zu verschieben, ändern Sie einfach ihre center. Behalten Sie zunächst das Original in einer CGPoint -Eigenschaft bei.

- (void)viewDidLoad 
{
    ...
    self.originalCenter = self.view.center;
    ...
}

Ändern Sie dann nach Bedarf, wenn die Tastatur angezeigt wird:

self.view.center = CGPointMake(self.originalCenter.x, /* new calculated y */);

Stellen Sie es schließlich wieder her, wenn die Tastatur ausgeblendet ist:

self.view.center = self.originalCenter;

Fügen Sie Animationszucker hinzu, wie Sie wünschen

Sie können auf mehrere Arten feststellen, wann die Tastatur angezeigt wird.

Beobachten IKeyboardDidShowNotification Benachrichtigung.

/* register notification in any of your initWithNibName:bundle:, viewDidLoad, awakeFromNib, etc. */
{
    ...
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];     
    ...
}

- (void)keyboardDidShow:(NSNotification *)note 
{
    /* move your views here */
}

Mach das Gegenteil mit UIKeyboardDidHideNotification.

-ODER-

Implementieren Sie ITextFieldDelegate

Erkennen Sie, wann die Bearbeitung beginnt/endet, um Ansichten zu verschieben.

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{
    /* keyboard is visible, move views */
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    /* resign first responder, hide keyboard, move views */
}

Fügen Sie abhängig von den tatsächlichen Textfeldern, in denen Sie möglicherweise verfolgen müssen, in welchem ​​Feld der Benutzer sie bearbeitet, einen Timer hinzu, um zu vermeiden, dass Ansichten zu stark verschoben werden.

97
djromero

mag das. Verwenden Sie diesen Code, wenn die Tastatur sichtbar ist

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    self.view.frame = CGRectMake(0,-10,320,480);
    [UIView commitAnimations];

}
31
Tendulkar

Dies ist der einfachste und effizienteste Weg, um dies zu erreichen:

Fügen Sie die folgenden Konstanten hinzu:

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;    

Fügen Sie dies zu Ihrem View Controller hinzu:

CGFloat animatedDistance;

Fügen Sie Ihrem Code die folgenden Methoden hinzu:

- (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];
}
13
Kishore Suthar

Ich habe das ähnlich wie bei Djromero gemacht, nur dass ich den Ursprung der Ansicht und nicht den Mittelpunkt des Rahmens angepasst habe.

Die Ansicht, die ich bewege, ist eine UIScrollView, und ich möchte, dass sie relativ zu einem UITextField-Element verschoben wird, sodass das Textfeld immer angezeigt wird. Die Position dieses Textfelds kann je nach Versatz der Bildlaufansicht variieren.

Mein Code sieht also so aus:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    dispatch_async(dispatch_get_main_queue(), ^{
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.2];
        [UIView setAnimationCurve:UIViewAnimationCurveLinear];
        self.scrollView.frame = CGRectMake(0,0,self.scrollView.frame.size.width,self.scrollView.frame.size.height);
        [UIView commitAnimations];
    });
    return YES;
}

- (NSInteger)getKeyBoardHeight:(NSNotification *)notification
{
    NSDictionary* keyboardInfo = [notification userInfo];
    NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
    NSInteger keyboardHeight = keyboardFrameBeginRect.size.height;
    return keyboardHeight;
}

-(void) keyboardDidShow:(NSNotification*) notification
{
    NSInteger keyboardHeight;
    keyboardHeight = [self getKeyBoardHeight:notification];
    NSInteger scrollViewFrameHeight = self.scrollView.frame.size.height;
    NSInteger textFieldRelativePosition = self.tableView.frame.Origin.y - self.scrollView.contentOffset.y;
    NSInteger textFieldFrameOffset = scrollViewFrameHeight - textFieldRelativePosition;
    NSInteger movement = MAX(0,keyboardHeight-textFieldFrameOffset); // Offset from where the keyboard will appear.
    dispatch_async(dispatch_get_main_queue(), ^{
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.2];
        [UIView setAnimationCurve:UIViewAnimationCurveLinear];
        self.scrollView.frame = CGRectMake(0,-movement,
                                           self.scrollView.frame.size.width,
                                           self.scrollView.frame.size.height);
        [UIView commitAnimations];
    });
}

Der Ansichtscontroller ist ein UITextFieldDelegate und abonniert auch UIKeyboardDidShowNotification, damit wir auf die Größe der Tastatur zugreifen können.

Wenn die Tastatur angezeigt wird, berechnen wir den relativen Versatz von UITextField (angepasst für den Bildlaufversatz) und der Tastatur und ändern den Ursprung von UIScrollView so, dass er sich gerade so weit bewegt, dass UITextField noch angezeigt wird.

Wenn das UITextField auch dann angezeigt wird, wenn die Tastatur angezeigt wird, ändert sich Origin nicht.

13
Michael
5
len
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGFloat y = textField.frame.Origin.y;
    if (y >= 350) //not 380
   {
        CGRect frame = self.view.frame;
        frame.Origin.y = 320 - textField.frame.Origin.y;
        [UIView animateWithDuration:0.3 animations:^{self.view.frame = frame;}];
    }
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect returnframe =self.view.frame;
returnframe.Origin.y = 0;
[UIView animateWithDuration:0.3 animations:^{self.view.frame = frame;}];
}

bearbeiten Sie einfach diese beiden Methoden.
einfache antwort auf alle d codes. In der if-Anweisung ändern Sie den Wert entsprechend dem iphone, dh wenn iphone 4S ihn auf 265 ändert und in didbeginediting den Wert 320 auf 240 ändert und wenn iphone 5 ihn auf 350 ändert und in didbeginediting den Wert 320 beibehält, da dies die Logik ist wenn du verstehst

2
sreekanthk

Vermutlich haben Sie einen Code, der [myTextField becomeFirstResponder]; Aufruft. Sie sollten Ihre Ansicht direkt nach diesem Aufruf verschieben.

1
James Webster

Dies ist eine Tendulkar-Lösung, die jedoch die ursprüngliche Rahmengröße berücksichtigt und die Tastatur entfernt. Diese Lösung funktioniert für alle Geräte.

-(BOOL) textFieldShouldReturn:(UITextField *)textField{

[textField resignFirstResponder];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
self.view.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
[UIView commitAnimations];
return YES;
 }


- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    self.view.frame = CGRectMake(0,-50,self.view.frame.size.width,self.view.frame.size.height);
    [UIView commitAnimations];

}

UITextField-Delegierten nicht vergessen!

Beispielprojekt basierend auf Apple Referenz Tastaturdokumentation

H-Datei: (Vergessen Sie nicht das UITextFieldDelegate)

@property (weak, nonatomic) IBOutlet UIScrollView *scrollview;

@property (weak, nonatomic) IBOutlet UIView *myView;


    //items on view
@property (weak, nonatomic) IBOutlet UISwitch *partySwitch;
@property (weak, nonatomic) IBOutlet UILabel *partyLabel;
@property (weak, nonatomic) IBOutlet UITextField *partyNameTextfield;

M-Datei:

    //MARK: View Loading
- (void)viewDidLoad
{
    [super viewDidLoad];
        // Do any additional setup after loading the view.
}//eom

-(void)viewDidAppear:(BOOL)animated
{
    [self registerForKeyboardNotifications];
}//eom

    //MARK: textfield delegates
-(bool)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return true;
}//eom

    //MARK: - Keyboard Observers
    // Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];

}


- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info      = [aNotification userInfo];
    CGSize kbSize           = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect        = myView.superview.frame;
    bkgndRect.size.height += kbSize.height;

    [myView.superview setFrame:bkgndRect];
    [scrollview setContentOffset:CGPointMake(0.0, myView.frame.Origin.y-kbSize.height) animated:YES];
}//eom

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