奇妙な問題があります。ユーザーが何かの量を書き込む必要がある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:これらの白い角は、背景を0.2アルファの白に設定したのでそこにあります。
そう...
多くのことを何時間も試した後、問題が見つかりました。私の場合、問題はフォントです。なぜかはわかりませんが、フォントの作者が奇妙なフォント(リーディングなど)を作成しました。下部に空白スペースがあります。理由はわかりませんが、テキストを編集しているときは、すべてのテキストプロパティが無視されますが、編集が完了すると適用されます。
したがって、同様の問題がある場合は、フォントをArialなどに変更してみてください。
詳細については、次のリンクを参照してください: リンク1 および リンク2 。これらのリンクで推奨されているソリューションは、多くの頭痛の種を回避でき、UITextField(システムフォントまたは他の特定のフォントを使用して)の編集を開始したときにテキストが上に移動するなどの問題の修正にも適用できます。
iOS 9で同様の問題が発生し始めました。基本的に、コレクションビューのセルにUITextFieldがあります。ユーザーが入力と編集を終了すると、テキストが「バウンス」して正しい位置に戻る場合があります。非常に奇妙で迷惑なグリッチ。このTweakを作成するだけで、iOS 9の問題が修正され、iOS 7および8で安全であることが証明されました。
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
//...other stuff
}
TextFieldのClipsToBoundsを無効にすることで解決しました。
このバグは、テキストを設定してviewDidLoad
またはviewWillAppear
の最初のレスポンダーになったときに起こりました。 becomeFirstResponder
コードをviewDidAppear
に移動すると、バグはなくなりました。
アプリのデザインがカスタムフォントを使用している場合、私はこの問題にほぼ苦労しています。 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でテストしていないため、これらを使用するときは注意してください。
注:このアプローチは「フォント依存」であり、オフセットに使用される値はフォントおよびサイズごとに異なる場合があります
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に使用される値は、フォントおよびサイズごとに異なる場合があります。
これを修正するには、UITextFieldsに高さの制約を追加します。
上記の解決策は私にとっては機能しません。私の解決策は、UITextFieldのサブクラスで、setTextをオーバーライドします。
- (void) setText:(NSString *)text {
[super setText:text];
[self layoutIfNeeded];
}
UITextfield
に埋め込まれたUITableViewCell
でも同様の問題がありました。このコードはプロジェクトのどこに正確にありますか?私が信じているのは、特定のテキストフィールドの編集が完了すると、それ自体に-setNeedsDisplay
が送信され、そのdrawRect:
がその後呼び出されるということです。これは、配置の変化を説明するかもしれません。私の特定のシナリオでは、テーブルビューのデリゲートメソッド-willDisplayCell
...を使用してコンテンツの配置を設定する必要がありました。私はおそらく提案を提供するためにあなたのデザインについてもっと知る必要があります。
考えられる1つの解決策は、テキストフィールドデリゲートメソッドを使用してコンテンツの配置を設定することです。
-(void)textFieldDidEndEditing:(UITextField *)textField{
if (amountField == textField){
amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
}
}
コードの行がある場合は、キーボードを確認してポップアップの位置のビューを変更しますself.view.layoutIfNeeded()
削除します。幸運を祈ります!
これは、テキストフィールドのBaselineOffsetが変更されたためです。 UITextFieldDidEndEditing
でNSBaselineOffset:0を使用して属性付きテキストを作成し、そのattributedText
を使用すると問題が解決します。
-(IBAction)txtFieldDidEndEditing:(UITextField *)sender {
NSDictionary *style = @{
NSBaselineOffsetAttributeName: @(0)
};
self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style];
}
フォントファイルを変更できなかったため、これを解決したら、元のUITextFieldのフレームをプロパティに保存し、次のコードを適用しました。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
textField.frame = self.usernameFrame;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
textField.frame = CGRectOffset(self.usernameFrame, 0, 1);
}
少しハッキーですが、仕事は完了です。