mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Voice Chat UI fixes
This commit is contained in:
parent
7e769a725c
commit
d2229c6192
@ -5994,3 +5994,7 @@ Sorry for the inconvenience.";
|
|||||||
"Call.VoiceChatInProgressMessageCall" = "Leave voice chat in %1$@ and start a call with %2$@?";
|
"Call.VoiceChatInProgressMessageCall" = "Leave voice chat in %1$@ and start a call with %2$@?";
|
||||||
|
|
||||||
"Conversation.Dice.u1F3B3" = "Send a bowling emoji to try your luck.";
|
"Conversation.Dice.u1F3B3" = "Send a bowling emoji to try your luck.";
|
||||||
|
|
||||||
|
"VoiceOver.Common.TapToChange" = "Tap To Change";
|
||||||
|
"VoiceOver.Common.On" = "On";
|
||||||
|
"VoiceOver.Common.Off" = "Off";
|
||||||
|
@ -2,6 +2,10 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
import AsyncDisplayKit
|
import AsyncDisplayKit
|
||||||
|
|
||||||
|
public protocol AccessibilityFocusableNode {
|
||||||
|
func accessibilityElementDidBecomeFocused()
|
||||||
|
}
|
||||||
|
|
||||||
public final class AccessibilityAreaNode: ASDisplayNode {
|
public final class AccessibilityAreaNode: ASDisplayNode {
|
||||||
public var activate: (() -> Bool)?
|
public var activate: (() -> Bool)?
|
||||||
public var focused: (() -> Void)?
|
public var focused: (() -> Void)?
|
||||||
@ -27,7 +31,7 @@ public final class AccessibilityAreaNode: ASDisplayNode {
|
|||||||
var supernode = self.supernode
|
var supernode = self.supernode
|
||||||
while true {
|
while true {
|
||||||
if let supernodeValue = supernode {
|
if let supernodeValue = supernode {
|
||||||
if let listItemNode = supernodeValue as? ListViewItemNode {
|
if let listItemNode = supernodeValue as? AccessibilityFocusableNode {
|
||||||
listItemNode.accessibilityElementDidBecomeFocused()
|
listItemNode.accessibilityElementDidBecomeFocused()
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,7 +83,7 @@ public struct ListViewItemLayoutParams {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class ListViewItemNode: ASDisplayNode {
|
open class ListViewItemNode: ASDisplayNode, AccessibilityFocusableNode {
|
||||||
let rotated: Bool
|
let rotated: Bool
|
||||||
final var index: Int?
|
final var index: Int?
|
||||||
|
|
||||||
|
@ -39,6 +39,8 @@ public final class ToolbarNode: ASDisplayNode {
|
|||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
self.isAccessibilityContainer = false
|
||||||
|
|
||||||
self.addSubnode(self.leftTitle)
|
self.addSubnode(self.leftTitle)
|
||||||
self.addSubnode(self.leftButton)
|
self.addSubnode(self.leftButton)
|
||||||
self.addSubnode(self.rightTitle)
|
self.addSubnode(self.rightTitle)
|
||||||
@ -63,6 +65,7 @@ public final class ToolbarNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.leftButton.accessibilityTraits = .button
|
||||||
self.rightButton.addTarget(self, action: #selector(self.rightPressed), forControlEvents: .touchUpInside)
|
self.rightButton.addTarget(self, action: #selector(self.rightPressed), forControlEvents: .touchUpInside)
|
||||||
self.rightButton.highligthedChanged = { [weak self] highlighted in
|
self.rightButton.highligthedChanged = { [weak self] highlighted in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
@ -75,6 +78,7 @@ public final class ToolbarNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.rightButton.accessibilityTraits = .button
|
||||||
self.middleButton.addTarget(self, action: #selector(self.middlePressed), forControlEvents: .touchUpInside)
|
self.middleButton.addTarget(self, action: #selector(self.middlePressed), forControlEvents: .touchUpInside)
|
||||||
self.middleButton.highligthedChanged = { [weak self] highlighted in
|
self.middleButton.highligthedChanged = { [weak self] highlighted in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
@ -87,6 +91,7 @@ public final class ToolbarNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.middleButton.accessibilityTraits = .button
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateTheme(_ theme: TabBarControllerTheme) {
|
public func updateTheme(_ theme: TabBarControllerTheme) {
|
||||||
@ -100,8 +105,14 @@ public final class ToolbarNode: ASDisplayNode {
|
|||||||
let sideInset: CGFloat = 16.0
|
let sideInset: CGFloat = 16.0
|
||||||
|
|
||||||
self.leftTitle.attributedText = NSAttributedString(string: toolbar.leftAction?.title ?? "", font: Font.regular(17.0), textColor: (toolbar.leftAction?.isEnabled ?? false) ? self.theme.tabBarSelectedTextColor : self.theme.tabBarTextColor)
|
self.leftTitle.attributedText = NSAttributedString(string: toolbar.leftAction?.title ?? "", font: Font.regular(17.0), textColor: (toolbar.leftAction?.isEnabled ?? false) ? self.theme.tabBarSelectedTextColor : self.theme.tabBarTextColor)
|
||||||
|
self.leftButton.accessibilityLabel = toolbar.leftAction?.title
|
||||||
|
|
||||||
self.rightTitle.attributedText = NSAttributedString(string: toolbar.rightAction?.title ?? "", font: Font.regular(17.0), textColor: (toolbar.rightAction?.isEnabled ?? false) ? self.theme.tabBarSelectedTextColor : self.theme.tabBarTextColor)
|
self.rightTitle.attributedText = NSAttributedString(string: toolbar.rightAction?.title ?? "", font: Font.regular(17.0), textColor: (toolbar.rightAction?.isEnabled ?? false) ? self.theme.tabBarSelectedTextColor : self.theme.tabBarTextColor)
|
||||||
|
self.rightButton.accessibilityLabel = toolbar.rightAction?.title
|
||||||
|
|
||||||
self.middleTitle.attributedText = NSAttributedString(string: toolbar.middleAction?.title ?? "", font: Font.regular(17.0), textColor: (toolbar.middleAction?.isEnabled ?? false) ? self.theme.tabBarSelectedTextColor : self.theme.tabBarTextColor)
|
self.middleTitle.attributedText = NSAttributedString(string: toolbar.middleAction?.title ?? "", font: Font.regular(17.0), textColor: (toolbar.middleAction?.isEnabled ?? false) ? self.theme.tabBarSelectedTextColor : self.theme.tabBarTextColor)
|
||||||
|
self.middleButton.accessibilityLabel = toolbar.middleAction?.title
|
||||||
|
|
||||||
let leftSize = self.leftTitle.updateLayout(size)
|
let leftSize = self.leftTitle.updateLayout(size)
|
||||||
let rightSize = self.rightTitle.updateLayout(size)
|
let rightSize = self.rightTitle.updateLayout(size)
|
||||||
let middleSize = self.middleTitle.updateLayout(size)
|
let middleSize = self.middleTitle.updateLayout(size)
|
||||||
|
@ -251,8 +251,8 @@ public class ItemListSwitchItemNode: ListViewItemNode, ItemListItemNode {
|
|||||||
strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height))
|
strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height))
|
||||||
|
|
||||||
strongSelf.activateArea.accessibilityLabel = item.title
|
strongSelf.activateArea.accessibilityLabel = item.title
|
||||||
strongSelf.activateArea.accessibilityValue = item.value ? "On" : "Off"
|
strongSelf.activateArea.accessibilityValue = item.value ? item.presentationData.strings.VoiceOver_Common_On : item.presentationData.strings.VoiceOver_Common_Off
|
||||||
strongSelf.activateArea.accessibilityHint = "Tap to change"
|
strongSelf.activateArea.accessibilityHint = item.presentationData.strings.VoiceOver_Common_TapToChange
|
||||||
var accessibilityTraits = UIAccessibilityTraits()
|
var accessibilityTraits = UIAccessibilityTraits()
|
||||||
if item.enabled {
|
if item.enabled {
|
||||||
} else {
|
} else {
|
||||||
|
@ -150,7 +150,7 @@ public class ItemListTextItemNode: ListViewItemNode, ItemListItemNode {
|
|||||||
strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height))
|
strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height))
|
||||||
strongSelf.activateArea.accessibilityLabel = attributedText.string
|
strongSelf.activateArea.accessibilityLabel = attributedText.string
|
||||||
|
|
||||||
strongSelf.accessibilityLabel = attributedText.string
|
strongSelf.activateArea.accessibilityLabel = attributedText.string
|
||||||
|
|
||||||
let _ = titleApply()
|
let _ = titleApply()
|
||||||
|
|
||||||
|
@ -161,20 +161,24 @@ public final class PeerOnlineMarkerNode: ASDisplayNode {
|
|||||||
if animated {
|
if animated {
|
||||||
let initialScale: CGFloat = strongSelf.iconNode.isHidden ? 0.0 : CGFloat((strongSelf.iconNode.value(forKeyPath: "layer.presentationLayer.transform.scale.x") as? NSNumber)?.floatValue ?? 1.0)
|
let initialScale: CGFloat = strongSelf.iconNode.isHidden ? 0.0 : CGFloat((strongSelf.iconNode.value(forKeyPath: "layer.presentationLayer.transform.scale.x") as? NSNumber)?.floatValue ?? 1.0)
|
||||||
let targetScale: CGFloat = online ? 1.0 : 0.0
|
let targetScale: CGFloat = online ? 1.0 : 0.0
|
||||||
strongSelf.iconNode.isHidden = false
|
if initialScale != targetScale {
|
||||||
strongSelf.iconNode.layer.animateScale(from: initialScale, to: targetScale, duration: 0.2, removeOnCompletion: false, completion: { [weak self] finished in
|
strongSelf.iconNode.isHidden = false
|
||||||
if let strongSelf = self, finished {
|
strongSelf.iconNode.layer.animateScale(from: initialScale, to: targetScale, duration: 0.2, removeOnCompletion: false, completion: { [weak self] finished in
|
||||||
strongSelf.iconNode.isHidden = !online
|
if let strongSelf = self, finished {
|
||||||
|
strongSelf.iconNode.isHidden = !online
|
||||||
if let animationNode = strongSelf.animationNode, !online {
|
|
||||||
animationNode.removeFromSupernode()
|
if let animationNode = strongSelf.animationNode, !online {
|
||||||
|
strongSelf.animationNode = nil
|
||||||
|
animationNode.removeFromSupernode()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
}
|
||||||
} else {
|
} else {
|
||||||
strongSelf.iconNode.isHidden = !online
|
strongSelf.iconNode.isHidden = !online
|
||||||
|
|
||||||
if let animationNode = strongSelf.animationNode, !online {
|
if let animationNode = strongSelf.animationNode, !online {
|
||||||
|
strongSelf.animationNode = nil
|
||||||
animationNode.removeFromSupernode()
|
animationNode.removeFromSupernode()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ swift_library(
|
|||||||
"//submodules/AlertUI:AlertUI",
|
"//submodules/AlertUI:AlertUI",
|
||||||
"//submodules/DirectionalPanGesture:DirectionalPanGesture",
|
"//submodules/DirectionalPanGesture:DirectionalPanGesture",
|
||||||
"//submodules/PeerInfoUI:PeerInfoUI",
|
"//submodules/PeerInfoUI:PeerInfoUI",
|
||||||
|
"//submodules/AnimatedCountLabelNode:AnimatedCountLabelNode",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -9,6 +9,7 @@ import TelegramPresentationData
|
|||||||
import TelegramUIPreferences
|
import TelegramUIPreferences
|
||||||
import AccountContext
|
import AccountContext
|
||||||
import LegacyComponents
|
import LegacyComponents
|
||||||
|
import AnimatedCountLabelNode
|
||||||
|
|
||||||
private let blue = UIColor(rgb: 0x0078ff)
|
private let blue = UIColor(rgb: 0x0078ff)
|
||||||
private let lightBlue = UIColor(rgb: 0x59c7f8)
|
private let lightBlue = UIColor(rgb: 0x59c7f8)
|
||||||
|
@ -578,12 +578,15 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func playBlobsDisappearanceAnimation() {
|
private func playBlobsDisappearanceAnimation() {
|
||||||
|
CATransaction.begin()
|
||||||
|
CATransaction.setDisableActions(true)
|
||||||
self.foregroundCircleLayer.isHidden = false
|
self.foregroundCircleLayer.isHidden = false
|
||||||
|
CATransaction.commit()
|
||||||
|
|
||||||
self.updateGlowAndGradientAnimations(active: nil, previousActive: nil)
|
self.updateGlowAndGradientAnimations(active: nil, previousActive: nil)
|
||||||
|
|
||||||
self.maskBlobView.startAnimating()
|
self.maskBlobView.startAnimating()
|
||||||
self.maskBlobView.layer.animateScale(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak self] _ in
|
self.maskBlobView.layer.animateScale(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false, completion: { [weak self] _ in
|
||||||
self?.maskBlobView.isHidden = true
|
self?.maskBlobView.isHidden = true
|
||||||
self?.maskBlobView.stopAnimating()
|
self?.maskBlobView.stopAnimating()
|
||||||
self?.maskBlobView.layer.removeAllAnimations()
|
self?.maskBlobView.layer.removeAllAnimations()
|
||||||
@ -595,6 +598,7 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode {
|
|||||||
growthAnimation.toValue = 1.0
|
growthAnimation.toValue = 1.0
|
||||||
growthAnimation.duration = 0.15
|
growthAnimation.duration = 0.15
|
||||||
growthAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
growthAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
||||||
|
growthAnimation.isRemovedOnCompletion = false
|
||||||
|
|
||||||
CATransaction.setCompletionBlock {
|
CATransaction.setCompletionBlock {
|
||||||
CATransaction.begin()
|
CATransaction.begin()
|
||||||
@ -602,6 +606,7 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode {
|
|||||||
self.maskGradientLayer.isHidden = true
|
self.maskGradientLayer.isHidden = true
|
||||||
self.maskCircleLayer.isHidden = true
|
self.maskCircleLayer.isHidden = true
|
||||||
self.foregroundCircleLayer.isHidden = true
|
self.foregroundCircleLayer.isHidden = true
|
||||||
|
self.foregroundCircleLayer.removeAllAnimations()
|
||||||
CATransaction.commit()
|
CATransaction.commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -39,6 +39,7 @@ private final class PeerInfoScreenActionItemNode: PeerInfoScreenItemNode {
|
|||||||
private let iconNode: ASImageNode
|
private let iconNode: ASImageNode
|
||||||
private let textNode: ImmediateTextNode
|
private let textNode: ImmediateTextNode
|
||||||
private let bottomSeparatorNode: ASDisplayNode
|
private let bottomSeparatorNode: ASDisplayNode
|
||||||
|
private let activateArea: AccessibilityAreaNode
|
||||||
|
|
||||||
private var item: PeerInfoScreenActionItem?
|
private var item: PeerInfoScreenActionItem?
|
||||||
|
|
||||||
@ -57,6 +58,8 @@ private final class PeerInfoScreenActionItemNode: PeerInfoScreenItemNode {
|
|||||||
self.bottomSeparatorNode = ASDisplayNode()
|
self.bottomSeparatorNode = ASDisplayNode()
|
||||||
self.bottomSeparatorNode.isLayerBacked = true
|
self.bottomSeparatorNode.isLayerBacked = true
|
||||||
|
|
||||||
|
self.activateArea = AccessibilityAreaNode()
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
bringToFrontForHighlightImpl = { [weak self] in
|
bringToFrontForHighlightImpl = { [weak self] in
|
||||||
@ -66,6 +69,8 @@ private final class PeerInfoScreenActionItemNode: PeerInfoScreenItemNode {
|
|||||||
self.addSubnode(self.bottomSeparatorNode)
|
self.addSubnode(self.bottomSeparatorNode)
|
||||||
self.addSubnode(self.selectionNode)
|
self.addSubnode(self.selectionNode)
|
||||||
self.addSubnode(self.textNode)
|
self.addSubnode(self.textNode)
|
||||||
|
|
||||||
|
self.addSubnode(self.activateArea)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||||
@ -95,6 +100,7 @@ private final class PeerInfoScreenActionItemNode: PeerInfoScreenItemNode {
|
|||||||
|
|
||||||
self.textNode.maximumNumberOfLines = 1
|
self.textNode.maximumNumberOfLines = 1
|
||||||
self.textNode.attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: textColorValue)
|
self.textNode.attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: textColorValue)
|
||||||
|
self.activateArea.accessibilityLabel = item.text
|
||||||
|
|
||||||
let textSize = self.textNode.updateLayout(CGSize(width: width - (leftInset + rightInset), height: .greatestFiniteMagnitude))
|
let textSize = self.textNode.updateLayout(CGSize(width: width - (leftInset + rightInset), height: .greatestFiniteMagnitude))
|
||||||
|
|
||||||
@ -123,6 +129,8 @@ private final class PeerInfoScreenActionItemNode: PeerInfoScreenItemNode {
|
|||||||
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: separatorInset, y: height - UIScreenPixel), size: CGSize(width: width - separatorInset, height: UIScreenPixel)))
|
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: separatorInset, y: height - UIScreenPixel), size: CGSize(width: width - separatorInset, height: UIScreenPixel)))
|
||||||
transition.updateAlpha(node: self.bottomSeparatorNode, alpha: bottomItem == nil ? 0.0 : 1.0)
|
transition.updateAlpha(node: self.bottomSeparatorNode, alpha: bottomItem == nil ? 0.0 : 1.0)
|
||||||
|
|
||||||
|
self.activateArea.frame = CGRect(origin: CGPoint(x: safeInsets.left, y: 0.0), size: CGSize(width: width - safeInsets.left - safeInsets.right, height: height))
|
||||||
|
|
||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ final class PeerInfoScreenCommentItem: PeerInfoScreenItem {
|
|||||||
|
|
||||||
private final class PeerInfoScreenCommentItemNode: PeerInfoScreenItemNode {
|
private final class PeerInfoScreenCommentItemNode: PeerInfoScreenItemNode {
|
||||||
private let textNode: ImmediateTextNode
|
private let textNode: ImmediateTextNode
|
||||||
|
private let activateArea: AccessibilityAreaNode
|
||||||
|
|
||||||
private var item: PeerInfoScreenCommentItem?
|
private var item: PeerInfoScreenCommentItem?
|
||||||
|
|
||||||
@ -26,9 +27,13 @@ private final class PeerInfoScreenCommentItemNode: PeerInfoScreenItemNode {
|
|||||||
self.textNode.displaysAsynchronously = false
|
self.textNode.displaysAsynchronously = false
|
||||||
self.textNode.isUserInteractionEnabled = false
|
self.textNode.isUserInteractionEnabled = false
|
||||||
|
|
||||||
|
self.activateArea = AccessibilityAreaNode()
|
||||||
|
self.activateArea.accessibilityTraits = .staticText
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
self.addSubnode(self.textNode)
|
self.addSubnode(self.textNode)
|
||||||
|
self.addSubnode(self.activateArea)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||||
@ -43,6 +48,7 @@ private final class PeerInfoScreenCommentItemNode: PeerInfoScreenItemNode {
|
|||||||
|
|
||||||
self.textNode.maximumNumberOfLines = 0
|
self.textNode.maximumNumberOfLines = 0
|
||||||
self.textNode.attributedText = NSAttributedString(string: item.text, font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize), textColor: presentationData.theme.list.freeTextColor)
|
self.textNode.attributedText = NSAttributedString(string: item.text, font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize), textColor: presentationData.theme.list.freeTextColor)
|
||||||
|
self.activateArea.accessibilityLabel = item.text
|
||||||
|
|
||||||
let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0, height: .greatestFiniteMagnitude))
|
let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0, height: .greatestFiniteMagnitude))
|
||||||
|
|
||||||
@ -52,6 +58,8 @@ private final class PeerInfoScreenCommentItemNode: PeerInfoScreenItemNode {
|
|||||||
|
|
||||||
transition.updateFrame(node: self.textNode, frame: textFrame)
|
transition.updateFrame(node: self.textNode, frame: textFrame)
|
||||||
|
|
||||||
|
self.activateArea.frame = CGRect(origin: CGPoint(x: safeInsets.left, y: 0.0), size: CGSize(width: width - safeInsets.left - safeInsets.right, height: height))
|
||||||
|
|
||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
private let textNode: ImmediateTextNode
|
private let textNode: ImmediateTextNode
|
||||||
private let arrowNode: ASImageNode
|
private let arrowNode: ASImageNode
|
||||||
private let bottomSeparatorNode: ASDisplayNode
|
private let bottomSeparatorNode: ASDisplayNode
|
||||||
|
private let activateArea: AccessibilityAreaNode
|
||||||
|
|
||||||
private var item: PeerInfoScreenDisclosureItem?
|
private var item: PeerInfoScreenDisclosureItem?
|
||||||
|
|
||||||
@ -87,6 +88,8 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
self.bottomSeparatorNode = ASDisplayNode()
|
self.bottomSeparatorNode = ASDisplayNode()
|
||||||
self.bottomSeparatorNode.isLayerBacked = true
|
self.bottomSeparatorNode.isLayerBacked = true
|
||||||
|
|
||||||
|
self.activateArea = AccessibilityAreaNode()
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
bringToFrontForHighlightImpl = { [weak self] in
|
bringToFrontForHighlightImpl = { [weak self] in
|
||||||
@ -98,6 +101,7 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
self.addSubnode(self.labelNode)
|
self.addSubnode(self.labelNode)
|
||||||
self.addSubnode(self.textNode)
|
self.addSubnode(self.textNode)
|
||||||
self.addSubnode(self.arrowNode)
|
self.addSubnode(self.arrowNode)
|
||||||
|
self.addSubnode(self.activateArea)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||||
@ -180,6 +184,9 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
|
|
||||||
let labelBadgeNodeFrame = CGRect(origin: CGPoint(x: width - rightInset - badgeWidth, y: labelFrame.minY - 1.0), size: CGSize(width: badgeWidth, height: badgeDiameter))
|
let labelBadgeNodeFrame = CGRect(origin: CGPoint(x: width - rightInset - badgeWidth, y: labelFrame.minY - 1.0), size: CGSize(width: badgeWidth, height: badgeDiameter))
|
||||||
|
|
||||||
|
self.activateArea.accessibilityLabel = item.text
|
||||||
|
self.activateArea.accessibilityValue = item.label.text
|
||||||
|
|
||||||
transition.updateFrame(node: self.labelBadgeNode, frame: labelBadgeNodeFrame)
|
transition.updateFrame(node: self.labelBadgeNode, frame: labelBadgeNodeFrame)
|
||||||
transition.updateFrame(node: self.labelNode, frame: labelFrame)
|
transition.updateFrame(node: self.labelNode, frame: labelFrame)
|
||||||
transition.updateFrame(node: self.textNode, frame: textFrame)
|
transition.updateFrame(node: self.textNode, frame: textFrame)
|
||||||
@ -191,6 +198,8 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: separatorInset, y: height - UIScreenPixel), size: CGSize(width: width - separatorInset, height: UIScreenPixel)))
|
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: separatorInset, y: height - UIScreenPixel), size: CGSize(width: width - separatorInset, height: UIScreenPixel)))
|
||||||
transition.updateAlpha(node: self.bottomSeparatorNode, alpha: bottomItem == nil ? 0.0 : 1.0)
|
transition.updateAlpha(node: self.bottomSeparatorNode, alpha: bottomItem == nil ? 0.0 : 1.0)
|
||||||
|
|
||||||
|
self.activateArea.frame = CGRect(origin: CGPoint(x: safeInsets.left, y: 0.0), size: CGSize(width: width - safeInsets.left - safeInsets.right, height: height))
|
||||||
|
|
||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ final class PeerInfoScreenHeaderItem: PeerInfoScreenItem {
|
|||||||
|
|
||||||
private final class PeerInfoScreenHeaderItemNode: PeerInfoScreenItemNode {
|
private final class PeerInfoScreenHeaderItemNode: PeerInfoScreenItemNode {
|
||||||
private let textNode: ImmediateTextNode
|
private let textNode: ImmediateTextNode
|
||||||
|
private let activateArea: AccessibilityAreaNode
|
||||||
|
|
||||||
private var item: PeerInfoScreenHeaderItem?
|
private var item: PeerInfoScreenHeaderItem?
|
||||||
|
|
||||||
@ -26,9 +27,13 @@ private final class PeerInfoScreenHeaderItemNode: PeerInfoScreenItemNode {
|
|||||||
self.textNode.displaysAsynchronously = false
|
self.textNode.displaysAsynchronously = false
|
||||||
self.textNode.isUserInteractionEnabled = false
|
self.textNode.isUserInteractionEnabled = false
|
||||||
|
|
||||||
|
self.activateArea = AccessibilityAreaNode()
|
||||||
|
self.activateArea.accessibilityTraits = [.staticText, .header]
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
self.addSubnode(self.textNode)
|
self.addSubnode(self.textNode)
|
||||||
|
self.addSubnode(self.activateArea)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||||
@ -43,6 +48,7 @@ private final class PeerInfoScreenHeaderItemNode: PeerInfoScreenItemNode {
|
|||||||
|
|
||||||
self.textNode.maximumNumberOfLines = 0
|
self.textNode.maximumNumberOfLines = 0
|
||||||
self.textNode.attributedText = NSAttributedString(string: item.text, font: Font.regular(13.0), textColor: presentationData.theme.list.freeTextColor)
|
self.textNode.attributedText = NSAttributedString(string: item.text, font: Font.regular(13.0), textColor: presentationData.theme.list.freeTextColor)
|
||||||
|
self.activateArea.accessibilityLabel = item.text
|
||||||
|
|
||||||
let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0, height: .greatestFiniteMagnitude))
|
let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0, height: .greatestFiniteMagnitude))
|
||||||
|
|
||||||
@ -52,6 +58,8 @@ private final class PeerInfoScreenHeaderItemNode: PeerInfoScreenItemNode {
|
|||||||
|
|
||||||
transition.updateFrame(node: self.textNode, frame: textFrame)
|
transition.updateFrame(node: self.textNode, frame: textFrame)
|
||||||
|
|
||||||
|
self.activateArea.frame = CGRect(origin: CGPoint(x: safeInsets.left, y: 0.0), size: CGSize(width: width - safeInsets.left - safeInsets.right, height: height))
|
||||||
|
|
||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ private final class PeerInfoScreenSwitchItemNode: PeerInfoScreenItemNode {
|
|||||||
private let textNode: ImmediateTextNode
|
private let textNode: ImmediateTextNode
|
||||||
private let switchNode: SwitchNode
|
private let switchNode: SwitchNode
|
||||||
private let bottomSeparatorNode: ASDisplayNode
|
private let bottomSeparatorNode: ASDisplayNode
|
||||||
|
private let activateArea: AccessibilityAreaNode
|
||||||
|
|
||||||
private var item: PeerInfoScreenSwitchItem?
|
private var item: PeerInfoScreenSwitchItem?
|
||||||
|
|
||||||
@ -43,6 +44,8 @@ private final class PeerInfoScreenSwitchItemNode: PeerInfoScreenItemNode {
|
|||||||
self.bottomSeparatorNode = ASDisplayNode()
|
self.bottomSeparatorNode = ASDisplayNode()
|
||||||
self.bottomSeparatorNode.isLayerBacked = true
|
self.bottomSeparatorNode.isLayerBacked = true
|
||||||
|
|
||||||
|
self.activateArea = AccessibilityAreaNode()
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
bringToFrontForHighlightImpl = { [weak self] in
|
bringToFrontForHighlightImpl = { [weak self] in
|
||||||
@ -53,10 +56,20 @@ private final class PeerInfoScreenSwitchItemNode: PeerInfoScreenItemNode {
|
|||||||
self.addSubnode(self.selectionNode)
|
self.addSubnode(self.selectionNode)
|
||||||
self.addSubnode(self.textNode)
|
self.addSubnode(self.textNode)
|
||||||
self.addSubnode(self.switchNode)
|
self.addSubnode(self.switchNode)
|
||||||
|
self.addSubnode(self.activateArea)
|
||||||
|
|
||||||
self.switchNode.valueUpdated = { [weak self] value in
|
self.switchNode.valueUpdated = { [weak self] value in
|
||||||
self?.item?.toggled?(value)
|
self?.item?.toggled?(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.activateArea.activate = { [weak self] in
|
||||||
|
guard let strongSelf = self, let item = strongSelf.item else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
let value = !strongSelf.switchNode.isOn
|
||||||
|
item.toggled(value)
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
override func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||||
@ -87,6 +100,10 @@ private final class PeerInfoScreenSwitchItemNode: PeerInfoScreenItemNode {
|
|||||||
self.textNode.maximumNumberOfLines = 1
|
self.textNode.maximumNumberOfLines = 1
|
||||||
self.textNode.attributedText = NSAttributedString(string: item.text, font: Font.regular(17.0), textColor: textColorValue)
|
self.textNode.attributedText = NSAttributedString(string: item.text, font: Font.regular(17.0), textColor: textColorValue)
|
||||||
|
|
||||||
|
self.activateArea.accessibilityLabel = item.text
|
||||||
|
self.activateArea.accessibilityValue = item.value ? presentationData.strings.VoiceOver_Common_On : presentationData.strings.VoiceOver_Common_Off
|
||||||
|
self.activateArea.accessibilityHint = presentationData.strings.VoiceOver_Common_TapToChange
|
||||||
|
|
||||||
let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0 - 56.0, height: .greatestFiniteMagnitude))
|
let textSize = self.textNode.updateLayout(CGSize(width: width - sideInset * 2.0 - 56.0, height: .greatestFiniteMagnitude))
|
||||||
let textFrame = CGRect(origin: CGPoint(x: sideInset, y: 12.0), size: textSize)
|
let textFrame = CGRect(origin: CGPoint(x: sideInset, y: 12.0), size: textSize)
|
||||||
|
|
||||||
@ -113,6 +130,8 @@ private final class PeerInfoScreenSwitchItemNode: PeerInfoScreenItemNode {
|
|||||||
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: sideInset, y: height - UIScreenPixel), size: CGSize(width: width - sideInset, height: UIScreenPixel)))
|
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: sideInset, y: height - UIScreenPixel), size: CGSize(width: width - sideInset, height: UIScreenPixel)))
|
||||||
transition.updateAlpha(node: self.bottomSeparatorNode, alpha: bottomItem == nil ? 0.0 : 1.0)
|
transition.updateAlpha(node: self.bottomSeparatorNode, alpha: bottomItem == nil ? 0.0 : 1.0)
|
||||||
|
|
||||||
|
self.activateArea.frame = CGRect(origin: CGPoint(x: safeInsets.left, y: 0.0), size: CGSize(width: width - safeInsets.left - safeInsets.right, height: height))
|
||||||
|
|
||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,8 @@ final class PeerInfoHeaderButtonNode: HighlightableButtonNode {
|
|||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
self.accessibilityTraits = .button
|
||||||
|
|
||||||
self.addSubnode(self.containerNode)
|
self.addSubnode(self.containerNode)
|
||||||
self.containerNode.addSubnode(self.backgroundNode)
|
self.containerNode.addSubnode(self.backgroundNode)
|
||||||
self.containerNode.addSubnode(self.textNode)
|
self.containerNode.addSubnode(self.textNode)
|
||||||
@ -132,6 +134,7 @@ final class PeerInfoHeaderButtonNode: HighlightableButtonNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(12.0), textColor: presentationData.theme.list.itemAccentColor)
|
self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(12.0), textColor: presentationData.theme.list.itemAccentColor)
|
||||||
|
self.accessibilityLabel = text
|
||||||
let titleSize = self.textNode.updateLayout(CGSize(width: 120.0, height: .greatestFiniteMagnitude))
|
let titleSize = self.textNode.updateLayout(CGSize(width: 120.0, height: .greatestFiniteMagnitude))
|
||||||
|
|
||||||
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
@ -1838,6 +1841,9 @@ final class PeerInfoHeaderNavigationButton: HighlightableButtonNode {
|
|||||||
|
|
||||||
super.init(pointerStyle: .default)
|
super.init(pointerStyle: .default)
|
||||||
|
|
||||||
|
self.isAccessibilityElement = true
|
||||||
|
self.accessibilityTraits = .button
|
||||||
|
|
||||||
self.addSubnode(self.regularTextNode)
|
self.addSubnode(self.regularTextNode)
|
||||||
self.addSubnode(self.whiteTextNode)
|
self.addSubnode(self.whiteTextNode)
|
||||||
self.addSubnode(self.iconNode)
|
self.addSubnode(self.iconNode)
|
||||||
@ -1874,6 +1880,7 @@ final class PeerInfoHeaderNavigationButton: HighlightableButtonNode {
|
|||||||
case .editVideo:
|
case .editVideo:
|
||||||
text = presentationData.strings.Settings_EditVideo
|
text = presentationData.strings.Settings_EditVideo
|
||||||
}
|
}
|
||||||
|
self.accessibilityLabel = text
|
||||||
|
|
||||||
let font: UIFont = isBold ? Font.semibold(17.0) : Font.regular(17.0)
|
let font: UIFont = isBold ? Font.semibold(17.0) : Font.regular(17.0)
|
||||||
|
|
||||||
|
@ -59,12 +59,16 @@ protocol PeerInfoScreenItem: class {
|
|||||||
func node() -> PeerInfoScreenItemNode
|
func node() -> PeerInfoScreenItemNode
|
||||||
}
|
}
|
||||||
|
|
||||||
class PeerInfoScreenItemNode: ASDisplayNode {
|
class PeerInfoScreenItemNode: ASDisplayNode, AccessibilityFocusableNode {
|
||||||
var bringToFrontForHighlight: (() -> Void)?
|
var bringToFrontForHighlight: (() -> Void)?
|
||||||
|
|
||||||
func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
func update(width: CGFloat, safeInsets: UIEdgeInsets, presentationData: PresentationData, item: PeerInfoScreenItem, topItem: PeerInfoScreenItem?, bottomItem: PeerInfoScreenItem?, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||||
preconditionFailure()
|
preconditionFailure()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override open func accessibilityElementDidBecomeFocused() {
|
||||||
|
// (self.supernode as? ListView)?.ensureItemNodeVisible(self, animated: false, overflow: 22.0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class PeerInfoScreenItemSectionContainerNode: ASDisplayNode {
|
private final class PeerInfoScreenItemSectionContainerNode: ASDisplayNode {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user