Make UITextField easy again
UITextField
is one of the most popular controls and appears in any apps. I am sure you use UITextField
hundreds times in your life.
And I am sure, no designer allows you to use default UITextField
. They will design something different like below:
You usually have to customize the UITextField
with
- Corner radius
- Border
- Icon on the left
- Button on the right (reveal password, very popular)
- Underline
I will tell you how to do it very quick and you can reuse it anywhere in your projects.
Let's start with first thing, Corner radius
.
1. Corner radius
extension UIView {
func setCorner(radius: CGFloat) {
layer.cornerRadius = radius
clipsToBounds = true
}
}
textField.setCorner(radius: 5)
Easy, right? Sometimes you need to make circle corner, not only round corner. You can write like this.
extension UIView {
func circleCorner() {
superview?.layoutIfNeeded()
setCorner(radius: frame.height / 2)
}
}
But I don't use this way, I usually calculate the corner radius equal to half of the textfield height.
2. Border
extension UIView {
func setBorder(width: CGFloat, color: UIColor) {
layer.borderColor = color.cgColor
layer.borderWidth = width
}
}
textField.setBorder(width: 1, color: UIColor.green)
Similar to corner radius, this is very popular and use many many times.
I usually suggest border width should be 0.5px - 1px. That looks very nice in any iPhone screens.
3. Icon on the left and button on the right
We use leftView
and rightView
properties of UITextField to add icon or button.
3.1. General function
extension UITextField {
enum ViewType {
case left, right
}
// (1)
func setView(_ type: ViewType, with view: UIView) {
if type == ViewType.left {
leftView = view
leftViewMode = .always
} else if type == .right {
rightView = view
rightViewMode = .always
}
}
}
(1) is the general function to set a view to be leftView
or rightView
. It's good but not convenience enough to use.
3.2. Add text as view
Add this function into UITextField
extension
// (2)
@discardableResult
func setView(_ view: ViewType, title: String, space: CGFloat = 0) -> UIButton {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: frame.height))
button.setTitle(title, for: UIControl.State())
button.contentEdgeInsets = UIEdgeInsets(top: 4, left: space, bottom: 4, right: space)
button.sizeToFit()
setView(view, with: button)
return button
}
(2) creates a button and set to leftView/rightView
, and return it to you. Then you can format the button as you want, change color, font, set corner or any.
Parameter space
is optional. See example below.
let blueButton = topTextField.setView(.right, title: "Show", space: 8)
blueButton.backgroundColor = .blue
let redButton = bottomTextField.setView(.right, title: "Show")
redButton.backgroundColor = .red
3.3. Add image as view
@discardableResult
func setView(_ view: ViewType, image: UIImage?, width: CGFloat = 50) -> UIButton {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: width, height: frame.height))
button.setImage(image, for: .normal)
button.imageView!.contentMode = .scaleAspectFit
setView(view, with: button)
return button
}
This also return a UIButton
. Why do I return a button than an imageView? Because you can easily add target and I prefer a UIButton
than then UIImageView
Same to previous, there is width
parameter to help you define your button width.
See how it work...
let blueButton = topTextField.setView(.right, image: UIImage(named: "show_pass_active"))
blueButton.backgroundColor = .blue
let redButton = bottomTextField.setView(.left, image: UIImage(named: "password"),
width: 80)
redButton.backgroundColor = .red
3.4. Add white space as view
By default, there is no space on the left (topTextField
) and it looks very bad if textField has border or different background color (view demo).
This is how to do it.
@discardableResult
func setView(_ view: ViewType, space: CGFloat) -> UIView {
let spaceView = UIView(frame: CGRect(x: 0, y: 0, width: space, height: 1))
setView(view, with: spaceView)
return spaceView
}
Conclusion
Hope this can help you save your time and efforts when working with UITextField
. You can access the whole code here.
Don't forget to share me your extension of UITextField
.
Share to grow.
PS: Add underline to UITextField
is interesting and quite long to write in this post. If you're interested in how to add and use underline in UITextField
as an indicator, I write about this topic.
Enjoy coding.