@@ -28,10 +28,15 @@ public class InputFieldView: UIView {
2828
2929 public var title : String ?
3030 public var text : String ?
31+
32+ /// Custom left image.
3133 public var leftImage : UIImage ?
3234
33- /// Custom right button. This will be ignored when input field is secure.
34- public var rightButton : UIButton ?
35+ /// Custom left view. This will be ignored when `leftImage` property is set.
36+ public var leftView : UIView ?
37+
38+ /// Custom right view. This will be ignored when input field is secure.
39+ public var rightView : UIView ?
3540 public var placeholder : String ?
3641 public var hint : String ?
3742 public var traits : InputFieldTraits ?
@@ -40,15 +45,17 @@ public class InputFieldView: UIView {
4045 title: String ? = nil ,
4146 text: String ? = nil ,
4247 leftImage: UIImage ? = nil ,
43- rightButton: UIButton ? = nil ,
48+ leftView: UIView ? = nil ,
49+ rightView: UIView ? = nil ,
4450 placeholder: String ? = nil ,
4551 hint: String ? = nil ,
4652 traits: InputFieldTraits ? = nil
4753 ) {
4854 self . title = title
4955 self . text = text
5056 self . leftImage = leftImage
51- self . rightButton = rightButton
57+ self . leftView = leftView
58+ self . rightView = rightView
5259 self . placeholder = placeholder
5360 self . hint = hint
5461 self . traits = traits
@@ -82,7 +89,7 @@ public class InputFieldView: UIView {
8289
8390 private let contentView = UIView ( )
8491
85- private let leftImageView = UIImageView ( ) . then {
92+ private let leftContainerImageView = UIImageView ( ) . then {
8693 $0. contentMode = . scaleAspectFit
8794 $0. setContentHuggingPriority ( . defaultHigh, for: . horizontal)
8895 }
@@ -92,7 +99,12 @@ public class InputFieldView: UIView {
9299 $0. setContentHuggingPriority ( . defaultLow, for: . horizontal)
93100 }
94101
102+ private let rightView = UIView ( ) . then {
103+ $0. setContentHuggingPriority ( . defaultHigh, for: . horizontal)
104+ }
105+
95106 private lazy var eyeButton = UIButton ( ) . then {
107+ $0. translatesAutoresizingMaskIntoConstraints = false
96108 $0. setContentCompressionResistancePriority ( . defaultHigh, for: . horizontal)
97109 $0. setContentHuggingPriority ( . defaultHigh, for: . horizontal)
98110 }
@@ -332,7 +344,7 @@ private extension InputFieldView {
332344 verticalStackView. addArrangedSubview ( $0)
333345 }
334346
335- [ leftImageView , textField] . forEach {
347+ [ leftContainerImageView , textField, rightView ] . forEach {
336348 horizontalStackView. addArrangedSubview ( $0)
337349 }
338350
@@ -457,6 +469,66 @@ private extension InputFieldView {
457469
458470}
459471
472+ // MARK: - Internal
473+
474+ internal extension InputFieldView {
475+
476+ func setupCustomLeftView( leftImage: UIImage ? , leftView: UIView ? ) {
477+ /// Left view/image
478+ leftContainerImageView. subviews. forEach { $0. removeFromSuperview ( ) }
479+ leftContainerImageView. image = nil
480+
481+ if let leftImage {
482+ leftContainerImageView. image = leftImage
483+ leftContainerImageView. isHidden = false
484+ } else if let leftView {
485+ leftContainerImageView. isHidden = false
486+ leftContainerImageView. addSubview ( leftView)
487+
488+ leftView. translatesAutoresizingMaskIntoConstraints = false
489+ leftView. setContentHuggingPriority ( . defaultHigh, for: . horizontal)
490+ NSLayoutConstraint . activate ( [
491+ leftView. topAnchor. constraint ( equalTo: leftContainerImageView. topAnchor) ,
492+ leftView. leadingAnchor. constraint ( equalTo: leftContainerImageView. leadingAnchor) ,
493+ leftView. trailingAnchor. constraint ( equalTo: leftContainerImageView. trailingAnchor) ,
494+ leftView. bottomAnchor. constraint ( equalTo: leftContainerImageView. bottomAnchor)
495+ ] )
496+ } else {
497+ leftContainerImageView. isHidden = true
498+ }
499+ }
500+
501+ func setupCustomRightView( rightView rightSubview: UIView ? ) {
502+ /// Right view
503+ if let rightSubview, !isSecureTextEntry {
504+ rightView. subviews. forEach { $0. removeFromSuperview ( ) }
505+ rightView. addSubview ( rightSubview)
506+
507+ rightSubview. translatesAutoresizingMaskIntoConstraints = false
508+ rightSubview. setContentHuggingPriority ( . defaultHigh, for: . horizontal)
509+ NSLayoutConstraint . activate ( [
510+ rightSubview. topAnchor. constraint ( equalTo: rightView. topAnchor) ,
511+ rightSubview. leadingAnchor. constraint ( equalTo: rightView. leadingAnchor) ,
512+ rightSubview. trailingAnchor. constraint ( equalTo: rightView. trailingAnchor) ,
513+ rightSubview. bottomAnchor. constraint ( equalTo: rightView. bottomAnchor)
514+ ] )
515+ } else if isSecureTextEntry {
516+ rightView. subviews. forEach { $0. removeFromSuperview ( ) }
517+ rightView. addSubview ( eyeButton)
518+
519+ NSLayoutConstraint . activate ( [
520+ eyeButton. topAnchor. constraint ( equalTo: rightView. topAnchor) ,
521+ eyeButton. leadingAnchor. constraint ( equalTo: rightView. leadingAnchor) ,
522+ eyeButton. trailingAnchor. constraint ( equalTo: rightView. trailingAnchor) ,
523+ eyeButton. bottomAnchor. constraint ( equalTo: rightView. bottomAnchor)
524+ ] )
525+
526+ setupEyeButtonHandler ( )
527+ }
528+ }
529+
530+ }
531+
460532// MARK: - Public
461533
462534public extension InputFieldView {
@@ -492,26 +564,8 @@ public extension InputFieldView {
492564 setupTraits ( traits: model. traits ?? . default)
493565 setupToolbarIfNeeded ( traits: model. traits ?? . default)
494566
495- /// Left image
496- if let leftImage = model. leftImage {
497- leftImageView. image = leftImage
498- leftImageView. isHidden = false
499- } else {
500- leftImageView. isHidden = true
501- }
502-
503- /// Secure entry
504- if isSecureTextEntry {
505- setupEyeButtonHandler ( )
506- horizontalStackView. addArrangedSubview ( eyeButton)
507- }
508-
509- /// Right button
510- if let rightButton = model. rightButton, !isSecureTextEntry {
511- rightButton. setContentCompressionResistancePriority ( . defaultHigh, for: . horizontal)
512- rightButton. setContentHuggingPriority ( . defaultHigh, for: . horizontal)
513- horizontalStackView. addArrangedSubview ( rightButton)
514- }
567+ setupCustomLeftView ( leftImage: model. leftImage, leftView: model. leftView)
568+ setupCustomRightView ( rightView: model. rightView)
515569
516570 /// Input field title
517571 if let title = model. title {
0 commit comments