-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTextFieldExtension.swift
More file actions
178 lines (155 loc) · 5.08 KB
/
Copy pathTextFieldExtension.swift
File metadata and controls
178 lines (155 loc) · 5.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// Copyright © 2017 Kalpesh Talkar. 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.
//
// For support: https://gist.github.com/KalpeshTalkar/0ec476fd56de0c8caebc000ea4f17247
//
import UIKit
@IBDesignable
public class KTextField: UITextField {
// MARK: - IBInspectable properties
/// Applies border to the text view with the specified width
@IBInspectable public var borderWidth: CGFloat = 0.0 {
didSet {
layer.borderWidth = borderWidth
layer.borderColor = borderColor.cgColor
}
}
/// Sets the color of the border
@IBInspectable public var borderColor: UIColor = .clear {
didSet {
layer.borderColor = borderColor.cgColor
}
}
/// Make the corners rounded with the specified radius
@IBInspectable public var cornerRadius: CGFloat = 0.0 {
didSet {
layer.cornerRadius = cornerRadius
}
}
/// Applies underline to the text view with the specified width
@IBInspectable public var underLineWidth: CGFloat = 0.0 {
didSet {
updateUnderLineFrame()
}
}
/// Sets the underline color
@IBInspectable public var underLineColor: UIColor = .groupTableViewBackground {
didSet {
updateUnderLineUI()
}
}
/// Sets the placeholder color
@IBInspectable public var placeholderColor: UIColor = .lightGray {
didSet {
let placeholderStr = placeholder ?? ""
attributedPlaceholder = NSAttributedString(string: placeholderStr, attributes: [NSForegroundColorAttributeName: placeholderColor])
}
}
public override var placeholder: String? {
didSet {
let placeholderStr = placeholder ?? ""
attributedPlaceholder = NSAttributedString(string: placeholderStr, attributes: [NSForegroundColorAttributeName: placeholderColor])
}
}
/// Sets left margin
@IBInspectable public var leftMargin: CGFloat = 10.0 {
didSet {
setMargins()
}
}
/// Sets right margin
@IBInspectable public var rightMargin: CGFloat = 10.0 {
didSet {
setMargins()
}
}
// MARK: - init methods
override public init(frame: CGRect) {
super.init(frame: frame)
applyStyles()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
applyStyles()
}
// MARK: - Layout
override public func layoutSubviews() {
super.layoutSubviews()
updateUnderLineFrame()
updateAccessoryViewFrame()
}
// MARK: - Styles
private func applyStyles() {
applyUnderLine()
setMargins()
}
// MARK: - Underline
private var underLineLayer = CALayer()
private func applyUnderLine() {
// Apply underline only if the text view's has no borders
if borderStyle == UITextBorderStyle.none {
underLineLayer.removeFromSuperlayer()
updateUnderLineFrame()
updateUnderLineUI()
layer.addSublayer(underLineLayer)
layer.masksToBounds = true
}
}
private func updateUnderLineFrame() {
var rect = bounds
rect.origin.y = bounds.height - underLineWidth
rect.size.height = underLineWidth
underLineLayer.frame = rect
}
private func updateUnderLineUI() {
underLineLayer.backgroundColor = underLineColor.cgColor
}
// MARK: - Margins
private var leftAcessoryView = UIView()
private var rightAcessoryView = UIView()
private func setMargins() {
// Left Margin
leftView = nil
leftViewMode = .never
if leftMargin > 0 {
if nil == leftView {
leftAcessoryView.backgroundColor = .clear
leftView = leftAcessoryView
leftViewMode = .always
}
}
updateAccessoryViewFrame()
// Right Margin
rightView = nil
rightViewMode = .never
if rightMargin > 0 {
if nil == rightView {
rightAcessoryView.backgroundColor = .clear
rightView = rightAcessoryView
rightViewMode = .always
}
updateAccessoryViewFrame()
}
}
private func updateAccessoryViewFrame() {
// Left View Frame
var leftRect = bounds
leftRect.size.width = leftMargin
leftAcessoryView.frame = leftRect
// Right View Frame
var rightRect = bounds
rightRect.size.width = rightMargin
rightAcessoryView.frame = rightRect
}
}