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
どうやらこれは、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)
}
追加する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
}
}
おそらくあなたの画像は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
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
これは私にとってはうまくいき、rightViewがtextFieldの全幅を占めるときにiPhone X/11で発生する問題も解決します。
txtField.rightView = dropdownButton
txtField.translatesAutoresizingMaskIntoConstraints = false
txtField.rightView?.widthAnchor.constraint(equalToConstant: 50).isActive = true
これを設定して同じ問題を取り除きます:
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;
}