mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-01-22 05:02:22 +08:00
724 lines
33 KiB
Swift
724 lines
33 KiB
Swift
// Copyright 2016-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.
|
|
|
|
// swiftlint:disable file_length
|
|
// swiftlint:disable type_body_length
|
|
// swiftlint:disable function_body_length
|
|
|
|
import UIKit
|
|
|
|
import MaterialComponents.MaterialTextFields
|
|
import MaterialComponents.MaterialAppBar
|
|
import MaterialComponents.MaterialButtons
|
|
import MaterialComponents.MaterialTypography
|
|
import MaterialComponents.MaterialPalettes
|
|
|
|
final class TextFieldKitchenSinkSwiftExample: UIViewController {
|
|
|
|
let scrollView = UIScrollView()
|
|
|
|
let controlLabel: UILabel = {
|
|
let controlLabel = UILabel()
|
|
controlLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
controlLabel.text = "Options"
|
|
controlLabel.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
controlLabel.textColor = UIColor(white: 0, alpha: MDCTypography.headlineFontOpacity())
|
|
return controlLabel
|
|
}()
|
|
|
|
let singleLabel: UILabel = {
|
|
let singleLabel = UILabel()
|
|
singleLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
singleLabel.text = "Single-line Text Fields"
|
|
singleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
singleLabel.textColor = UIColor(white: 0, alpha: MDCTypography.headlineFontOpacity())
|
|
singleLabel.numberOfLines = 0
|
|
return singleLabel
|
|
}()
|
|
|
|
let multiLabel: UILabel = {
|
|
let multiLabel = UILabel()
|
|
multiLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
multiLabel.text = "Multi-line Text Fields"
|
|
multiLabel.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
multiLabel.textColor = UIColor(white: 0, alpha: MDCTypography.headlineFontOpacity())
|
|
multiLabel.numberOfLines = 0
|
|
return multiLabel
|
|
}()
|
|
|
|
let errorLabel: UILabel = {
|
|
let errorLabel = UILabel()
|
|
errorLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
errorLabel.text = "In Error:"
|
|
errorLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
|
|
errorLabel.textColor = UIColor(white: 0, alpha: MDCTypography.subheadFontOpacity())
|
|
errorLabel.numberOfLines = 0
|
|
return errorLabel
|
|
}()
|
|
|
|
let helperLabel: UILabel = {
|
|
let helperLabel = UILabel()
|
|
helperLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
helperLabel.text = "Show Helper Text:"
|
|
helperLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
|
|
helperLabel.textColor = UIColor(white: 0, alpha: MDCTypography.subheadFontOpacity())
|
|
helperLabel.numberOfLines = 0
|
|
return helperLabel
|
|
}()
|
|
|
|
let baselineTestLabel: UILabel = {
|
|
let baselineTestLabel = UILabel()
|
|
baselineTestLabel.text = "popopopopopop "
|
|
baselineTestLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
return baselineTestLabel
|
|
}()
|
|
|
|
var allInputControllers = [MDCTextInputController]()
|
|
var allTextFieldControllers = [MDCTextInputController]()
|
|
var allMultilineTextFieldControllers = [MDCTextInputController]()
|
|
var controllersWithCharacterCount = [MDCTextInputController]()
|
|
var controllersFullWidth = [MDCTextInputControllerFullWidth]()
|
|
|
|
let unstyledTextField = MDCTextField()
|
|
let unstyledMultilineTextField = MDCMultilineTextField()
|
|
|
|
lazy var textInsetsModeButton: MDCButton = self.setupButton()
|
|
lazy var characterModeButton: MDCButton = self.setupButton()
|
|
lazy var clearModeButton: MDCButton = self.setupButton()
|
|
lazy var underlineButton: MDCButton = self.setupButton()
|
|
|
|
let attributedString = NSAttributedString(string: "This uses attributed text.")
|
|
|
|
deinit {
|
|
NotificationCenter.default.removeObserver(self)
|
|
}
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
setupExampleViews()
|
|
}
|
|
|
|
func setupFilledTextFields() -> [MDCTextInputControllerFilled] {
|
|
let textFieldFilled = MDCTextField()
|
|
textFieldFilled.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFilled)
|
|
|
|
textFieldFilled.delegate = self
|
|
|
|
let textFieldControllerFilled = MDCTextInputControllerFilled(textInput: textFieldFilled)
|
|
textFieldControllerFilled.isFloatingEnabled = false
|
|
textFieldControllerFilled.placeholderText = "This is a filled text field"
|
|
|
|
let textFieldFilledFloating = MDCTextField()
|
|
textFieldFilledFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFilledFloating)
|
|
|
|
textFieldFilledFloating.delegate = self
|
|
|
|
let textFieldControllerFilledFloating = MDCTextInputControllerFilled(textInput: textFieldFilledFloating)
|
|
textFieldControllerFilledFloating.placeholderText = "This is filled and floating"
|
|
|
|
let textFieldFilledFloatingAttributed = MDCTextField()
|
|
textFieldFilledFloatingAttributed.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFilledFloatingAttributed)
|
|
|
|
textFieldFilledFloatingAttributed.delegate = self
|
|
|
|
let textFieldControllerFilledFloatingAttributed =
|
|
MDCTextInputControllerFilled(textInput: textFieldFilledFloatingAttributed)
|
|
textFieldControllerFilledFloatingAttributed.placeholderText = "This is filled and floating"
|
|
textFieldFilledFloatingAttributed.attributedText = attributedString
|
|
return [textFieldControllerFilled, textFieldControllerFilledFloating,
|
|
textFieldControllerFilledFloatingAttributed]
|
|
}
|
|
|
|
func setupFullWidthTextFields() -> [MDCTextInputControllerFullWidth] {
|
|
let textFieldFullWidthPlaceholder = MDCTextField()
|
|
textFieldFullWidthPlaceholder.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFullWidthPlaceholder)
|
|
|
|
textFieldFullWidthPlaceholder.delegate = self
|
|
textFieldFullWidthPlaceholder.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerFullWidthPlaceholder =
|
|
MDCTextInputControllerFullWidth(textInput: textFieldFullWidthPlaceholder)
|
|
textFieldControllerFullWidthPlaceholder.placeholderText = "This is a full width text field"
|
|
|
|
let textFieldFullWidthCharMax = MDCTextField()
|
|
textFieldFullWidthCharMax.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFullWidthCharMax)
|
|
|
|
textFieldFullWidthCharMax.delegate = self
|
|
textFieldFullWidthCharMax.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerFullWidthCharMax =
|
|
MDCTextInputControllerFullWidth(textInput: textFieldFullWidthCharMax)
|
|
textFieldControllerFullWidthCharMax.characterCountMax = 50
|
|
textFieldControllerFullWidthCharMax.placeholderText =
|
|
"This is a full width text field with character count and a very long placeholder"
|
|
|
|
controllersWithCharacterCount.append(textFieldControllerFullWidthCharMax)
|
|
|
|
return [textFieldControllerFullWidthPlaceholder,
|
|
textFieldControllerFullWidthCharMax]
|
|
}
|
|
|
|
func setupFloatingUnderlineTextFields() -> [MDCTextInputControllerUnderline] {
|
|
let textFieldFloating = MDCTextField()
|
|
textFieldFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFloating)
|
|
|
|
textFieldFloating.delegate = self
|
|
textFieldFloating.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerFloating = MDCTextInputControllerUnderline(textInput: textFieldFloating)
|
|
textFieldControllerFloating.placeholderText = "This is a text field w/ floating placeholder"
|
|
|
|
let textFieldFloatingCharMax = MDCTextField()
|
|
textFieldFloatingCharMax.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldFloatingCharMax)
|
|
|
|
textFieldFloatingCharMax.delegate = self
|
|
textFieldFloatingCharMax.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerFloatingCharMax =
|
|
MDCTextInputControllerUnderline(textInput: textFieldFloatingCharMax)
|
|
textFieldControllerFloatingCharMax.characterCountMax = 50
|
|
textFieldControllerFloatingCharMax.placeholderText = "This is floating with character count"
|
|
|
|
controllersWithCharacterCount.append(textFieldControllerFloatingCharMax)
|
|
|
|
baselineTestLabel.font = textFieldFloatingCharMax.font
|
|
self.scrollView.addSubview(baselineTestLabel)
|
|
|
|
baselineTestLabel.trailingAnchor.constraint(equalTo: textFieldFloatingCharMax.trailingAnchor,
|
|
constant: 0).isActive = true
|
|
|
|
baselineTestLabel.firstBaselineAnchor.constraint(equalTo: textFieldFloatingCharMax.firstBaselineAnchor).isActive = true
|
|
|
|
return [textFieldControllerFloating, textFieldControllerFloatingCharMax]
|
|
}
|
|
|
|
func setupInlineUnderlineTextFields() -> [MDCTextInputControllerUnderline] {
|
|
let textFieldUnderline = MDCTextField()
|
|
textFieldUnderline.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldUnderline)
|
|
|
|
textFieldUnderline.delegate = self
|
|
textFieldUnderline.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderline = MDCTextInputControllerUnderline(textInput: textFieldUnderline)
|
|
|
|
textFieldControllerUnderline.isFloatingEnabled = false
|
|
|
|
let textFieldUnderlinePlaceholder = MDCTextField()
|
|
textFieldUnderlinePlaceholder.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldUnderlinePlaceholder)
|
|
|
|
textFieldUnderlinePlaceholder.delegate = self
|
|
|
|
textFieldUnderlinePlaceholder.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlinePlaceholder =
|
|
MDCTextInputControllerUnderline(textInput: textFieldUnderlinePlaceholder)
|
|
|
|
textFieldControllerUnderlinePlaceholder.isFloatingEnabled = false
|
|
textFieldControllerUnderlinePlaceholder.placeholderText = "This is a text field w/ inline placeholder"
|
|
|
|
let textFieldUnderlineCharMax = MDCTextField()
|
|
textFieldUnderlineCharMax.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldUnderlineCharMax)
|
|
|
|
textFieldUnderlineCharMax.delegate = self
|
|
textFieldUnderlineCharMax.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineCharMax =
|
|
MDCTextInputControllerUnderline(textInput: textFieldUnderlineCharMax)
|
|
textFieldControllerUnderlineCharMax.characterCountMax = 50
|
|
textFieldControllerUnderlineCharMax.isFloatingEnabled = false
|
|
textFieldControllerUnderlineCharMax.placeholderText = "This is a text field w/ character count"
|
|
|
|
controllersWithCharacterCount.append(textFieldControllerUnderlineCharMax)
|
|
|
|
return [textFieldControllerUnderline, textFieldControllerUnderlinePlaceholder,
|
|
textFieldControllerUnderlineCharMax]
|
|
}
|
|
|
|
func setupSpecialTextFields() -> [MDCTextInputControllerFloatingPlaceholder] {
|
|
let textFieldDisabled = MDCTextField()
|
|
textFieldDisabled.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldDisabled)
|
|
|
|
textFieldDisabled.delegate = self
|
|
textFieldDisabled.isEnabled = false
|
|
|
|
let textFieldControllerUnderlineDisabled =
|
|
MDCTextInputControllerUnderline(textInput: textFieldDisabled)
|
|
textFieldControllerUnderlineDisabled.isFloatingEnabled = false
|
|
textFieldControllerUnderlineDisabled.placeholderText = "This is a disabled text field"
|
|
|
|
let textFieldCustomFont = MDCTextField()
|
|
textFieldCustomFont.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldCustomFont)
|
|
|
|
textFieldCustomFont.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
textFieldCustomFont.delegate = self
|
|
textFieldCustomFont.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineCustomFont =
|
|
MDCTextInputControllerUnderline(textInput: textFieldCustomFont)
|
|
textFieldControllerUnderlineCustomFont.inlinePlaceholderFont = UIFont.preferredFont(forTextStyle: .headline)
|
|
textFieldControllerUnderlineCustomFont.isFloatingEnabled = false
|
|
textFieldControllerUnderlineCustomFont.placeholderText = "This is a custom font"
|
|
|
|
let textFieldCustomFontFloating = MDCTextField()
|
|
textFieldCustomFontFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldCustomFontFloating)
|
|
|
|
textFieldCustomFontFloating.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
textFieldCustomFontFloating.delegate = self
|
|
textFieldCustomFontFloating.clearButtonMode = .whileEditing
|
|
textFieldCustomFontFloating.cursorColor = .orange
|
|
|
|
let textFieldControllerUnderlineCustomFontFloating =
|
|
MDCTextInputControllerUnderline(textInput: textFieldCustomFontFloating)
|
|
textFieldControllerUnderlineCustomFontFloating.characterCountMax = 40
|
|
textFieldControllerUnderlineCustomFontFloating.placeholderText = "This is a custom font with the works"
|
|
textFieldControllerUnderlineCustomFontFloating.setHelperText("Custom Font",
|
|
helperAccessibilityLabel: "Cyan custom font in leading underline label")
|
|
textFieldControllerUnderlineCustomFontFloating.activeColor = .green
|
|
textFieldControllerUnderlineCustomFontFloating.normalColor = .purple
|
|
textFieldControllerUnderlineCustomFontFloating.leadingUnderlineLabelTextColor = .cyan
|
|
textFieldControllerUnderlineCustomFontFloating.trailingUnderlineLabelTextColor = .magenta
|
|
textFieldControllerUnderlineCustomFontFloating.leadingUnderlineLabelFont =
|
|
UIFont.preferredFont(forTextStyle: .headline)
|
|
textFieldControllerUnderlineCustomFontFloating.inlinePlaceholderFont =
|
|
UIFont.preferredFont(forTextStyle: .headline)
|
|
textFieldControllerUnderlineCustomFontFloating.trailingUnderlineLabelFont =
|
|
UIFont.preferredFont(forTextStyle: .subheadline)
|
|
textFieldCustomFontFloating.clearButton.tintColor = MDCPalette.red.accent400
|
|
textFieldControllerUnderlineCustomFontFloating.floatingPlaceholderNormalColor = .yellow
|
|
textFieldControllerUnderlineCustomFontFloating.floatingPlaceholderActiveColor = .orange
|
|
|
|
let bundle = Bundle(for: TextFieldKitchenSinkSwiftExample.self)
|
|
let leadingViewImage = UIImage(named: "ic_search", in: bundle, compatibleWith: nil) ??
|
|
UIImage()
|
|
|
|
let textFieldLeadingView = MDCTextField()
|
|
textFieldLeadingView.leadingViewMode = .always
|
|
textFieldLeadingView.leadingView = UIImageView(image:leadingViewImage)
|
|
|
|
textFieldLeadingView.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldLeadingView)
|
|
|
|
textFieldLeadingView.delegate = self
|
|
textFieldLeadingView.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineLeadingView =
|
|
MDCTextInputControllerUnderline(textInput: textFieldLeadingView)
|
|
textFieldControllerUnderlineLeadingView.isFloatingEnabled = false
|
|
textFieldControllerUnderlineLeadingView.placeholderText = "This has a leading view"
|
|
|
|
let textFieldLeadingViewAttributed = MDCTextField()
|
|
textFieldLeadingViewAttributed.leadingViewMode = .always
|
|
textFieldLeadingViewAttributed.leadingView = UIImageView(image:leadingViewImage)
|
|
|
|
textFieldLeadingViewAttributed.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldLeadingViewAttributed)
|
|
|
|
textFieldLeadingViewAttributed.delegate = self
|
|
textFieldLeadingViewAttributed.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineLeadingViewAttributed =
|
|
MDCTextInputControllerUnderline(textInput: textFieldLeadingViewAttributed)
|
|
textFieldControllerUnderlineLeadingViewAttributed.isFloatingEnabled = false
|
|
textFieldControllerUnderlineLeadingViewAttributed.placeholderText = "This has a leading view"
|
|
textFieldLeadingViewAttributed.attributedText = attributedString
|
|
|
|
let textFieldLeadingViewFloating = MDCTextField()
|
|
textFieldLeadingViewFloating.leadingViewMode = .always
|
|
textFieldLeadingViewFloating.leadingView = UIImageView(image:leadingViewImage)
|
|
|
|
textFieldLeadingViewFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldLeadingViewFloating)
|
|
|
|
textFieldLeadingViewFloating.delegate = self
|
|
textFieldLeadingViewFloating.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineLeadingViewFloating =
|
|
MDCTextInputControllerUnderline(textInput: textFieldLeadingViewFloating)
|
|
textFieldControllerUnderlineLeadingViewFloating.placeholderText = "This has a leading view and floats"
|
|
|
|
let textFieldLeadingViewFloatingAttributed = MDCTextField()
|
|
textFieldLeadingViewFloatingAttributed.leadingViewMode = .always
|
|
textFieldLeadingViewFloatingAttributed.leadingView = UIImageView(image:leadingViewImage)
|
|
|
|
textFieldLeadingViewFloatingAttributed.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldLeadingViewFloatingAttributed)
|
|
|
|
textFieldLeadingViewFloatingAttributed.delegate = self
|
|
textFieldLeadingViewFloatingAttributed.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineLeadingViewFloatingAttributed =
|
|
MDCTextInputControllerUnderline(textInput: textFieldLeadingViewFloatingAttributed)
|
|
textFieldControllerUnderlineLeadingViewFloatingAttributed.placeholderText =
|
|
"This has a leading view and floats"
|
|
textFieldLeadingViewFloatingAttributed.attributedText = attributedString
|
|
|
|
let trailingViewImage = UIImage(named: "ic_done", in: bundle, compatibleWith: nil) ??
|
|
UIImage()
|
|
|
|
let textFieldTrailingView = MDCTextField()
|
|
textFieldTrailingView.trailingViewMode = .always
|
|
textFieldTrailingView.trailingView = UIImageView(image:trailingViewImage)
|
|
|
|
textFieldTrailingView.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldTrailingView)
|
|
|
|
textFieldTrailingView.delegate = self
|
|
textFieldTrailingView.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineTrailingView =
|
|
MDCTextInputControllerUnderline(textInput: textFieldTrailingView)
|
|
textFieldControllerUnderlineTrailingView.isFloatingEnabled = false
|
|
textFieldControllerUnderlineTrailingView.placeholderText = "This has a trailing view"
|
|
|
|
let textFieldTrailingViewFloating = MDCTextField()
|
|
textFieldTrailingViewFloating.trailingViewMode = .always
|
|
textFieldTrailingViewFloating.trailingView = UIImageView(image:trailingViewImage)
|
|
|
|
textFieldTrailingViewFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldTrailingViewFloating)
|
|
|
|
textFieldTrailingViewFloating.delegate = self
|
|
textFieldTrailingViewFloating.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineTrailingViewFloating =
|
|
MDCTextInputControllerUnderline(textInput: textFieldTrailingViewFloating)
|
|
textFieldControllerUnderlineTrailingViewFloating.placeholderText = "This has a trailing view and floats"
|
|
|
|
let textFieldLeadingTrailingView = MDCTextField()
|
|
textFieldLeadingTrailingView.leadingViewMode = .whileEditing
|
|
textFieldLeadingTrailingView.leadingView = UIImageView(image: leadingViewImage)
|
|
textFieldLeadingTrailingView.trailingViewMode = .unlessEditing
|
|
textFieldLeadingTrailingView.trailingView = UIImageView(image:trailingViewImage)
|
|
|
|
textFieldLeadingTrailingView.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldLeadingTrailingView)
|
|
|
|
textFieldLeadingTrailingView.delegate = self
|
|
textFieldLeadingTrailingView.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineLeadingTrailingView =
|
|
MDCTextInputControllerUnderline(textInput: textFieldLeadingTrailingView)
|
|
textFieldControllerUnderlineLeadingTrailingView.isFloatingEnabled = false
|
|
textFieldControllerUnderlineLeadingTrailingView.placeholderText =
|
|
"This has leading & trailing views and a very long placeholder that should be truncated"
|
|
|
|
let textFieldLeadingTrailingViewFloating = MDCTextField()
|
|
textFieldLeadingTrailingViewFloating.leadingViewMode = .always
|
|
textFieldLeadingTrailingViewFloating.leadingView = UIImageView(image: leadingViewImage)
|
|
textFieldLeadingTrailingViewFloating.trailingViewMode = .whileEditing
|
|
textFieldLeadingTrailingViewFloating.trailingView = UIImageView(image:trailingViewImage)
|
|
|
|
textFieldLeadingTrailingViewFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldLeadingTrailingViewFloating)
|
|
|
|
textFieldLeadingTrailingViewFloating.delegate = self
|
|
textFieldLeadingTrailingViewFloating.clearButtonMode = .whileEditing
|
|
|
|
let textFieldControllerUnderlineLeadingTrailingViewFloating =
|
|
MDCTextInputControllerUnderline(textInput: textFieldLeadingTrailingViewFloating)
|
|
textFieldControllerUnderlineLeadingTrailingViewFloating.placeholderText =
|
|
"This has leading & trailing views and floats and a very long placeholder that should be truncated"
|
|
|
|
let textFieldBase = MDCTextField()
|
|
textFieldBase.delegate = self
|
|
textFieldBase.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldBase)
|
|
|
|
let textFieldControllerBase = MDCTextInputControllerBase(textInput: textFieldBase)
|
|
textFieldControllerBase.placeholderText = "This is the common base class for controllers"
|
|
textFieldControllerBase.setHelperText("It's expected that you'll subclass this.",
|
|
helperAccessibilityLabel: "You should subclass this.")
|
|
|
|
unstyledTextField.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(unstyledTextField)
|
|
|
|
unstyledTextField.placeholder = "This is an unstyled text field (no controller)"
|
|
unstyledTextField.leadingUnderlineLabel.text = "Leading label"
|
|
unstyledTextField.trailingUnderlineLabel.text = "Trailing label"
|
|
unstyledTextField.delegate = self
|
|
unstyledTextField.clearButtonMode = .whileEditing
|
|
unstyledTextField.leadingView = UIImageView(image: leadingViewImage)
|
|
unstyledTextField.leadingViewMode = .always
|
|
unstyledTextField.trailingView = UIImageView(image: trailingViewImage)
|
|
unstyledTextField.trailingViewMode = .always
|
|
|
|
return [textFieldControllerUnderlineDisabled,
|
|
textFieldControllerUnderlineCustomFont, textFieldControllerUnderlineCustomFontFloating,
|
|
textFieldControllerUnderlineLeadingView,
|
|
textFieldControllerUnderlineLeadingViewAttributed,
|
|
textFieldControllerUnderlineLeadingViewFloating,
|
|
textFieldControllerUnderlineLeadingViewFloatingAttributed,
|
|
textFieldControllerUnderlineTrailingView,
|
|
textFieldControllerUnderlineTrailingViewFloating,
|
|
textFieldControllerUnderlineLeadingTrailingView,
|
|
textFieldControllerUnderlineLeadingTrailingViewFloating,
|
|
textFieldControllerBase]
|
|
}
|
|
|
|
// MARK: - Multi-line
|
|
|
|
func setupAreaTextFields() -> [MDCTextInputControllerOutlinedTextArea] {
|
|
let textFieldArea = MDCMultilineTextField()
|
|
textFieldArea.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldArea)
|
|
|
|
textFieldArea.textView?.delegate = self
|
|
|
|
let textFieldControllerArea = MDCTextInputControllerOutlinedTextArea(textInput: textFieldArea)
|
|
textFieldControllerArea.placeholderText = "This is a text area"
|
|
|
|
let textFieldAreaAttributed = MDCMultilineTextField()
|
|
textFieldAreaAttributed.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(textFieldAreaAttributed)
|
|
|
|
textFieldAreaAttributed.textView?.delegate = self
|
|
|
|
let textFieldControllerAreaAttributed =
|
|
MDCTextInputControllerOutlinedTextArea(textInput: textFieldAreaAttributed)
|
|
textFieldControllerAreaAttributed.placeholderText = "This is a text area"
|
|
textFieldAreaAttributed.attributedText = attributedString
|
|
|
|
return [textFieldControllerArea, textFieldControllerAreaAttributed]
|
|
}
|
|
|
|
func setupUnderlineMultilineTextFields() -> [MDCTextInputControllerUnderline] {
|
|
let multilineTextFieldUnderline = MDCMultilineTextField()
|
|
multilineTextFieldUnderline.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldUnderline)
|
|
|
|
multilineTextFieldUnderline.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerUnderline =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldUnderline)
|
|
multilineTextFieldControllerUnderline.isFloatingEnabled = false
|
|
|
|
let multilineTextFieldUnderlinePlaceholder = MDCMultilineTextField()
|
|
multilineTextFieldUnderlinePlaceholder.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldUnderlinePlaceholder)
|
|
|
|
multilineTextFieldUnderlinePlaceholder.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerUnderlinePlaceholder =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldUnderlinePlaceholder)
|
|
multilineTextFieldControllerUnderlinePlaceholder.isFloatingEnabled = false
|
|
multilineTextFieldControllerUnderlinePlaceholder.placeholderText =
|
|
"This is a multi-line text field with placeholder"
|
|
|
|
let multilineTextFieldUnderlineCharMax = MDCMultilineTextField()
|
|
multilineTextFieldUnderlineCharMax.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldUnderlineCharMax)
|
|
|
|
multilineTextFieldUnderlineCharMax.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerUnderlineCharMax =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldUnderlineCharMax)
|
|
multilineTextFieldControllerUnderlineCharMax.characterCountMax = 140
|
|
multilineTextFieldControllerUnderlineCharMax.isFloatingEnabled = false
|
|
multilineTextFieldControllerUnderlineCharMax.placeholderText =
|
|
"This is a multi-line text field with placeholder"
|
|
|
|
controllersWithCharacterCount.append(multilineTextFieldControllerUnderlineCharMax)
|
|
|
|
return [multilineTextFieldControllerUnderline, multilineTextFieldControllerUnderlinePlaceholder,
|
|
multilineTextFieldControllerUnderlineCharMax]
|
|
}
|
|
|
|
func setupFullWidthMultilineTextFields() -> [MDCTextInputControllerFullWidth] {
|
|
let multilineTextFieldFullWidth = MDCMultilineTextField()
|
|
multilineTextFieldFullWidth.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldFullWidth)
|
|
|
|
multilineTextFieldFullWidth.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerFullWidth =
|
|
MDCTextInputControllerFullWidth(textInput: multilineTextFieldFullWidth)
|
|
multilineTextFieldControllerFullWidth.placeholderText =
|
|
"This is a full width multi-line text field"
|
|
|
|
let multilineTextFieldFullWidthCharMax = MDCMultilineTextField()
|
|
multilineTextFieldFullWidthCharMax.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldFullWidthCharMax)
|
|
|
|
multilineTextFieldFullWidthCharMax.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerFullWidthCharMax =
|
|
MDCTextInputControllerFullWidth(textInput: multilineTextFieldFullWidthCharMax)
|
|
multilineTextFieldControllerFullWidthCharMax.placeholderText =
|
|
"This is a full width multi-line text field with character count"
|
|
|
|
controllersWithCharacterCount.append(multilineTextFieldControllerFullWidthCharMax)
|
|
multilineTextFieldControllerFullWidthCharMax.characterCountMax = 140
|
|
|
|
return [multilineTextFieldControllerFullWidth, multilineTextFieldControllerFullWidthCharMax]
|
|
}
|
|
|
|
func setupFloatingMultilineTextFields() -> [MDCTextInputControllerUnderline] {
|
|
let multilineTextFieldFloating = MDCMultilineTextField()
|
|
multilineTextFieldFloating.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldFloating)
|
|
|
|
multilineTextFieldFloating.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerFloating =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldFloating)
|
|
multilineTextFieldControllerFloating.placeholderText =
|
|
"This is a multi-line text field with a floating placeholder"
|
|
|
|
let multilineTextFieldFloatingCharMax = MDCMultilineTextField()
|
|
multilineTextFieldFloatingCharMax.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldFloatingCharMax)
|
|
|
|
multilineTextFieldFloatingCharMax.textView?.delegate = self
|
|
|
|
let multilineTextFieldControllerFloatingCharMax =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldFloatingCharMax)
|
|
multilineTextFieldControllerFloatingCharMax.placeholderText =
|
|
"This is a multi-line text field with a floating placeholder and character count"
|
|
|
|
controllersWithCharacterCount.append(multilineTextFieldControllerFloatingCharMax)
|
|
|
|
return [multilineTextFieldControllerFloating, multilineTextFieldControllerFloatingCharMax]
|
|
}
|
|
|
|
func setupSpecialMultilineTextFields() -> [MDCTextInputController] {
|
|
let bundle = Bundle(for: TextFieldKitchenSinkSwiftExample.self)
|
|
let trailingViewImage = UIImage(named: "ic_done", in: bundle, compatibleWith: nil) ??
|
|
UIImage()
|
|
|
|
let multilineTextFieldTrailingView = MDCMultilineTextField()
|
|
multilineTextFieldTrailingView.trailingViewMode = .always
|
|
multilineTextFieldTrailingView.trailingView = UIImageView(image:trailingViewImage)
|
|
|
|
multilineTextFieldTrailingView.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldTrailingView)
|
|
|
|
multilineTextFieldTrailingView.textView?.delegate = self
|
|
multilineTextFieldTrailingView.clearButtonMode = .whileEditing
|
|
|
|
let multilineTextFieldControllerUnderlineTrailingView =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldTrailingView)
|
|
multilineTextFieldControllerUnderlineTrailingView.isFloatingEnabled = false
|
|
multilineTextFieldControllerUnderlineTrailingView.placeholderText = "This has a trailing view"
|
|
|
|
let multilineTextFieldCustomFont = MDCMultilineTextField()
|
|
multilineTextFieldCustomFont.translatesAutoresizingMaskIntoConstraints = false
|
|
scrollView.addSubview(multilineTextFieldCustomFont)
|
|
|
|
let multilineTextFieldControllerUnderlineCustomFont =
|
|
MDCTextInputControllerUnderline(textInput: multilineTextFieldCustomFont)
|
|
multilineTextFieldControllerUnderlineCustomFont.placeholderText = "This has a custom font"
|
|
|
|
multilineTextFieldCustomFont.placeholderLabel.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
multilineTextFieldCustomFont.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
|
|
scrollView.addSubview(unstyledMultilineTextField)
|
|
unstyledMultilineTextField.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
unstyledMultilineTextField.placeholder =
|
|
"This multi-line text field has no controller (unstyled)"
|
|
unstyledMultilineTextField.leadingUnderlineLabel.text = "Leading label"
|
|
unstyledMultilineTextField.trailingUnderlineLabel.text = "Trailing label"
|
|
unstyledMultilineTextField.textView?.delegate = self
|
|
|
|
return [multilineTextFieldControllerUnderlineTrailingView,
|
|
multilineTextFieldControllerUnderlineCustomFont]
|
|
}
|
|
|
|
@objc func tapDidTouch(sender: Any) {
|
|
self.view.endEditing(true)
|
|
}
|
|
|
|
@objc func errorSwitchDidChange(errorSwitch: UISwitch) {
|
|
allInputControllers.forEach { controller in
|
|
if errorSwitch.isOn {
|
|
controller.setErrorText("Uh oh! Try something else.", errorAccessibilityValue: nil)
|
|
} else {
|
|
controller.setErrorText(nil, errorAccessibilityValue: nil)
|
|
}
|
|
}
|
|
}
|
|
|
|
@objc func helperSwitchDidChange(helperSwitch: UISwitch) {
|
|
allInputControllers.forEach { controller in
|
|
controller.setHelperText(helperSwitch.isOn ? "This is helper text." : nil,
|
|
helperAccessibilityLabel: helperSwitch.isOn ? "This is accessible helper text." : nil)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
extension TextFieldKitchenSinkSwiftExample: UITextFieldDelegate {
|
|
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
|
textField.resignFirstResponder()
|
|
return false
|
|
}
|
|
|
|
func textFieldShouldClear(_ textField: UITextField) -> Bool {
|
|
for controller in allTextFieldControllers {
|
|
if textField == controller.textInput {
|
|
controller.setErrorText(nil, errorAccessibilityValue: nil)
|
|
return true
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func textField(_ textField: UITextField,
|
|
shouldChangeCharactersIn range: NSRange,
|
|
replacementString string: String) -> Bool {
|
|
for controller in allTextFieldControllers {
|
|
if textField == controller.textInput {
|
|
let finishedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
|
|
|
|
if finishedString?.rangeOfCharacter(from: CharacterSet.letters.inverted) != nil {
|
|
controller.setErrorText("Only letters allowed.",
|
|
errorAccessibilityValue: "Error: Only letters allowed.")
|
|
} else {
|
|
controller.setErrorText(nil, errorAccessibilityValue: nil)
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
extension TextFieldKitchenSinkSwiftExample: UITextViewDelegate {
|
|
func textViewDidChange(_ textView: UITextView) {
|
|
print(textView.text)
|
|
}
|
|
}
|
|
|
|
extension TextFieldKitchenSinkSwiftExample {
|
|
@objc func contentSizeCategoryDidChange(notif: Notification) {
|
|
controlLabel.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
singleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
|
|
errorLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
|
|
helperLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
|
|
}
|
|
}
|