cocos2d-x 2.x 中KeyboardMove在iOS8下异常 编辑框移动异常


在向上推送过程方向不对。

#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 已经修改过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值