vendredi 30 janvier 2015

iOS 7 iPad Orientation issue, when view moves upside after keyboard appears on UITextField

In my application i wan't to move/animate my ViewController's view to upward direction after appearance of keyboard over UITextField.


and this must support for all orientation.i.e:

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight.


For UIInterfaceOrientationPortrait my code is working fine as shown below: enter image description here


But for UIInterfaceOrientationPortraitUpsideDown and UIInterfaceOrientationLandscapeLeft it is not working. please see below screenshots:


For UIInterfaceOrientationLandscapeLeft view moves towards right side instead of upward side.


enter image description here


For UIInterfaceOrientationPortraitUpsideDown view moves towards down side instead of upward side.


enter image description here


This is only issue in iOS 7. I have checked this in iOS 8, it is working fine.


I have used below code for animating UIView on keyboard appearance:



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 = 264;
static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 352;

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

if(self.view.frame.origin.y != 0.000000)
{
self.view.frame = CGRectMake(self.view.frame.origin.x,0.0,self.view.frame.size.width,self.view.frame.size.height);
}

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

NSLog(@"View frame y pos did start: %f ",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;

NSLog(@"View frame y pos did end: %f ",animatedDistance);

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

[self.view setFrame:viewFrame];

[UIView commitAnimations];
}


Thanks




Aucun commentaire:

Enregistrer un commentaire