๐Ÿšจํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿšจ

ํ…์ŠคํŠธํ•„๋“œ ์‚ฌ์šฉ๋ฒ•

textField.keyboardType = UIKeyboardType.emailAddress // ํ…์ŠคํŠธํ•„๋“œ์˜ ํ‚ค๋ณด๋“œ ์Šคํƒ€์ผ
textField.placeholder = "์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š”" // ํ…์ŠคํŠธํ•„๋“œ ํ”Œ๋ ˆ์ด์Šคํ™€๋”
textField.borderStyle = .roundedRect // ํ…์ŠคํŠธํ•„๋“œ ์„  ์Šคํƒ€์ผ
textField.clearButtonMode = .always // ๋ฌธ์ž ํ•œ ๋ฒˆ์— ์ง€์šฐ๋Š” ๋ฒ„ํŠผ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ
textField.returnKeyType = .go // ํ‚ค๋ณด๋“œ ์ œ์ผ ์˜ค๋ฅธ์ชฝ ๋ฐ‘์— ํ™•์ธ ๋ฒ„ํŠผ ๋ณ€๊ฒฝ
textField.becomeFirstResponder() // ์ด ํ™”๋ฉด์ด ๋œฐ๋•Œ ํ…์ŠคํŠธํ•„๋“œ๋ฅผ ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํ‚ค๋ณด๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์˜ฌ๋ผ์˜ค๊ฒŒ ํ•จ
textField.resignFirstResponder() // ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ
textField.autocapitalizationType = .none // ์ž๋™์œผ๋กœ ์ฒซ ๋ฌธ์ž ๋Œ€๋ฌธ์ž ์„ค์ •
textField.autocorrectionType = .no // ์ž๋™์œผ๋กœ ํ‹€๋ฆฐ ๊ธ€์ž ์ˆ˜์ •
textField.spellCheckingType = .no // ํ‹€๋ฆฐ ๊ธ€์ž ์ฐพ๊ธฐ
textField.isSecureTextEntry = true // ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ€๋ฆฌ๋Š” ์„ค์ •

ํ…์ŠคํŠธํ•„๋“œ์—์„œ ๊ธ€์ž์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•

// ํ•œ๊ธ€์ž ํ•œ๊ธ€์ž ์ž…๋ ฅํ• ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ -> ์ฐธ(์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ๋ฝ) / ๊ฑฐ์ง“(์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
		// ์ž…๋ ฅ๋˜๊ณ  ์žˆ๋Š” ๊ธ€์ž๊ฐ€ "์ˆซ์ž"์ธ ๊ฒฝ์šฐ ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋…ผ๋ฆฌ
		if Int(string) != nil { // (์ˆซ์ž๋กœ ๋ณ€ํ™˜์ด ๋œ๋‹ค๋ฉด nil์ด ์•„๋‹ํ…Œ๋‹ˆ)
        return false
    } else {
				// 10๊ธ€์ž์ด์ƒ ์ž…๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์ฝ”๋“œ
				guard let text = textField.text else { return true }
				let newLength = text.count + string.count - range.length
				return newLength <= 10
    }

		// ์ˆซ์ž๋งŒ ์ž…๋ ฅ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •
		if Int(string) == nil || string == "" {
            return true
        }
    return false

}

ํ™”๋ฉดํ„ฐ์น˜ ๊ฐ์ง€(ํ‚ค๋ณด๋“œ)

// ํ™”๋ฉด ํ„ฐ์น˜๋ฅผ ํ• ๋•Œ ํ˜ธ์ถœ
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
		// ํ™”๋ฉด ํ„ฐ์น˜๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ํ‚ค๋ณด๋“œ๋ฅผ ๋‚ด๋ฆผ
    self.view.endEditing(true)
}

View๋ฅผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ธฐ(์ฝ”๋“œ)

// ๋ฉ”๋ชจ๋ฆฌ์— UIView๋ฅผ ์˜ฌ๋ ค๋†“๊ธฐ
let emailTextFieldView = UIView()

override func viewDidLoad() {
		super.viewDidLoad()
		
		// ๊ธฐ๋ณธ view ์œ„์— ๋‚ด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋†“์€ view๋ฅผ ์˜ฌ๋ ค์„œ ๋‚˜ํƒ€๋‚ด๊ธฐ
		view.addSubview(emailTextFieldView)
}

์˜คํ† ๋ ˆ์ด์•„์›ƒ(์ฝ”๋“œ)

// ์ž๋™์œผ๋กœ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก๋Š” ๊ธฐ๋Šฅ์„ ๋” (๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์•ผ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์ˆ˜๋™์œผ๋กœ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ)
emailTextFieldView.translatesAutoresizingMaskIntoConstraints = false
        
// left๋Š” ์™ผ์ชฝ leading์€ ๊ธ€์„ ์ฝ๋Š” ๋ฐฉํ–ฅ (์•„๋ž์ชฝ์€ ์˜ค๋ฅธ์ชฝ์ด leading)
emailTextFieldView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30).isActive = true
        
// ์˜ค๋ฅธ์ชฝ(์ˆ˜์น˜ ์•ž์— '-' ๋ถ™ํ˜€์•ผํ•จ<ํ™”๋ฉด ์•ˆ์œผ๋กœ ๋“ค์–ด์˜ฌ์‹œ์—>)
emailTextFieldView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
        
// ์œ„
emailTextFieldView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
        
// ๋†’์ด
emailTextFieldView.heightAnchor.constraint(equalToConstant: 40).isActive = true

// safeArea๊ธฐ์ค€ ์™ผ์ชฝ
emailTextFieldView.safeAreaLayoutGuide.leadingAnchor

// isActive๋ฅผ ์ ๊ธฐ ๊ท€์ฐฎ์œผ๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
NSLayoutConstraint.activate([
    emailInfoLabel.leadingAnchor.constraint(equalTo: emailTextFieldView.leadingAnchor, constant: 8),
    emailInfoLabel.trailingAnchor.constraint(equalTo: emailTextFieldView.trailingAnchor, constant: -8),
    emailInfoLabel.centerYAnchor.constraint(equalTo: emailTextFieldView.centerYAnchor)
])

๋ทฐ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ํ•˜๋Š” ๋ฒ•

// ์ˆ˜์น˜๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋ฉด ๋” ๋‘ฅ๊ธ€๊ฒŒ ๋ฐ”๋€œ
emailTextFieldView.layer.cornerRadius = 8
emailTextFieldView.layer.masksToBounds = true

ํด๋กœ์ €์˜ ์‹คํ–‰๋ฌธํƒ€์ž…์œผ๋กœ ์„ค์ •