// Copyright 2018-present the Material Components for iOS authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import UIKit class ChipTextFieldExampleViewController: UIViewController { let chipTextField = MDCChipTextField() let chipInputController: MDCTextInputControllerOutlined let textField = MDCTextField() let inputController: MDCTextInputControllerOutlined let resignButton = MDCButton() override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { chipInputController = MDCTextInputControllerOutlined(textInput: chipTextField) chipInputController.placeholderText = "With Chips" inputController = MDCTextInputControllerOutlined(textInput: textField) inputController.placeholderText = "Regular MDCTextField" super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.white setupExample() } func setupExample() { chipTextField.translatesAutoresizingMaskIntoConstraints = false chipTextField.backgroundColor = .white chipTextField.delegate = self // when on, enter responds to auto-correction which is confusing when we're trying to create "chips" chipTextField.autocorrectionType = UITextAutocorrectionType.no view.addSubview(chipTextField) // position the textfield somewhere in the screen if #available(iOSApplicationExtension 11.0, *) { let guide = view.safeAreaLayoutGuide chipTextField.leadingAnchor.constraint(equalTo: guide.leadingAnchor, constant: 20.0).isActive = true chipTextField.trailingAnchor.constraint(equalTo: guide.trailingAnchor, constant: -20.0).isActive = true chipTextField.topAnchor.constraint(equalTo: guide.topAnchor, constant: 40.0).isActive = true } else if #available(iOSApplicationExtension 9.0, *) { chipTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = true chipTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = true chipTextField.topAnchor.constraint(equalTo: view.topAnchor, constant: 40.0).isActive = true } else { // Fallback on earlier versions print("This example is supported on iOS version 9 or later.") } textField.translatesAutoresizingMaskIntoConstraints = false textField.backgroundColor = .white view.addSubview(textField) // position the textfield somewhere in the screen if #available(iOSApplicationExtension 11.0, *) { let guide = view.safeAreaLayoutGuide textField.leadingAnchor.constraint(equalTo: guide.leadingAnchor, constant: 20.0).isActive = true textField.trailingAnchor.constraint(equalTo: guide.trailingAnchor, constant: -20.0).isActive = true textField.topAnchor.constraint(equalTo: chipTextField.bottomAnchor, constant: 20.0).isActive = true } else if #available(iOSApplicationExtension 9.0, *) { textField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = true textField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = true textField.topAnchor.constraint(equalTo: chipTextField.bottomAnchor, constant: 20.0).isActive = true } else { // Fallback on earlier versions print("This example is supported on iOS version 9 or later.") } resignButton.setTitle("Resign", for: .normal) resignButton.translatesAutoresizingMaskIntoConstraints = false view.addSubview(resignButton) resignButton.applyContainedTheme(withScheme: MDCContainerScheme()) resignButton.addTarget(self, action: #selector(resignTapped), for: .touchUpInside) if #available(iOSApplicationExtension 9.0, *) { resignButton.leadingAnchor.constraint(equalTo: textField.leadingAnchor).isActive = true resignButton.topAnchor.constraint(equalTo: textField.bottomAnchor, constant: 20.0).isActive = true } } @objc func resignTapped(_ sender: Any) { chipTextField.resignFirstResponder() textField.resignFirstResponder() } } extension ChipTextFieldExampleViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { if let chipTextField = textField as? MDCChipTextField, let chipText = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines), chipText.count > 0 { chipTextField.appendChip(text: chipText) chipTextField.text = "" } return true } } extension ChipTextFieldExampleViewController { class func catalogMetadata() -> [String: Any] { return [ "breadcrumbs": ["Chip Text Field", "A Chip Text Field"], "primaryDemo": false, "presentable": false, ] } }