web-dev-qa-db-ja.com

編集後、UITextFieldのテキストが上に移動します(編集中に中央揃え)

奇妙な問題があります。ユーザーが何かの量を書き込む必要があるUITextFieldがあるので、フィールドは「amountField」と呼ばれます。ユーザーがテキストフィールドの編集を開始すると、テキストは垂直方向と水平方向の中央にあります-それは素晴らしいです。

ただし、ユーザーが編集を終了すると、テキストは少し上に移動します。私は多くのことを試しましたが、何の助けにもなりませんでした...

以下のスクリーンショットを追加していますので、何が問題なのかがわかります。

これは、フィールドを編集しているときの様子です-大丈夫です。

This is while editing the field - that's ok.

そして、これは編集が完了したときの外観です-それは 問題

This is the problem.

誰かがこれを引き起こす可能性があることを知っているなら、私はとても感謝しています! :)

これは、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:これらの白い角は、背景を0.2アルファの白に設定したのでそこにあります。

45
Dominik Hadl

そう...

多くのことを何時間も試した後、問題が見つかりました。私の場合、問題はフォントです。なぜかはわかりませんが、フォントの作者が奇妙なフォント(リーディングなど)を作成しました。下部に空白スペースがあります。理由はわかりませんが、テキストを編集しているときは、すべてのテキストプロパティが無視されますが、編集が完了すると適用されます。

したがって、同様の問題がある場合は、フォントをArialなどに変更してみてください。

詳細については、次のリンクを参照してください: リンク1 および リンク2 。これらのリンクで推奨されているソリューションは、多くの頭痛の種を回避でき、UITextField(システムフォントまたは他の特定のフォントを使用して)の編集を開始したときにテキストが上に移動するなどの問題の修正にも適用できます。

23
Dominik Hadl

iOS 9で同様の問題が発生し始めました。基本的に、コレクションビューのセルにUITextFieldがあります。ユーザーが入力と編集を終了すると、テキストが「バウンス」して正しい位置に戻る場合があります。非常に奇妙で迷惑なグリッチ。このTweakを作成するだけで、iOS 9の問題が修正され、iOS 7および8で安全であることが証明されました。

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

TextFieldのClipsToBoundsを無効にすることで解決しました。

8

このバグは、テキストを設定してviewDidLoadまたはviewWillAppearの最初のレスポンダーになったときに起こりました。 becomeFirstResponderコードをviewDidAppearに移動すると、バグはなくなりました。

4
skr1p7k1dd

アプリのデザインがカスタムフォントを使用している場合、私はこの問題にほぼ苦労しています。 1つのオプションは、フォントを修正することです(ただし、これは大変な作業です-少なくとも私にとっては:))。私が使用している2番目のオプションは、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でテストしていないため、これらを使用するときは注意してください。

注:このアプローチは「フォント依存」であり、オフセットに使用される値はフォントおよびサイズごとに異なる場合があります

2
JakubKnejzlik

IOS 8.1以下には不具合があり、後で修正するかどうかはわかりませんが、その時点ではすべてのケースを修正する独自の解決策はありません。バグと解決策はフォントのタイプとサイズに依存するためです。

この解決策の1つまたは以下の解決策の組み合わせにより、問題を解決できます。

  • フォントのサイズを変更します。

  • フォントの種類を変更します。

  • UITextFieldのサイズの変更

  • 問題のフォントを逆コンパイルし、フォントの特性を変更して再コンパイルします(詳細については、次のリンクを参照してください: link 1 および link 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に使用される値は、フォントおよびサイズごとに異なる場合があります。

1
King-Wizard

これを修正するには、UITextFieldsに高さの制約を追加します。

1

上記の解決策は私にとっては機能しません。私の解決策は、UITextFieldのサブクラスで、setTextをオーバーライドします。

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

UITextfieldに埋め込まれたUITableViewCellでも同様の問題がありました。このコードはプロジェクトのどこに正確にありますか?私が信じているのは、特定のテキストフィールドの編集が完了すると、それ自体に-setNeedsDisplayが送信され、そのdrawRect:がその後呼び出されるということです。これは、配置の変化を説明するかもしれません。私の特定のシナリオでは、テーブルビューのデリゲートメソッド-willDisplayCell...を使用してコンテンツの配置を設定する必要がありました。私はおそらく提案を提供するためにあなたのデザインについてもっと知る必要があります。

考えられる1つの解決策は、テキストフィールドデリゲートメソッドを使用してコンテンツの配置を設定することです。

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

コードの行がある場合は、キーボードを確認してポップアップの位置のビューを変更しますself.view.layoutIfNeeded()削除します。幸運を祈ります!

0
Gilbertat

これは、テキストフィールドのBaselineOffsetが変更されたためです。 UITextFieldDidEndEditingでNSBaselineOffset:0を使用して属性付きテキストを作成し、そのattributedTextを使用すると問題が解決します。

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

フォントファイルを変更できなかったため、これを解決したら、元のUITextFieldのフレームをプロパティに保存し、次のコードを適用しました。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.frame = self.usernameFrame;
}

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

少しハッキーですが、仕事は完了です。

0
Zak Arntson