iOS 13:UITextField rightView的间距问题

Atu*_*mar 11 uitextfield ios swift ios13 xcode11

我在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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 在此处输入图片说明

小智 14

显然,这是对rightViewRect(forBounds :)在iOS 13 Beta 5中的行为方式的更改。

从iOS&iPadOS 13 Developer Beta 5发行说明:

UIKit-已解决的问题

在iOS 13之前,UITextField假定在分配时正确设置了其leftView和rightView的帧,并且不会更改。从iOS 13开始,leftViewRect(forBounds :)和rightViewRect(forBounds :)的实现现在向视图询问其systemLayoutSizeFitting(:)。要实现与iOS 13链接并在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)
    }
Run Code Online (Sandbox Code Playgroud)

  • @GautamShrivastav 在 Objective-C 上你只需要这样设置:`[txtField.rightView.widthAnchorconstrainEqualToConstant:50.0].active = YES;` (2认同)

Abd*_*man 11

为您添加的 leftView 或 rightView 设置宽度约束。

leftImageView.widthAnchor.set(to: 30.0)
textField.leftView = leftImageView
textField.leftViewMode = .always
Run Code Online (Sandbox Code Playgroud)

这是我用来设置宽度约束的扩展:

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
    }
}
Run Code Online (Sandbox Code Playgroud)