我想显示一个包含UITextField的视图,我会自动显示带有消息becomeFirstResponder的键盘。 使用iOS 7,没有任何问题。 但是从iOS8开始,它不起作用。 我正在配置这样的视图:
- (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 :(得分:0)
使用乐器你可以看到,在我的6s +设备上,相当于一段时间~150ms,变成第一响应者劫持是主线程。您可以做的是在您的应用代表中初步加载“假”文本视图:
// 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而且之前是一个“hacky”解决方案。
答案 1 :(得分:0)
我有一个只有一个textField
的简单视图控制器。我想在viewController加载时显示键盘。
问题,在第一个viewController中,我有没有尽头的动画,当我使textField(在另一个viewController中)成为第一响应者,并返回到第一个viewController时,我的动画被阻止了。 (我不知道为什么吗?)
我成为负责这个不需要的动画块的FirstResponder。要解决它:
becomeFirstResponder
。
然后,我在becomeFirstResponder
时调用textField的viewDidAppear
。 override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if myTextField.canBecomeFirstResponder {
myTextField.becomeFirstResponder()
}
}
UITextFieldDelegate
override func viewDidLoad() {
super.viewDidLoad()
// set delegate to self, to textFieldDidEndEditing(:) will call by textField
myTextFiled.delegate = self
}
// UITextFieldDelegate method
func textFieldDidEndEditing(_ textField: UITextField) {
textField.resignFirstResponder()
}