在向上推送过程方向不对。
#pragma mark UIKeyboard notification
- (void)onUIKeyboardNotification:(NSNotification *)notif;
{
NSString * type = notif.name;
NSDictionary* info = [notif userInfo];
CGRect begin = [self convertRect:
[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]
fromView:self];
CGRect end = [self convertRect:
[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]
fromView:self];
CGSize viewSize = self.frame.size;
CGFloat tmp;
float vision = [[[UIDevice currentDevice] systemVersion] floatValue];
// CCLOG("系统版本 = %f", vision);
//
if ( vision >= 8.0)
{
if([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft
||[[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
{
tmp = begin.size.width;
begin.size.width = begin.size.height;
begin.size.height = tmp;
tmp = end.size.width;
end.size.width = end.size.height;
end.size.height = tmp;
tmp = viewSize.width;
viewSize.width = viewSize.height;
viewSize.height = tmp;
tmp = begin.origin.x;
begin.origin.x = begin.origin.y;
begin.origin.y = viewSize.height - tmp - begin.size.height;
tmp = end.origin.x;
end.origin.x = end.origin.y;
end.origin.y = viewSize.height - tmp - end.size.height;
}
}
double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
switch ([[UIApplication sharedApplication] statusBarOrientation])
{
case UIInterfaceOrientationPortrait:
begin.origin.y = viewSize.height - begin.origin.y - begin.size.height;
end.origin.y = viewSize.height - end.origin.y - end.size.height;
break;
case UIInterfaceOrientationPortraitUpsideDown:
begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width);
end.origin.x = viewSize.width - (end.origin.x + end.size.width);
break;
case UIInterfaceOrientationLandscapeLeft:
tmp = begin.size.width;
begin.size.width = begin.size.height;
begin.size.height = tmp;
tmp = end.size.width;
end.size.width = end.size.height;
end.size.height = tmp;
tmp = viewSize.width;
viewSize.width = viewSize.height;
viewSize.height = tmp;
tmp = begin.origin.x;
begin.origin.x = begin.origin.y;
begin.origin.y = viewSize.height - tmp - begin.size.height;
tmp = end.origin.x;
end.origin.x = end.origin.y;
end.origin.y = viewSize.height - tmp - end.size.height;
break;
case UIInterfaceOrientationLandscapeRight:
if ( vision < 8.0)
{
tmp = begin.size.width;
begin.size.width = begin.size.height;
begin.size.height = tmp;
tmp = end.size.width;
end.size.width = end.size.height;
end.size.height = tmp;
tmp = viewSize.width;
viewSize.width = viewSize.height;
viewSize.height = tmp;
tmp = begin.origin.x;
begin.origin.x = begin.origin.y;
begin.origin.y = tmp;
tmp = end.origin.x;
end.origin.x = end.origin.y;
end.origin.y = tmp;
}
else
{
tmp = begin.size.width;
begin.size.width = begin.size.height;
begin.size.height = tmp;
tmp = end.size.width;
end.size.width = end.size.height;
end.size.height = tmp;
tmp = viewSize.width;
viewSize.width = viewSize.height;
viewSize.height = tmp;
tmp = begin.origin.x;
begin.origin.x = begin.origin.y;
begin.origin.y = viewSize.height - tmp - begin.size.height;
tmp = end.origin.x;
end.origin.x = end.origin.y;
end.origin.y = viewSize.height - tmp - end.size.height;
}
break;
default:
break;
}
float scaleX = cocos2d::CCEGLView::sharedOpenGLView()->getScaleX();
float scaleY = cocos2d::CCEGLView::sharedOpenGLView()->getScaleY();
if (self.contentScaleFactor == 2.0f)
{
// Convert to pixel coordinate
begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 2.0f, 2.0f));
end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 2.0f, 2.0f));
}
float offestY = cocos2d::CCEGLView::sharedOpenGLView()->getViewPortRect().origin.y;
CCLOG("offestY = %f", offestY);
if (offestY < 0.0f)
{
begin.origin.y += offestY;
begin.size.height -= offestY;
end.size.height -= offestY;
}
// Convert to desigin coordinate
begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY));
end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY));
cocos2d::CCIMEKeyboardNotificationInfo notiInfo;
notiInfo.begin = cocos2d::CCRect(begin.origin.x,
begin.origin.y,
begin.size.width,
begin.size.height);
notiInfo.end = cocos2d::CCRect(end.origin.x,
end.origin.y,
end.size.width,
end.size.height);
notiInfo.duration = (float)aniDuration;
cocos2d::CCIMEDispatcher* dispatcher = cocos2d::CCIMEDispatcher::sharedDispatcher();
if (UIKeyboardWillShowNotification == type)
{
self.keyboardShowNotification = notif; // implicit copy
dispatcher->dispatchKeyboardWillShow(notiInfo);
}
else if (UIKeyboardDidShowNotification == type)
{
//CGSize screenSize = self.window.screen.bounds.size;
dispatcher->dispatchKeyboardDidShow(notiInfo);
caretRect_ = end;
caretRect_.origin.y = viewSize.height - (caretRect_.origin.y + caretRect_.size.height + [UIFont smallSystemFontSize]);
caretRect_.size.height = 0;
isKeyboardShown_ = YES;
}
else if (UIKeyboardWillHideNotification == type)
{
dispatcher->dispatchKeyboardWillHide(notiInfo);
}
else if (UIKeyboardDidHideNotification == type)
{
caretRect_ = CGRectZero;
dispatcher->dispatchKeyboardDidHide(notiInfo);
isKeyboardShown_ = NO;
}
}
-(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)dis
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:duration];
[UIView setAnimationBeginsFromCurrentState:YES];
//NSLog(@"[animation] dis = %f, scale = %f \n", dis, cocos2d::CCEGLView::sharedOpenGLView()->getScaleY());
if (dis < 0.0f) dis = 0.0f;
dis *= cocos2d::CCEGLView::sharedOpenGLView()->getScaleY();
if (self.contentScaleFactor == 2.0f)
{
dis /= 2.0f;
}
self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
switch ([[UIApplication sharedApplication] statusBarOrientation])
{
case UIInterfaceOrientationPortrait:
self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
break;
case UIInterfaceOrientationPortraitUpsideDown:
self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y + dis, originalRect_.size.width, originalRect_.size.height);
break;
case UIInterfaceOrientationLandscapeLeft:
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
{
self.frame = CGRectMake(originalRect_.origin.x - dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
}
else{
self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
}
break;
case UIInterfaceOrientationLandscapeRight:
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
{
self.frame = CGRectMake(originalRect_.origin.x + dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height);
}
else{
self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height);
}
break;
default:
break;
}
[UIView commitAnimations];
}
修改更换这两个函数 在IOS EAGLView.mm中
实现原理就是验证版本号。当然通过验证版本号这种方式不是很好。
3.3 已经修改过了。