24

UITextField にカスタム フォントがあり、それにアクセスすると (キーボードが表示されたとき)、テキストが非常にわずかにずれることに気付きました。(もちろん、私はそれを測定する方法はありませんが、私が気付くには十分です。) そして、キーボードを離すと、再び上に移動します。

編集時にフィールドをクリアしようとしましたが(これにより、最初のシフトダウンの問題が隠されます)、問題は解決しませんでした。IB のさまざまな属性も調べて、いくつか変更してみましたが、それでも問題は解決しません。シミュレーターと iPad2 で同じ結果が得られます。

(フィールドはキーボードから十分に離れているため、ビュー全体が邪魔にならないわけではありません。特定のテキスト フィールドの内容だけです。)

問題を引き起こしているのはカスタム フォントであると確信しています。カスタム フォントがなければ発生しません。

これに対処する方法はありますか?IBではなく、プログラムでテキストフィールドを作成する必要があるかもしれないと考えていました-そして、ここで質問する前におそらくそれを試す必要があることはわかっていますが、そうでない場合は、そのすべての問題に行くのは嫌です問題を解く。

アドバイスをいただければ幸いです。

4

10 に答える 10

16

私もこの問題を抱えていました。

修正するにUITextFieldは、次のメソッドをサブクラス化して実装し、非編集時および編集時にテキストの位置を調整します。

- (CGRect)textRectForBounds:(CGRect)bounds {

    return CGRectInset( bounds , 8 , 8 );
}

- (CGRect)editingRectForBounds:(CGRect)bounds {

    return CGRectInset( bounds , 8 , 5 );
}
于 2012-04-10T10:41:58.370 に答える
3

私の解決策は、McDJ のものと同じですが、少しひねりを加えたものです。UITextField をサブクラス化し、これらのみをオーバーライドします。

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
  return CGRectOffset( [self editingRectForBounds:bounds], 0, 2 );
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
  return CGRectOffset( [super editingRectForBounds:bounds], 0, -2 );
}

私が使用しているカスタム フォントでは、2 ポイントが正しい垂直調整であり、プレースホルダー、「静的」、および「編集」テキストがすべて同じ垂直線上に留まるのに役立ちます。

于 2012-09-09T21:50:09.557 に答える
2

残念ながら、答えはどれもうまくいきませんでした。

@blackjacxの回答は機能しましたが、たまにしかありません:(

私はデバッグを開始しましたが、ここに私が発見したものがあります:

1 -本当の問題は、タイプの UITextField のプライベート サブビューにあるようです UIFieldEditorContentView

UITextField ビューの階層

y以下では、サブビューの がUITextFieldそれ自体と同じではないことがわかります。

Y が 0 に設定されていません

それに気づいた後、次の回避策を思いつきました。

override func layoutSubviews() {
    super.layoutSubviews()
    fixMisplacedEditorContentView()
}

func fixMisplacedEditorContentView() {
    if #available(iOS 10, *) {
        for view in subviews {
            if view.bounds.origin.y < 0 {
                view.bounds.origin = CGPoint(x: view.bounds.origin.x, y: 0)
            }
        }
    }
}

負の値に設定されたサブビューのに手動で設定する機能を追加するには、サブクラス化UITextFieldしてオーバーライドする必要があります。この問題は iOS 9 では発生しないため、以下に iOS 10 の場合にのみ回避策を実行するようにチェックを追加しました。layoutSubviews0y

以下に結果を示します。

正常に動作

2 - ユーザーがテキストの部分範囲を選択することを選択した場合、この回避策は機能しません (selectAll は正常に機能します)。

テキストの選択は私のアプリにとって必須ではないので、むしろ無効にします。これを行うには、次のコードを使用できます (Swift 3):

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if #available(iOS 10, *) {
        if action == #selector(UIResponderStandardEditActions.select(_:)) {
            return false
        }
    }

    return super.canPerformAction(action, withSender: sender)
}
于 2017-04-13T19:29:52.183 に答える
1

すべてのフォント サイズで機能し、 とのずれを引き起こしませんclearButton

これらをサブクラスUITextField化し、次のようにオーバーライドします。

- (CGRect)placeholderRectForBounds:(CGRect)bounds
{
    return CGRectOffset( bounds, 0, 4 );
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return CGRectOffset( bounds, 0, 2);
}

- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectOffset( bounds , 0 , 4 );
}
于 2012-11-13T15:24:21.533 に答える
0

これは、標準の UITextField で予期される動作です。ただし、UITextField をサブクラス化し、テキスト自体の境界を調整することで、これを解決できます。

スイフト3

override func textRect(forBounds bounds: CGRect) -> CGRect {
    return(bounds.insetBy(dx: 0, dy: 0))
}

override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return(bounds.insetBy(dx: 0, dy: -0.5))
}

override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return(bounds.insetBy(dx: 0, dy: 0))
}

これでうまくいくはずです!

于 2016-10-27T11:18:15.910 に答える
0

カスタムフォントでこの問題が発生し、キーボードイベントが発生したときにラベルを他の方向にシフトすることで解決しました. drawRect:メソッドをオーバーライドして、ボタンのラベルの中心を移動しました

- (void)drawRect:(CGRect)rect
{
    self.titleLabel.center = CGPointMake(self.titleLabel.center.x, self.titleLabel.center.y+3);
}
于 2012-02-03T03:27:23.127 に答える