【问题标题】:Text in UITextField moves up after editing (center while editing)UITextField 中的文本在编辑后向上移动(编辑时居中)
【发布时间】:2012-03-29 07:04:54
【问题描述】:

我有一个奇怪的问题。我有一个 UITextField,用户应该在其中写一些东西的数量,所以这个字段被称为“amountField”。一切看起来都很好,当用户开始编辑文本字段时,文本位于垂直和水平中心 - 这很棒。

但是,当用户结束编辑时,文本会向上移动一点。我尝试了很多东西,没有任何帮助......

我在下面添加屏幕截图,以便您查看问题所在。

这是编辑字段时的样子 - 没关系。

这就是编辑完成后的样子——这就是问题

请,如果有人知道可能导致此问题的原因,我将不胜感激! :)

这是我的一些与 amountField 相关的代码。

amountField.keyboardType = UIKeyboardTypeNumberPad;
amountField.returnKeyType = UIReturnKeyDone;
amountField.delegate = self;

[amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]];   
amountField.borderStyle = UITextBorderStyleNone;
UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"];
[amountField setBackground:amountBg];

amountField.rightView = nil;
//amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2];

amountField.textAlignment = UITextAlignmentCenter;
amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
amountField.adjustsFontSizeToFitWidth = YES;
amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro

amountField.frame = CGRectMake(300, 480, 136, 32);
amountField.center = CGPointMake(605, 439);

PS:那些白色的角落在那里,因为我将背景设置为白色,alpha 为 0.2,没关系。

【问题讨论】:

  • 这方面有什么进展吗?在我的文本字段中看到同样的问题
  • 我很高兴我不是唯一一个,我尝试了我能想到的一切......我会立即报告任何进展,所以请继续检查这个问题:)
  • @erkanyildiz 是的,你是对的,我是第二个面临同样问题的人.....!!!谢谢你让我走上正轨..!!!!

标签: iphone objective-c ios xcode uitextfield


【解决方案1】:

我在 iOS 9 上遇到了类似的问题。基本上我在集合视图单元格中有一个 UITextField 。有时,当用户完成键入和编辑结束时,文本会向上“反弹”然后再次向下回到正确的位置。非常奇怪和恼人的故障。只需进行此调整即可解决 iOS 9 上的问题,并在 iOS 7 和 8 上证明是安全的:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
}

【讨论】:

  • 我也遇到过这个,公司名、用户名、密码连续3个UITextField。但是我的症状不仅在iOS 9上,而且在iOS 8上。我怀疑它与Xcode 7.0有关?也发生在 iOS 8.3、8.4 模拟器上。还没有要测试的 8.x 设备。但是您的解决方案适用于两个版本。这就是为什么我认为它与 Xcode 7 或 iOS 9 SDK 有关。
  • 我在使用 Xcode 6 为 iOS 8 构建时遇到了这个问题。在我开始修复它之前,我升级到 Xcode 7 并开始为 iOS 9 构建。然后我不再看到这个错误。
  • 我在 iOS 9.0.2 上遇到了同样的事情
  • iOS 9.0.2 上的相同错误
  • 10.1.1 上的相同错误,来苹果吧。顺便说一句,这个修复似乎仍然很好用
【解决方案2】:

所以...

经过数小时的尝试,我发现了问题所在。 在我的情况下,问题是字体。我真的不知道为什么,但是字体的作者把字体弄得很奇怪(领先等),它的底部有一个空格。我不知道为什么,但是当您编辑文本时,所有文本属性都会被忽略,但在您完成编辑后,它们就会被应用。

所以,如果您有类似的问题,请尝试将字体更改为 Arial 或类似的字体。

如需完整说明,请参阅以下链接:link 1link 2。这些链接中推荐的解决方案可以避免很多麻烦,甚至可以用于解决当您开始编辑 UITextField(使用系统字体或其他特定字体)时文本移动到顶部的问题。

