iOS 13 style segmented control

iPad UI improvements
This commit is contained in:
Ilya Laktyushin
2019-09-07 09:13:07 +03:00
parent e99a9e8d99
commit c8837e04f8
52 changed files with 1483 additions and 265 deletions

View File

@@ -12,6 +12,7 @@ import MergeLists
import AccountContext
import GalleryUI
import ChatListSearchItemHeader
import SegmentedControlNode
private struct WebSearchContextResultStableId: Hashable {
let result: ChatContextResult
@@ -135,7 +136,7 @@ class WebSearchControllerNode: ASDisplayNode {
private let segmentedBackgroundNode: ASDisplayNode
private let segmentedSeparatorNode: ASDisplayNode
private let segmentedControl: UISegmentedControl
private let segmentedControlNode: SegmentedControlNode
private let toolbarBackgroundNode: ASDisplayNode
private let toolbarSeparatorNode: ASDisplayNode
@@ -189,8 +190,11 @@ class WebSearchControllerNode: ASDisplayNode {
self.segmentedBackgroundNode = ASDisplayNode()
self.segmentedSeparatorNode = ASDisplayNode()
self.segmentedControl = UISegmentedControl(items: [strings.WebSearch_Images, strings.WebSearch_GIFs])
self.segmentedControl.selectedSegmentIndex = 0
let items = [
strings.WebSearch_Images,
strings.WebSearch_GIFs
]
self.segmentedControlNode = SegmentedControlNode(theme: SegmentedControlTheme(theme: theme), items: items.map { SegmentedControlItem(title: $0) }, selectedIndex: 0)
self.toolbarBackgroundNode = ASDisplayNode()
self.toolbarSeparatorNode = ASDisplayNode()
@@ -221,7 +225,7 @@ class WebSearchControllerNode: ASDisplayNode {
self.addSubnode(self.segmentedBackgroundNode)
self.addSubnode(self.segmentedSeparatorNode)
if case .media = mode {
self.view.addSubview(self.segmentedControl)
self.addSubnode(self.segmentedControlNode)
}
self.addSubnode(self.toolbarBackgroundNode)
self.addSubnode(self.toolbarSeparatorNode)
@@ -230,7 +234,16 @@ class WebSearchControllerNode: ASDisplayNode {
self.addSubnode(self.attributionNode)
self.addSubnode(self.badgeNode)
self.segmentedControl.addTarget(self, action: #selector(self.indexChanged), for: .valueChanged)
self.segmentedControlNode.selectedIndexChanged = { [weak self] index in
if let strongSelf = self, let scope = WebSearchScope(rawValue: Int32(index)) {
let _ = updateWebSearchSettingsInteractively(accountManager: strongSelf.context.sharedContext.accountManager) { _ -> WebSearchSettings in
return WebSearchSettings(scope: scope)
}.start()
strongSelf.requestUpdateInterfaceState(true) { current in
return current.withUpdatedScope(scope)
}
}
}
self.cancelButton.addTarget(self, action: #selector(self.cancelPressed), forControlEvents: .touchUpInside)
self.sendButton.addTarget(self, action: #selector(self.sendPressed), forControlEvents: .touchUpInside)
@@ -334,7 +347,7 @@ class WebSearchControllerNode: ASDisplayNode {
self.segmentedBackgroundNode.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
self.segmentedSeparatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor
self.segmentedControl.tintColor = self.theme.rootController.navigationBar.accentTextColor
self.segmentedControlNode.updateTheme(SegmentedControlTheme(theme: self.theme))
self.toolbarBackgroundNode.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
self.toolbarSeparatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor
@@ -358,16 +371,14 @@ class WebSearchControllerNode: ASDisplayNode {
var insets = layout.insets(options: [.input])
insets.top += navigationBarHeight
let segmentedHeight: CGFloat = self.segmentedControl.superview != nil ? 44.0 : 5.0
let segmentedHeight: CGFloat = self.segmentedControlNode.supernode != nil ? 44.0 : 5.0
let panelY: CGFloat = insets.top - UIScreenPixel - 4.0
transition.updateFrame(node: self.segmentedBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelY), size: CGSize(width: layout.size.width, height: segmentedHeight)))
transition.updateFrame(node: self.segmentedSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelY + segmentedHeight), size: CGSize(width: layout.size.width, height: UIScreenPixel)))
var controlSize = self.segmentedControl.sizeThatFits(layout.size)
controlSize.width = layout.size.width - layout.safeInsets.left - layout.safeInsets.right - 10.0 * 2.0
transition.updateFrame(view: self.segmentedControl, frame: CGRect(origin: CGPoint(x: layout.safeInsets.left + floor((layout.size.width - layout.safeInsets.left - layout.safeInsets.right - controlSize.width) / 2.0), y: panelY + 5.0), size: controlSize))
let controlSize = self.segmentedControlNode.updateLayout(.stretchToFill(width: layout.size.width - layout.safeInsets.left - layout.safeInsets.right - 10.0 * 2.0), transition: transition)
transition.updateFrame(node: self.segmentedControlNode, frame: CGRect(origin: CGPoint(x: layout.safeInsets.left + floor((layout.size.width - layout.safeInsets.left - layout.safeInsets.right - controlSize.width) / 2.0), y: panelY + 5.0), size: controlSize))
insets.top -= 4.0
@@ -471,7 +482,7 @@ class WebSearchControllerNode: ASDisplayNode {
self.webSearchInterfaceStatePromise.set(self.webSearchInterfaceState)
if let state = interfaceState.state {
self.segmentedControl.selectedSegmentIndex = Int(state.scope.rawValue)
self.segmentedControlNode.selectedIndex = Int(state.scope.rawValue)
}
if let validLayout = self.containerLayout {
@@ -656,17 +667,6 @@ class WebSearchControllerNode: ASDisplayNode {
}
}
@objc private func indexChanged() {
if let scope = WebSearchScope(rawValue: Int32(self.segmentedControl.selectedSegmentIndex)) {
let _ = updateWebSearchSettingsInteractively(accountManager: self.context.sharedContext.accountManager) { _ -> WebSearchSettings in
return WebSearchSettings(scope: scope)
}.start()
self.requestUpdateInterfaceState(true) { current in
return current.withUpdatedScope(scope)
}
}
}
@objc private func cancelPressed() {
self.cancel?()
}