Skip to content

Commit 1a6cfc7

Browse files
author
Leon Keijzer
committed
Add left button
1 parent a5ed071 commit 1a6cfc7

File tree

2 files changed

+99
-31
lines changed

2 files changed

+99
-31
lines changed

Examples/Examples/ViewController.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@ class ViewController: MessageViewController, UITableViewDataSource, UITableViewD
2525

2626
borderColor = .lightGray
2727

28+
messageView.set(buttonTitle: "A", for: .normal, type: .left)
29+
messageView.
30+
2831
messageView.inset = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
2932
messageView.textView.placeholderText = "New message..."
3033
messageView.textView.placeholderTextColor = .lightGray
3134
messageView.font = UIFont.systemFont(ofSize: 17)
3235

33-
messageView.set(buttonTitle: "Send", for: .normal)
34-
messageView.addButton(target: self, action: #selector(onButton))
35-
messageView.buttonTint = .blue
36+
// messageView.set(buttonTitle: "Send", for: .normal)
37+
// messageView.addButton(target: self, action: #selector(onButton))
38+
// messageView.buttonTint = .blue
3639

3740
messageAutocompleteController.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
3841
messageAutocompleteController.tableView.dataSource = self

MessageViewController/MessageView.swift

Lines changed: 93 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,34 @@ public final class MessageView: UIView, MessageTextViewListener {
1313
public let textView = MessageTextView()
1414

1515
internal weak var delegate: MessageViewDelegate?
16-
internal let button = UIButton()
16+
internal let leftButton = UIButton()
17+
internal let rightButton = UIButton()
1718
internal let UITextViewContentSizeKeyPath = #keyPath(UITextView.contentSize)
1819
internal let topBorderLayer = CALayer()
1920
internal var contentView: UIView?
20-
internal var buttonAction: Selector?
21+
internal var leftButtonAction: Selector?
22+
internal var rightButtonAction: Selector?
23+
24+
public enum buttonType {
25+
case left
26+
case right
27+
}
2128

2229
internal override init(frame: CGRect) {
2330
super.init(frame: frame)
2431

2532
backgroundColor = .white
2633

34+
addSubview(leftButton)
2735
addSubview(textView)
28-
addSubview(button)
36+
addSubview(rightButton)
2937
layer.addSublayer(topBorderLayer)
3038

39+
//Set action button
40+
leftButton.imageEdgeInsets = .zero
41+
leftButton.titleEdgeInsets = .zero
42+
leftButton.contentEdgeInsets = .zero
43+
3144
// setup text view
3245
textView.contentInset = .zero
3346
textView.textContainerInset = .zero
@@ -47,9 +60,9 @@ public final class MessageView: UIView, MessageTextViewListener {
4760
textView.layoutManager.usesFontLeading = true
4861

4962
// setup send button
50-
button.titleEdgeInsets = .zero
51-
button.contentEdgeInsets = .zero
52-
button.imageEdgeInsets = .zero
63+
rightButton.imageEdgeInsets = .zero
64+
rightButton.titleEdgeInsets = .zero
65+
rightButton.contentEdgeInsets = .zero
5366

5467
updateEmptyTextStates()
5568
}
@@ -92,22 +105,62 @@ public final class MessageView: UIView, MessageTextViewListener {
92105
didSet { setNeedsLayout() }
93106
}
94107

95-
public func set(buttonIcon: UIImage?, for state: UIControlState) {
96-
button.setImage(buttonIcon, for: state)
108+
public func set(buttonIcon: UIImage?, for state: UIControlState, type: buttonType) {
109+
switch type {
110+
case .left:
111+
setLeft(buttonIcon: buttonIcon, for: state)
112+
break
113+
case .right:
114+
setRight(buttonIcon: buttonIcon, for: state)
115+
break
116+
}
117+
}
118+
119+
public func set(buttonTitle: String, for state: UIControlState, type: buttonType) {
120+
switch type {
121+
case .left:
122+
setLeft(buttonTitle: buttonTitle, for: state)
123+
break
124+
case .right:
125+
setRight(buttonTitle: buttonTitle, for: state)
126+
break
127+
}
128+
}
129+
130+
private func setLeft(buttonIcon: UIImage?, for state: UIControlState) {
131+
leftButton.setImage(buttonIcon, for: state)
97132
buttonLayoutDidChange()
98133
}
99134

100-
public func set(buttonTitle: String, for state: UIControlState) {
101-
button.setTitle(buttonTitle, for: state)
135+
private func setLeft(buttonTitle: String, for state: UIControlState) {
136+
leftButton.setTitle(buttonTitle, for: state)
102137
buttonLayoutDidChange()
103138
}
104139

105-
public var buttonTint: UIColor {
106-
get { return button.tintColor }
140+
private func setRight(buttonIcon: UIImage?, for state: UIControlState) {
141+
rightButton.setImage(buttonIcon, for: state)
142+
buttonLayoutDidChange()
143+
}
144+
145+
private func setRight(buttonTitle: String, for state: UIControlState) {
146+
rightButton.setTitle(buttonTitle, for: state)
147+
buttonLayoutDidChange()
148+
}
149+
150+
public var leftButtonTint: UIColor {
151+
get { return leftButton.tintColor }
152+
set {
153+
leftButton.tintColor = newValue
154+
leftButton.setTitleColor(newValue, for: .normal)
155+
leftButton.imageView?.tintColor = newValue
156+
}
157+
}
158+
public var rightButtonTint: UIColor {
159+
get { return rightButton.tintColor }
107160
set {
108-
button.tintColor = newValue
109-
button.setTitleColor(newValue, for: .normal)
110-
button.imageView?.tintColor = newValue
161+
rightButton.tintColor = newValue
162+
rightButton.setTitleColor(newValue, for: .normal)
163+
rightButton.imageView?.tintColor = newValue
111164
}
112165
}
113166

@@ -132,12 +185,12 @@ public final class MessageView: UIView, MessageTextViewListener {
132185
}
133186

134187
public func addButton(target: Any, action: Selector) {
135-
button.addTarget(target, action: action, for: .touchUpInside)
136-
buttonAction = action
188+
rightButton.addTarget(target, action: action, for: .touchUpInside)
189+
rightButtonAction = action
137190
}
138191

139192
public override var keyCommands: [UIKeyCommand]? {
140-
guard let action = buttonAction else { return nil }
193+
guard let action = rightButtonAction else { return nil }
141194
return [UIKeyCommand(input: "\r", modifierFlags: .command, action: action)]
142195
}
143196

@@ -161,23 +214,34 @@ public final class MessageView: UIView, MessageTextViewListener {
161214
)
162215
let insetBounds = UIEdgeInsetsInsetRect(safeBounds, inset)
163216

164-
let buttonSize = button.bounds.size
217+
let leftButtonSize = leftButton.bounds.size
218+
let rightButtonSize = rightButton.bounds.size
219+
220+
// adjust by bottom offset so content is flush w/ text view
221+
let leftButtonFrame = CGRect(
222+
x: insetBounds.minX,
223+
y: insetBounds.minY,
224+
width: leftButtonSize.width,
225+
height: leftButtonSize.height
226+
)
227+
leftButton.frame = leftButtonFrame
165228

166229
let textViewFrame = CGRect(
167-
x: insetBounds.minX,
230+
x: leftButtonFrame.maxX + buttonLeftInset,
168231
y: insetBounds.minY,
169-
width: insetBounds.width - buttonSize.width - buttonLeftInset,
232+
width: insetBounds.width - leftButtonSize.width - buttonLeftInset - rightButtonSize.width,
170233
height: textViewHeight
171234
)
172235
textView.frame = textViewFrame
173236

174237
// adjust by bottom offset so content is flush w/ text view
175-
button.frame = CGRect(
238+
let rightButtonFrame = CGRect(
176239
x: textViewFrame.maxX + buttonLeftInset,
177-
y: textViewFrame.maxY - buttonSize.height + button.bottomHeightOffset,
178-
width: buttonSize.width,
179-
height: buttonSize.height
240+
y: textViewFrame.maxY - rightButtonSize.height + rightButton.bottomHeightOffset,
241+
width: rightButtonSize.width,
242+
height: rightButtonSize.height
180243
)
244+
rightButton.frame = rightButtonFrame
181245

182246
let contentY = textViewFrame.maxY + inset.bottom
183247
contentView?.frame = CGRect(
@@ -217,12 +281,13 @@ public final class MessageView: UIView, MessageTextViewListener {
217281

218282
internal func updateEmptyTextStates() {
219283
let isEmpty = text.isEmpty
220-
button.isEnabled = !isEmpty
221-
button.alpha = isEmpty ? 0.25 : 1
284+
rightButton.isEnabled = !isEmpty
285+
rightButton.alpha = isEmpty ? 0.25 : 1
222286
}
223287

224288
internal func buttonLayoutDidChange() {
225-
button.sizeToFit()
289+
leftButton.sizeToFit()
290+
rightButton.sizeToFit()
226291
setNeedsLayout()
227292
}
228293

0 commit comments

Comments
 (0)