import UIKit
class PlainTextViewController: UIViewController {
@IBOutlet weak var valueLabel: UILabel!
@IBOutlet weak var fontSizeStepper: UIStepper!
// button을 누르면 label의 색깔이 변경이된다.
@IBAction func changeColorToRed(_ sender: Any) {
valueLabel.textColor = UIColor.systemRed
}
@IBAction func changeColorToBlue(_ sender: Any) {
valueLabel.textColor = UIColor.systemBlue
}
@IBAction func changeColorToBlack(_ sender: Any) {
valueLabel.textColor = UIColor.systemBlue
}
// segmentedControl을 통하여 label의 alignment 바꾸기
@IBAction func updateAlignment(_ sender: UISegmentedControl) {
let selectedIndex = sender.selectedSegmentIndex
guard let alignment = NSTextAlignment(rawValue: selectedIndex) else {
return
}
valueLabel.textAlignment = alignment
}
// stepper를 통하여 fontsize 변경하기
@IBAction func updateFontSize(_ sender: UIStepper) {
let newSize = CGFloat(sender.value)
let newFont = valueLabel.font.withSize(newSize)
valueLabel.font = newFont
}
아래와 같이 storyboard를 구성해보자
placeholder를 설정하고, textfield의 값을 아래와 같은 코드를 통하여 받을 수 있다.
import UIKit
class TextFieldViewController: UIViewController {
// inputField에 들어온 값으로 label의 값을 바꾸기
@IBAction func report(_ sender: Any) {
guard let text = inputField.text, text.count > 0 else {
return
}
valueLabel.text = text
}
@IBOutlet weak var valueLabel: UILabel!
@IBOutlet weak var inputField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// placeholder 코드로 설정해보기
inputField.placeholder = "Input Value"
}
}
import UIKit
class TextFieldBorderStyleViewController: UIViewController {
@IBOutlet weak var inputField: UITextField!
@IBOutlet weak var borderStyleControl: UISegmentedControl!
// segmentedControl로 들어온 값으로 inputfield의 boarder 스타일을 바꾸기
@IBAction func borderStyleChanged(_ sender: UISegmentedControl) {
let index = sender.selectedSegmentIndex
let style = UITextField.BorderStyle(rawValue: index) ?? .roundedRect
inputField.borderStyle = style
}
@IBOutlet weak var enabledSwitch: UISwitch!
@IBAction func toggleEnabled(_ sender: UISwitch) {
inputField.isEnabled = sender.isOn
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
TextView는 스크롤을 지원하기에, 길게 글을 넣어도 다 스크롤을 통해서 볼 수는 있다.
아래와 같이 textView를 추가한다.
그리고 textView의 여백 및 scrollIndicator의 여백을 textview의 여백과 같이 맞게 설정해주기
class TextViewViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// textView안의 위아래옆의 여백을 설정하기
textView.textContainerInset = UIEdgeInsets(top: 30, left: 0, bottom: 30, right: 0)
// textView의 여백과 같이 scrollIndicator의 여백도 설정하기
textView.scrollIndicatorInsets = textView.textContainerInset
}
}
import UIKit
class TextSelectionViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var selectedRangeLabel: UILabel!
// selectLast를 누르면 pariatur단어가 있는 곳으로 textview가 알아서 scroll되게
@IBAction func selectLast(_ sender: Any) {
let lastWord = "pariatur?"
if let text = textView.text as NSString? {
let range = text.range(of: lastWord)
textView.selectedRange = range
// lastword로 scroll이 된다.
textView.scrollRangeToVisible(range)
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension TextSelectionViewController: UITextViewDelegate{
// textview 내부를 선택하면 함수가 실행이된다.
func textViewDidChangeSelection(_ textView: UITextView) {
// textview를 누르면 해당 위치가 나오게 하기!
let range = textView.selectedRange
selectedRangeLabel.text = "\(range)"
}
}
import UIKit
class CapitalizationViewController: UIViewController {
@IBOutlet weak var inputField: UITextField!
@IBAction func capitalizationChanged(_ sender: UISegmentedControl) {
// SegmentedControl에 맞게 textview의 type을 변경시키기.
// 편집 모드 활성화
inputField.resignFirstResponder()
let type = UITextAutocapitalizationType(rawValue: sender.selectedSegmentIndex) ?? .none
inputField.autocapitalizationType = type
// 편집 모드 비활성화
inputField.becomeFirstResponder()
// words -> 어절의 첫번째를 다 대문자로 만들어준다.
// sentences -> 첫번째 문자만 대문자로 만들어준다.
// allchars -> 모든 문자를 대문자로 만들어준다.
}
import UIKit
class CorrectionViewController: UIViewController {
@IBOutlet weak var inputField: UITextField!
@IBAction func correctionChanged(_ sender: UISegmentedControl) {
inputField.resignFirstResponder()
let type = UITextAutocorrectionType(rawValue: sender.selectedSegmentIndex) ?? .default
inputField.autocorrectionType = type
inputField.becomeFirstResponder()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
class SpellCheckingViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
@IBAction func spellCheckingChanged(_ sender: UISegmentedControl) {
let type = UITextSpellCheckingType(rawValue: sender.selectedSegmentIndex) ?? .default
textView.spellCheckingType = type
}
passwordField.isSecureTextEntry = true
아래와 같이 storyboard를 구성한다.
inputField.becomeFirstResponder() -> 편집 모드로 전화이되고 키보드가 활성화가 된다.
inputField.resignFirstResponder() -> 편집 모드가 비활성되고 키보드도 비활성화가 된다.
import UIKit
class FirstResponderViewController: UIViewController {
@IBOutlet weak var inputField: UITextField!
@IBAction func startEditing(_ sender: Any) {
// 편집 모드로 전환이되고 키보드가 활성화가 된다.
inputField.becomeFirstResponder()
}
@IBAction func endEditing(_ sender: Any) {
// 편집모드인지 확인하고, 편집모드이면 편집 모드를 비활성화 및 키보드도 비활성화하기
if inputField.isFirstResponder{
inputField.resignFirstResponder()
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// view가 띄어지자마자 바로 편집모드
inputField.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// 아래와 같은 방식도 가능하다.
// if inputField.isFirstResponder{
// inputField.resignFirstResponder()
// }
// 뷰가 없어질 때 편집모드는 끄기
view.endEditing(true)
}
}
segmentedControl을 통하여 keyboard appearance를 변경해보자.
import UIKit
class KeyboardAppearanceViewController: UIViewController {
@IBOutlet weak var inputField: UITextField!
@IBAction func appearanceChanged(_ sender: UISegmentedControl) {
let appearance = UIKeyboardAppearance(rawValue: sender.selectedSegmentIndex) ?? .default
inputField.keyboardAppearance = appearance
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
inputField.becomeFirstResponder()
}
}
아래와 같이 두개의 textfield를 생성해보자
아래와 같이 auto-enable return key를 체크하면
아무것도 치지 않으면 저렇게 return 키를 누를 수 없게 설정이된다.
return 키를 아래와 같이 다양하게 설정을 할 수 있다.
그러면, 첫번째 textfield에서 return을 누르면 두번째 textfield로 넘어가게되고, 두번째 textfield에서 return을 누르면 구글 검색이되게 해보자.
import UIKit
class ReturnKeyViewController: UIViewController {
@IBOutlet weak var firstInputField: UITextField!
@IBOutlet weak var secondInputField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Auto-Enable return key
secondInputField.enablesReturnKeyAutomatically = true
}
}
extension ReturnKeyViewController: UITextFieldDelegate {
// Return key를 탭할 때마다 함수가 호출이된다. 근데 두개의 textfield가 존재를 한다. -> switch문으로 해결
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// switch 문으로 어떤 textfield인지를 확인한다.
switch textField {
// 만약 첫번째에서 return을 누르면 두번째 textfield로 넘어가게된다.
case firstInputField:
secondInputField.becomeFirstResponder()
case secondInputField:
// 두번째에서 return을 누르면 google에 검색을 하기!
guard let keyword = secondInputField.text, keyword.count > 0 else{
return true
}
let encodedKeyword = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? keyword
let urlStr = "http://www.google.com/m/search?q=\(encodedKeyword)"
guard let url = URL(string:urlStr) else {
return true
}
if UIApplication.shared.canOpenURL(url){
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
default:
break
}
return true
}
}
아래와 같은 keyboardNotification이 존재를 한다!
그런데, 아래와 같은 문제를 notification을 통하여 해결해보자.
- keyboard가 textview를 가리는 문제!
import UIKit
class KeyboardNotificationViewController: UIViewController {
@IBOutlet var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// keyboard가 나타날 때 view의 여백 조정하기
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { (noti) in
guard let userInfo = noti.userInfo else {return}
// keyboard의 frame 값 구하기
guard let frame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else {return}
var inset = self.textView.contentInset
// keyboard frame.height 값으로 inset을 정하기
inset.bottom = frame.height
self.textView.contentInset = inset
self.textView.scrollIndicatorInsets = inset
}
// keyboard가 없어질 때
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { (noti) in
var inset = self.textView.contentInset
inset.bottom = 8
self.textView.contentInset = inset
}
}
}