Skip to content

Commit 03c6710

Browse files
committed
update ios 26 button styles
1 parent 9de5461 commit 03c6710

8 files changed

Lines changed: 89 additions & 14 deletions

File tree

FlowCrypt/Controllers/Attachment/AttachmentViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ final class AttachmentViewController: UIViewController {
116116
let imageConfiguration = UIImage.SymbolConfiguration(font: .systemFont(ofSize: 24, weight: .light))
117117
let image = UIImage(systemName: "square.and.arrow.down", withConfiguration: imageConfiguration)
118118

119-
navigationItem.rightBarButtonItem = NavigationBarItemsView(
119+
navigationItem.setRightNavigationBarItems(
120120
with: [
121121
NavigationBarItemsView.Input(
122122
image: image?.tinted(.gray),

FlowCrypt/Controllers/Compose/Extensions/ComposeViewController+Setup.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ extension ComposeViewController {
3535
) { [weak self] in
3636
self?.handleSendTap()
3737
}
38-
navigationItem.rightBarButtonItem = NavigationBarItemsView(
38+
navigationItem.setRightNavigationBarItems(
3939
with: [deleteButton, helpButton, attachmentButton, sendButton]
4040
)
4141
}

FlowCrypt/Controllers/Inbox/InboxViewController.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ class InboxViewController: ViewController {
4242
inboxInput.isNotEmpty && (["SPAM", "TRASH"].contains(viewModel.path))
4343
}
4444

45-
var path: String { viewModel.path }
45+
var path: String {
46+
viewModel.path
47+
}
4648

4749
// Search related variables
4850
private var isSearch = false
@@ -161,9 +163,9 @@ extension InboxViewController {
161163
}
162164
}
163165

164-
@objc public func setupNavigationBar() {
166+
@objc func setupNavigationBar() {
165167
navigationItem.setAccessibility(id: inboxTitle)
166-
navigationItem.rightBarButtonItem = NavigationBarItemsView(
168+
navigationItem.setRightNavigationBarItems(
167169
with: [
168170
NavigationBarItemsView.Input(
169171
image: UIImage(systemName: "questionmark.circle"),
@@ -194,7 +196,7 @@ extension InboxViewController {
194196
actions.append(selectedUnread ? .markAsRead : .markAsUnread)
195197

196198
let items = actions.map { createNavigationBarButton(action: $0) }
197-
navigationItem.rightBarButtonItem = NavigationBarItemsView(with: items)
199+
navigationItem.setRightNavigationBarItems(with: items)
198200
navigationItem.leftBarButtonItem = .defaultBackButton { [weak self] in
199201
guard let self else { return }
200202
resetSelectedThreads()

FlowCrypt/Controllers/Settings/Contacts/Contacts List/ContactDetailViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class ContactDetailViewController: TableNodeViewController {
5757
}
5858

5959
private func setupNavigationBarItems() {
60-
navigationItem.rightBarButtonItem = NavigationBarItemsView(
60+
navigationItem.setRightNavigationBarItems(
6161
with: [
6262
.init(
6363
image: UIImage(systemName: "trash"),

FlowCrypt/Controllers/Settings/Contacts/Contacts List/ContactKeyDetailViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ final class ContactKeyDetailViewController: TableNodeViewController {
5454
}
5555

5656
private func setupNavigationBarItems() {
57-
navigationItem.rightBarButtonItem = NavigationBarItemsView(
57+
navigationItem.setRightNavigationBarItems(
5858
with: [
5959
.init(
6060
image: UIImage(named: "share"), accessibilityId: "aid-share-btn"

FlowCrypt/Controllers/Threads/Extensions/MessageActionsHandler.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ extension MessageActionsHandler where Self: UIViewController {
6767
}
6868

6969
let items = [helpButton] + actions.map { createNavigationBarButton(action: $0) }
70-
navigationItem.rightBarButtonItem = NavigationBarItemsView(with: items)
70+
navigationItem.setRightNavigationBarItems(with: items)
7171
}
7272

7373
private func createNavigationBarButton(action: MessageAction) -> NavigationBarItemsView.Input {

FlowCryptUI/Nodes/AddButtonNode.swift

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,64 @@
77
//
88

99
import AsyncDisplayKit
10+
import UIKit
1011

1112
public final class AddButtonNode: ASButtonNode {
1213
private var onTap: (() -> Void)?
14+
private var identifier: String?
15+
16+
override public init() {
17+
super.init()
18+
setViewBlock { UIButton(type: .system) }
19+
}
1320

1421
public init(identifier: String, _ action: (() -> Void)?) {
22+
self.identifier = identifier
1523
super.init()
24+
25+
setViewBlock { UIButton(type: .system) }
1626
onTap = action
17-
backgroundColor = .main
18-
accessibilityIdentifier = identifier
19-
setTitle("+", with: .boldSystemFont(ofSize: 30), with: .white, for: .normal)
20-
addTarget(self, action: #selector(onButtonTap), forControlEvents: .touchUpInside)
2127
frame.size = CGSize(width: .addButtonSize, height: .addButtonSize)
22-
cornerRadius = .addButtonSize / 2
28+
}
29+
30+
override public func didLoad() {
31+
super.didLoad()
32+
33+
guard let button = view as? UIButton else { return }
34+
button.accessibilityIdentifier = identifier
35+
button.isAccessibilityElement = true
36+
button.addTarget(self, action: #selector(onButtonTap), for: .touchUpInside)
37+
38+
if #available(iOS 26.0, *) {
39+
configureGlassButton(button)
40+
} else {
41+
configureLegacyButton(button)
42+
}
2343
}
2444

2545
@objc private func onButtonTap() {
2646
onTap?()
2747
}
48+
49+
@available(iOS 26.0, *)
50+
private func configureGlassButton(_ button: UIButton) {
51+
var configuration = UIButton.Configuration.glass()
52+
configuration.buttonSize = .medium
53+
configuration.cornerStyle = .capsule
54+
configuration.image = UIImage(systemName: "plus")
55+
configuration.preferredSymbolConfigurationForImage = .init(
56+
pointSize: 24,
57+
weight: .semibold
58+
)
59+
60+
button.configuration = configuration
61+
}
62+
63+
private func configureLegacyButton(_ button: UIButton) {
64+
button.backgroundColor = .main
65+
button.layer.cornerRadius = .addButtonSize / 2
66+
button.setTitle("+", for: .normal)
67+
button.setTitleColor(.white, for: .normal)
68+
button.titleLabel?.font = .boldSystemFont(ofSize: 30)
69+
}
2870
}

FlowCryptUI/Views/NavigationBarItemsView.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public final class NavigationBarItemsView: UIBarButtonItem {
4141
self.input = input
4242
super.init()
4343

44+
if #available(iOS 26.0, *), input.count == 1 {
45+
configureNativeBarButtonItem(with: input[0])
46+
return
47+
}
48+
4449
let buttons = input.enumerated()
4550
.map { value in
4651
UIButton(type: .system).then {
@@ -78,4 +83,30 @@ public final class NavigationBarItemsView: UIBarButtonItem {
7883
@objc private func handleTap(with button: UIButton) {
7984
input[button.tag].onTap?()
8085
}
86+
87+
@objc private func handleNativeTap() {
88+
input.first?.onTap?()
89+
}
90+
91+
@available(iOS 26.0, *)
92+
private func configureNativeBarButtonItem(with input: Input) {
93+
image = input.image
94+
title = input.title
95+
accessibilityIdentifier = input.accessibilityId
96+
isAccessibilityElement = true
97+
target = self
98+
action = #selector(handleNativeTap)
99+
}
100+
}
101+
102+
public extension UINavigationItem {
103+
func setRightNavigationBarItems(with input: [NavigationBarItemsView.Input]) {
104+
if #available(iOS 26.0, *) {
105+
rightBarButtonItems = input
106+
.reversed()
107+
.map { NavigationBarItemsView(with: [$0]) }
108+
} else {
109+
rightBarButtonItem = NavigationBarItemsView(with: input)
110+
}
111+
}
81112
}

0 commit comments

Comments
 (0)