【讨论】:

  • 我也在使用自定义字体。奇怪的。我的解决方案是在用户停止更新时更新字体框架,以确保它看起来垂直居中。
  • 很高兴听到它对您有所帮助 :) (如果您愿意,可以投票支持我的回答)您是如何更新字体框架的?你能发布一些代码吗? :) 谢谢,多米尼克
  • 不要改变字体,试试这个。 stackoverflow.com/a/10087220/244183
  • @McDJ 您的答案只是一种潜在的解决方案,它只修复了一种特定情况(字体类型、字体大小和 UITextField 高度的组合以及一些覆盖方法)。请参阅下面的详尽答案,您将看到并学习解决此 iOS 故障的其他方法。
  • @Dominik Hadl 您给我们的解决方案只是一个 hack,它只适用于一种字体和大小,只要您更改字体大小和/或字体类型,就会出现错误背部。因此,它不是修复所有情况(字体类型、字体大小和 UITextField 高度的组合)的解决方案,它只是一种在特定情况下临时修复错误的 hack。这个问题的其他解决方案是我在下面提到的(见我的回答)或者反编译和修改字体和/或更改字体的类型和/或字体大小和/或界面构建器中的 UITextField 的高度。
【解决方案3】:

为 TextField 禁用 ClipsToBounds 为我解决了这个问题。

【讨论】:

  • 您的解决方案帮助了我。你能解释一下它为什么有效吗?
  • 我的猜测是,由于光标比文本高,并且当您使文本字段第一响应者和剪辑到边界启用时,必须重新绘制文本以正确适应文本和光标。我们看到的是重绘。当您禁用剪辑到边界时,您不再限制文本字段的垂直位置,因此不会发生重绘或更新。 @hoseokchoi
【解决方案4】:

当我在viewDidLoadviewWillAppear 中设置文本并成为第一响应者时,这个错误发生在我身上。当我将 becomeFirstResponder 代码移动到 viewDidAppear 时,错误消失了。

【讨论】:

  • 这加上@n8tr 的回答也为我解决了一些其他奇怪的问题。推荐。
【解决方案5】:

当应用程序的设计使用自定义字体时,我几乎每次都在努力解决这个问题。一种选择是修复字体(但这工作量太大——至少对我来说:))。我使用的第二个选项是子类化 UITextField 并覆盖 editingRectForBounds: 和 placeholderRectForBounds: 方法并更正偏移量。它也应该适用于您的情况。

@implementation MyTextFieldWithFixedFontPosition

-(CGRect)editingRectForBounds:(CGRect)bounds{
    return CGRectOffset([self textRectForBounds:bounds], 0, 0.5); //0.5 is just example, you can adjust to any offset you like
}
-(CGRect)placeholderRectForBounds:(CGRect)bounds{
    return [self editingRectForBounds:bounds];
}

@end

我还没有用 leftView 或 rightView 测试过,所以在使用时要小心:)

注意:这种方法是“依赖于字体”的,用于偏移的值可能因每种字体和大小而异

【讨论】:

  • 是的,没错。也应该使用字体大小的计算,但不同的字体可能有不同的偏移量
【解决方案6】:

iOS 8.1 及以下版本有一个小故障,我不知道他们是否会在以后修复它,但当时没有一个独特的解决方案可以修复所有情况,因为错误和解决方案取决于字体的类型、大小.

以下一种解决方案或这些解决方案的组合可以解决您的问题:

  • 更改字体大小。

  • 更改字体类型。

  • 更改 UITextField 的大小。

  • 反编译有问题的字体,修改字体特性并重新编译(更多解释请参考以下链接:link 1link 2)。

否则下面这个其他自给自足的解决方案可以解决您的问题:

Swift 版本

import UIKit

class CustomTextField: UITextField {

    ...

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

}

这个解决方案已经过 leftView 测试,效果很好。

注意:这种方法是“依赖于字体”的,用于 CGRectInset 的值可能因每种字体和大小而异。

