2014-10-17 50 views
0

我想显示一个包含UITextField的视图,并且我会自动显示带有消息becomeFirstResponder的键盘。 使用iOS 7时,没有任何问题。 但自iOS8以来,它不起作用。 我这样的配置的观点:UITextField becomeFirstResponder块动画

- (void)showViewAddScore{ 
if(!self.viewPopOver){ 
    //a l'initialisation de la vue, on design le contour 
    self.viewPopOver = [self.view viewWithTag:100]; 
    self.viewPopOver.layer.cornerRadius = 8; 
    self.viewPopOver.layer.masksToBounds = YES; 
    self.viewPopOver.layer.borderWidth = 1; 
    self.viewPopOver.layer.borderColor = [[UIColor colorWithRed:8.0/255 green:65.0/255 blue:32.0/255 alpha:1] CGColor]; 
} 
//deplacement de la vue 
CGPoint point; 
point.x = self.viewPopOver.frame.origin.x; 
point.y = 300; 
[self manageViewPopOver:self.viewPopOver withCGPoint:point]; 
[self.textfieldAddScore becomeFirstResponder]; 

}

和方法,以显示与动画的观点:

- (void)manageViewPopOver:(UIView *)view withCGPoint:(CGPoint)point { 
[UIView animateWithDuration:0.3 
         delay:0.1 
        options:UIViewAnimationOptionCurveLinear 
       animations:^{ 
        CGRect frame = view.frame; 
        frame.origin.y = point.y; 
        frame.origin.x = point.x; 
        view.frame = frame; 
       } 
       completion:nil]; 

}

的问题是:当 我第一次拨打方法showViewAddScore,键盘显示,但不是视图。当我再次调用该方法时,视图正在显示。 当我删除线[self.textfieldAddScore becomeFirstResponder];时,视图显示当我第一次调用该方法。所以,[self.textfieldAddScore becomeFirstResponder];和动画有问题。 我试过在动画后移动这一行,但问题依然存在。

谢谢您的帮助。

+0

您是以编程方式还是通过故事板添加viewPopOver? – Yan 2014-10-17 17:38:58

+0

我试过你的代码,它在iOS 8中没有问题。你可以调试它,在point.y = 300上设置断点,看看self.viewPopOver是否第一次不是零,点的设置是否正确 – Yan 2014-10-17 18:09:10

+0

嗨,是的,我在故事板中创建了viewPopOver,并显示它与动画。在调试模式下,视图不是零,即使是第一次。但它只出现在第二次点击。如果我删除行self.textfieldAddScore becomeFirstResponder],它会出现在第一次敲击。因此,从iOS8开始,呈现键盘和动画就存在一个真正的问题:-(我不知道如何解决这个问题。 – 2014-10-18 15:47:04

回答

0

enter image description here

使用仪器可以看到becomeFirstResponder劫持是相当长的一段〜我6S +设备150ms的主线程。你可以做的是初步负载一个“假”的TextView在你的应用程序代理这样:

 // Preloads keyboard so there's no lag on initial keyboard appearance. 
     let lagFreeField: UITextField = UITextField() 
     self.window?.addSubview(lagFreeField) 
     lagFreeField.becomeFirstResponder() 
     lagFreeField.resignFirstResponder() 
     lagFreeField.removeFromSuperview() 

,或等到UI工作完成调用becomeFirstResponder,最好在完成块。我选择以后不要弄乱AppDelegate,而之前是一个“哈克”解决方案。

相关问题