我在iOS 9,XCode 7 GM上运行。我有一个扩展UITextField(CustomOffsetTextField)的类,并提供对自定义文本定位的支持,如下所示:
override func textRectForBounds(bounds: CGRect) -> CGRect {
return CGRectOffset(bounds, textOffset.x + leftViewOffset, textOffset.y)
}
override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
return CGRectOffset(bounds, textOffset.x + leftViewOffset, textOffset.y)
}
override func editingRectForBounds(bounds: CGRect) -> CGRect {
return CGRectOffset(bounds, textOffset.x + leftViewOffset, textOffset.y)
}
leftViewOffset是文本字段leftView的宽度(如果存在)。 textOffset是一个CGPoint,它定义了应用于文本rects的自定义x和y偏移量。
我的问题出现在我的签到视图中。我有2个CustomOffsetTextField实例 - 一个用于用户的电子邮件,另一个用于他们的密码。
在第一次加载视图控制器时,如果我在一个字段中输入文本然后点击另一个字段,该文本将在跳回到定义的位置之前短暂地跳回到文本字段中的位置0,0通过textRectForBounds。一些基本的打印调试验证这些函数总是返回我期望它们的值。
在此初始打嗝之后,文本字段的行为与我期望的一样。此问题仅在视图控制器加载后在每个文本字段中出现一次。在那之后,我可以在我想要的地方之间来回切换,而不会再次发生。
有没有人在iOS 9中看到与UITextField类似的问题?如果是这样,你能找到修复方法吗?
答案 0 :(得分:6)
在iOS 9中,只要您点击文本字段,就会发送额外的UIKeyboardWillShowNotification
通知。如果您在通知回调中呼叫[self.view layoutIfNeeded]
,则会导致跳转。
// Animate
[UIView beginAnimations:@"keyboardDidShowAnimations" context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve:curve];
[self.view layoutIfNeeded];
[UIView commitAnimations];
与此相关: https://forums.developer.apple.com/message/53905#53905
如果您在没有软件键盘的情况下在模拟器中进行测试,那么您将获得额外的UIKeyboardWillHideNotification
,如果您在该通知回调中有一个layoutIfNeeded调用,则可能会导致同样的问题好。
我通过在回调顶部放置检查来解决这个问题,以确保我真的需要动画/更新约束。
- (void)keyboardWillShow:(NSNotification *)note {
BOOL shouldAnimate = self.someConstraint.constant != kMinimumSize;
if (shouldAnimate) {
...
- (void)keyboardWillHide:(NSNotification *)note {
BOOL shouldAnimate = self.someConstraint.constant == kMinimumSize;
if (shouldAnimate) {
...
<强>更新强> 对于多次调用通知方法的第三方键盘,这不一定能够正常工作。请参阅https://stackoverflow.com/a/26004605。