【讨论】:

  • 您能解释一下为什么使用插入和为文本/editingText/占位符返回相同的框架应该可以解决问题吗?在我的大多数情况下,问题是在返回相同的矩形时字体呈现不正确(移动)。
  • @GrizzlyNetch 设置插图是一个花哨的句子,意思是设置 UITextField 内文本周围的填充。在这里您可以找到单词 inset 的定义:thefreedictionary.com/inset
  • @GrizzlyNetch 之后,如果它在第一次拍摄时对您不起作用,这是正常的,因为正如我在回答中所说:这种方法是“字体依赖”,用于 CGRectInset 的值可能因每个镜头而异字体和大小。
  • @GrizzlyNetch 也为您的信息偏移量表示保证金。
  • 我知道它取决于字体。但对我来说,我总是需要将editingRect移动一定的偏移量(通过CGRectOffset函数)......并且对于插图,它不会移动“文本”本身的中心,它只是添加水平填充(因此我的困惑 -但我想这只是一个例子)。
【解决方案7】:

我通过向 UITextFields 添加高度限制来解决此问题。

【讨论】:

    【解决方案8】:

    我无法更改字体文件,所以当我解决这个问题时,我将原始 UITextField 的框架保存在一个属性中并应用了以下代码:

    - (void)textFieldDidBeginEditing:(UITextField *)textField
    {
        textField.frame = self.usernameFrame;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField
    {
        textField.frame = CGRectOffset(self.usernameFrame, 0, 1);
    }
    

    这有点老套,但它可以完成工作。

    【讨论】:

    • 你给我们的解决方案只是一个 hack,它只适用于一种字体和大小,一旦你改变了字体的大小和/或字体的类型,错误就会回来。因此,它不是修复所有情况(字体类型、字体大小和 UITextField 高度的组合)的解决方案,它只是一种在特定情况下临时修复错误的 hack。这个问题的其他解决方案就像我上面提到的(见我的回答)或者反编译和修改字体和/或更改字体的类型和/或字体大小和/或界面生成器中的 UITextField 的高度。
    【解决方案9】:

    我在 UITextfield 嵌入 UITableViewCell 时遇到了类似的问题。这段代码到底在你的项目中的什么位置?我相信正在发生的事情是,在您完成编辑特定文本字段后,它会向自身发送-setNeedsDisplay,随后会调用其drawRect:。这或许可以解释对齐方式的转变。在我的特定场景中,我不得不使用表格视图委托方法-willDisplayCell... 来设置内容对齐方式。我必须更多地了解您的设计才能提供建议。

    一种可能的解决方案是使用文本字段委托方法来设置内容对齐方式。

    -(void)textFieldDidEndEditing:(UITextField *)textField{
         if (amountField == textField){
              amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
            }
    }
    

    【讨论】:

    • 谢谢你的回答:)我在上班,回家试试看。
    【解决方案10】:

    如果有代码行self.view.layoutIfNeeded()删除它,请检查键盘以更改弹出窗口位置的视图。祝你好运!

    【讨论】:

      【解决方案11】:

      这是因为文本字段的 BaselineOffset 已更改。 在UITextFieldDidEndEditing 中使用 NSBaselineOffset: 0 创建属性文本并使用 attributedText 可以解决问题。

      -(IBAction)txtFieldDidEndEditing:(UITextField *)sender {
           NSDictionary *style = @{
                                  NSBaselineOffsetAttributeName: @(0)
                                  };
          self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style];
      }
      

      【讨论】:

        【解决方案12】:

        上面的这些解决方案对我不起作用。我的解决方案是 UITextField 的子类并覆盖 setText:

        - (void) setText:(NSString *)text {
            [super setText:text];
            [self layoutIfNeeded];
        }
        

        【讨论】:

          【解决方案13】:

          我使用了这个扩展。唯一的问题是我在调用它之前没有添加 translatesAutoresizingMaskIntoConstraints = true 。啊傻鹅

          func centerVertically() {
              textContainerInset = UIEdgeInsets.zero
              textContainer.lineFragmentPadding = 5
              let fittingSize = CGSize(width: bounds.width, height: 
               CGFloat.greatestFiniteMagnitude)
              let size = sizeThatFits(fittingSize)
              let topOffset = (bounds.size.height - size.height * zoomScale) / 2
              let positiveTopOffset = max(1, topOffset)
              contentOffset.y = -positiveTopOffset
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-03
            • 2010-11-10
            • 2015-12-28
            • 1970-01-01
            • 2015-11-13
            相关资源
            最近更新 更多