web-dev-qa-db-ja.com

IOS 13:UITextField rightViewの間隔の問題

IOS 13、UITextFieldの右側のビューでスペーシングの問題に直面しています。次のコードとiOS 13およびiOS 12.4のスクリーンショットを参照してください。

IOS 12.4シミュレータでは、UITextFieldの右側のビュー(UIButton)に適切なスペースを表示します

IOS 13.0シミュレータでは、UITextFieldの右側のビュー(UIButton)にスペースの問題があります

let dropdownButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: txtField.frame.height))
dropdownButton.backgroundColor = UIColor.clear
dropdownButton.setImage(UIImage(named: "ic_DownArrow"), for: UIControl.State())            
txtField.rightView = dropdownButton           
txtField.rightViewMode = .always

enter image description hereenter image description here

19
AtulParmar

どうやらこれは、iOS 13 Beta 5でのrightViewRect(forBounds :)の動作の変更でした。

IOSおよびiPadOS 13 Developer Beta 5リリースノートより:

UIKit-解決された問題

IOS 13より前は、UITextFieldは、割り当てられたときにleftViewおよびrightViewのフレームが正しく設定され、決して変更されないと想定していました。 iOS 13以降、leftViewRect(forBounds :)およびrightViewRect(forBounds :)の実装は、ビューにsystemLayoutSizeFitting(:)を要求するようになりました。 iOS 13にリンクして実行するときに以前の動作を実現するには、明示的なサイズ制限をビューに追加するか、プレーンなUIViewでラップするか、ビューをサブクラス化してsystemLayoutSizeFitting(:)を実装します。 (51787798)

したがって、rightViewに追加したカスタムビューに自動レイアウト制約を追加します。

例:-

override func rightViewRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: bounds.width - 30, y: 0, width: 20 , height: bounds.height)
    }
23
Bruno Vaillant

追加するleftViewまたはrightViewの幅の制約を設定します。

leftImageView.widthAnchor.set(to: 30.0)
textField.leftView = leftImageView
textField.leftViewMode = .always

以下は、幅の制約を設定するために使用する拡張機能です。

extension NSLayoutDimension {

@discardableResult
func set(
        to constant: CGFloat,
        priority: UILayoutPriority = .required
        ) -> NSLayoutConstraint {

        let cons = constraint(equalToConstant: constant)
        cons.priority = priority
        cons.isActive = true
        return cons
    }
}
6
Abdurrahman

おそらくあなたの画像はwidth: 50, height: txtField.frame.height、ボタンが削減されます。

コンテナを追加してみてください:

let dropdownButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: txtField.frame.height))
dropdownButton.backgroundColor = .clear
dropdownButton.setImage(UIImage(named: "ic_DownArrow"), for: UIControl.State())
let container = UIView(frame: dropdownButton.frame)
container.backgroundColor = .clear
container.addSubview(dropdownButton)
txtField.rightView = container
txtField.rightViewMode = .always
3
Michcio

Brunoの方法を使用して動作させました。

1)コンテナービューを作成し、自動レイアウトを使用してその幅と高さを設定します。幅と高さには、サブビューのサイズ+必要な間隔を含める必要があります。

2)テキストフィールドに表示するサブビューを作成します。自動レイアウトを使用して、幅、高さ、およびレイアウトを設定します。コンテナビューに追加します。

3)コンテナビューをテキストフィールドに追加します

コンテナがテキストフィールドの高さに一致しているのがわかります。幅は、ボタンの幅(44)に必要な間隔(16)を加えたものです。サブビューを追加すると、コンテナーの左側に配置されます。これにより、ボタンの右側とテキストフィールドの端との間に16pxの間隔ができます。

let forgotButtonContainer = UIView()
forgotButtonContainer.translatesAutoresizingMaskIntoConstraints = false
forgotButtonContainer.widthAnchor.constraint(equalToConstant: 44.0 + 16.0).isActive = true
forgotButtonContainer.heightAnchor.constraint(equalToConstant: 48.0).isActive = true

forgotButton = PFSecondaryButton(link: "Forgot?")
forgotButton.translatesAutoresizingMaskIntoConstraints = false
forgotButtonContainer.addSubview(forgotButton)

forgotButton.topAnchor.constraint(equalTo: forgotButtonContainer.topAnchor).isActive = true
forgotButton.leftAnchor.constraint(equalTo: forgotButtonContainer.leftAnchor).isActive = true
forgotButton.bottomAnchor.constraint(equalTo: forgotButtonContainer.bottomAnchor).isActive = true

passwordField.rightView = forgotButtonContainer
2
Michael Rose

これは私にとってはうまくいき、rightViewがtextFieldの全幅を占めるときにiPhone X/11で発生する問題も解決します。

txtField.rightView = dropdownButton
txtField.translatesAutoresizingMaskIntoConstraints = false
txtField.rightView?.widthAnchor.constraint(equalToConstant: 50).isActive = true
1
Faisal Arefin

これを設定して同じ問題を取り除きます:

textField rightViewRectForBounds:メソッドをオーバーライドし、

- (CGRect)rightViewRectForBounds:(CGRect)bounds {
    if (self.rightView) {
        CGRect rightFrame = self.rightView.frame;
        return CGRectMake(bounds.size.width - rightFrame.size.width, 0, rightFrame.size.width, bounds.size.height);
    }
    return CGRectZero;
}
0
Yingbo Wang