Post

UIKit - UITextField placeholder 커스텀하기

UIKit - UITextField placeholder 커스텀하기

UITextField, UITextView를 모두 사용하여 할 일 추가 화면을 구현하였는데, UITextView에는 placeholder가 제공되지 않아 Delegate를 통해 직접 구현함.

이렇게 구현하니까 아래 화면처럼 UITextFieldUITextView placeholder가 서로 다르게 동작하게 됨.

image

그래서 UITextFieldDelegate 메서드를 구현해서 placeholder를 구현해주기로 함.

TodoAddView.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import UIKit

class TodoAddView: UIView {

    // MARK: - 할일 제목 텍스트 필드
    private let todoTitleTextField: UITextField = {
        let textField = UITextField()
        
        textField.backgroundColor = UIColor(named: "textFieldColor")

        // placeholder를 사용하지 않고 text 프로퍼티에 placeholder 값 할당
        textField.text = Constant.TITLE_PLACEHOLDER
        textField.textColor = .createdDate
        
        textField.font = UIFont.systemFont(ofSize: 17)
        
        textField.layer.borderColor = UIColor.gray.cgColor
        textField.layer.borderWidth = 0.3
        
        textField.clipsToBounds = true
        textField.layer.cornerRadius = 8
        
        textField.translatesAutoresizingMaskIntoConstraints = false
        
        return textField
    }()

    ...


    // Controller에서 View에 있는 UI 요소에 접근하지 못하기 때문에 Delegate를 설정하는 메서드를 만들어줌
    func setTextFieldDelegate(delegate: UITextFieldDelegate){
        todoTitleTextField.delegate = delegate
    }
}

TodoAddViewController.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import UIKit

class TodoAddViewController: UIViewController {

    let todoAddView = TodoAddView()
    
    override func loadView() {
        self.view = todoAddView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // viewDidLoad 시점에서 Delegate 설정
        todoAddView.setTextFieldDelegate(delegate: self)
        setupNavigation()
    }

    ...
}

// MARK: - TextField Delegate
extension TodoAddViewController: UITextFieldDelegate{
    
    // TextField 입력이 시작되는 시점에 호출
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField.text == Constant.TITLE_PLACEHOLDER {
            textField.text = nil
            textField.textColor = .white
        }
    }
    
    // TextField 입력이 끝나는 시점에 호출
    func textFieldDidEndEditing(_ textField: UITextField) {
        guard let text = textField.text, !text.isEmpty else {
            textField.text = Constant.TITLE_PLACEHOLDER
            textField.textColor = .createdDate
            
            return
        }
    }
}

결과

image

Reference

This post is licensed under CC BY 4.0 by the author.