iOS 10中,在编辑UITextField时,中文字符会向下移动。

4
我正在使用的环境是Xcode8和iOS10。
我在IB中将一个UITextField拖到我的主视图中,添加一些约束以将文本字段放置在正确的位置,将文本字段的边框样式选择为无,最后,在storyboard中键入一些文本以使UITextField调整大小,如下所示: TextField in storyboard 为了看清发生了什么,我还让textfield通过在viewDidLoad中添加以下内容绘制其边界: self.textField.layer.borderWidth = 1;
构建并运行,在设备上看起来很好: enter image description here 问题是:当我尝试编辑文本字段(当文本字段变成第一个响应者时),文本会向下移动: enter image description here 只有在将Textfield的边框样式设置为none且文本包含中文字符时才会出现此问题,请问有人知道这里发生了什么吗?

很可能文本框的高度不足以容纳文本。 - gnasher729
@gnasher729,这不应该是问题,因为我在storyboard中调整了字体大小,并让文本框自动调整大小,当它不进行编辑或边框样式不为none时,一切都运作良好。 - Gocy015
这里也有同样的问题。现在我们只是使用.Line边框样式,并将边框颜色设置为与背景颜色相同以进行解决。但它并不完美,因为如果文本内容超过文本字段的宽度,相同的事情也会发生。 :( - onevcat
@onevcat,这可能只是Storyboard的另一个bug,请尝试在代码中设置borderStyle。我通过在IB中将borderStyle设置为UITextBorderStyleLine并在viewDidLoad中将其更改为UITextBorderStyleNone来修复此问题。 - Gocy015
5个回答

5

我通过在界面构建器中将borderStyle设置为除UITextBorderStyleNone之外的任何值来解决此问题,然后在我的vc的viewDidLoad中将其更改为UITextBorderStyleNone,我想这只是界面构建器中许多错误之一? :)


2
谢谢!这太棒了。我试过了,可以在代码中直接这样做(无需在Interface Builder中更改任何内容):self.textField.borderStyle = UITextBorderStyleLine; self.textField.borderStyle = UITextBorderStyleNone;此外,如果您正在使用自定义的UIView子类(如UITableViewCell等),请将代码放置在-awakeFromNib中。 - Lukas Petr

3

我遇到了同样的问题。我使用UIAlertView包含一个UITextField,我通过设置以下内容来修复它:

 textField.clearButtonMode = UITextFieldViewModeWhileEditing;

没问题。另一种方法是:子类化UITextField,重写它的:
- (CGRect)textRectForBounds:(CGRect)bounds {

    return CGRectInset(bounds, 2, 1);

}


- (CGRect)editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 2, 1);

}

1
使用UITextField时,中文字符也会出现问题。如果文本很短且UITextField不可滚动,则文本显示在右侧矩形中。当UITextField无法在可见矩形中显示文本并变为可滚动时,如果点击键盘上的删除按钮,则文本将绘制在中心线下方。
layoutSubviews函数中使用NSLOG子视图UITextField后,它显示名为UITextEditor的子视图具有错误的contentOffset
因此,我重写了layoutSubviews函数,在调用[super layoutSubview]之后重置了UITextEditorcontentOffset.y
- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIScrollView *view in self.subviews) {
        if ([view isKindOfClass:[UIScrollView class]]) {
            CGPoint offset = view.contentOffset;
            if (offset.y != 0) {
                offset.y = 0;
                view.contentOffset = offset;
            }
            break;
        }
    }
}

0

将UITextField的高度更改为正确的高度

1、获取字体大小

  CGSize size = [@"你好" sizeWithFont:[UIFont systemFontOfSize:14]];

2、设置文本框高度和字体大小

 CGRect frame = CGRectMake(100, 200, 150, size.height);

 UITextField  textFiled = [[UITextField alloc] initWithFrame:frame];

 [textFiled setFont:[UIFont systemFontOfSize:14]];

希望能够帮到你!


0

我们使用Storyboard,但是我们遇到了同样的问题。 经过一些调查,我们决定使用IBInspectable来解决这个问题。 在Storyboard中的每个UITextField都会引发IBInspectable标志,问题就会得到解决。 这是Swift版本:

extension UITextField {

  @IBInspectable var hideBorder: Bool {
    get {
      return borderStyle == UITextBorderStyle.none
    }
    set {
      if newValue {
        borderStyle = UITextBorderStyle.line
        borderStyle = UITextBorderStyle.none
      }
    }
  }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接