IOS 13: spacing Issue with UITextField rightView
Apparently this was a change in the way rightViewRect(forBounds:) behaves in iOS 13 Beta 5.
From the iOS & iPadOS 13 Developer Beta 5 Release Notes:
UIKit - Resolved Issues
Prior to iOS 13, UITextField assumed that the frames of its leftView and rightView were correctly set when assigned and would never change. Starting in iOS 13, the implementation of leftViewRect(forBounds:) and rightViewRect(forBounds:) now ask the view for its systemLayoutSizeFitting(:). To achieve the previous behavior when linking against and running on iOS 13, add explicit sizing constraints on the view, wrap it in a plain UIView, or subclass the view and implement systemLayoutSizeFitting(:). (51787798)
So Add Auto-Layout constraints to your custom view that you added to the rightView
Example:-
override func rightViewRect(forBounds bounds: CGRect) -> CGRect { return CGRect(x: bounds.width - 30, y: 0, width: 20 , height: bounds.height) }
Set the width constraint for the leftView or rightView you're adding.
leftImageView.widthAnchor.set(to: 30.0)textField.leftView = leftImageViewtextField.leftViewMode = .always
Here's the extension I use to set the width constraint:
extension NSLayoutDimension {@discardableResultfunc set( to constant: CGFloat, priority: UILayoutPriority = .required ) -> NSLayoutConstraint { let cons = constraint(equalToConstant: constant) cons.priority = priority cons.isActive = true return cons }}
Probably your image is smaller than width: 50, height: txtField.frame.height
, so your button is reduced.
You can try add some container:
let dropdownButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: txtField.frame.height))dropdownButton.backgroundColor = .cleardropdownButton.setImage(UIImage(named: "ic_DownArrow"), for: UIControl.State())let container = UIView(frame: dropdownButton.frame)container.backgroundColor = .clearcontainer.addSubview(dropdownButton)txtField.rightView = containertxtField.rightViewMode = .always