Make polls in statuses accessible

This commit is contained in:
Shadowfacts 2021-06-06 21:50:45 -04:00
parent bbe260bc9e
commit 2c4d2ce551
Signed by untrusted user: shadowfacts
GPG Key ID: 94A5AB95422746E5
5 changed files with 28 additions and 7 deletions

View File

@ -44,12 +44,15 @@ class PollOptionView: UIView {
percentLabel.setContentHuggingPriority(.required, for: .horizontal) percentLabel.setContentHuggingPriority(.required, for: .horizontal)
addSubview(percentLabel) addSubview(percentLabel)
accessibilityLabel = option.title
if (poll.voted ?? false) || poll.effectiveExpired, if (poll.voted ?? false) || poll.effectiveExpired,
let optionVotes = option.votesCount { let optionVotes = option.votesCount {
let frac = poll.votesCount == 0 ? 0 : CGFloat(optionVotes) / CGFloat(poll.votesCount) let frac = poll.votesCount == 0 ? 0 : CGFloat(optionVotes) / CGFloat(poll.votesCount)
let percent = String(format: "%.0f%%", frac * 100)
percentLabel.isHidden = false percentLabel.isHidden = false
percentLabel.text = String(format: "%.0f%%", frac * 100) percentLabel.text = percent
let fillView = UIView() let fillView = UIView()
fillView.translatesAutoresizingMaskIntoConstraints = false fillView.translatesAutoresizingMaskIntoConstraints = false
@ -64,6 +67,8 @@ class PollOptionView: UIView {
fillView.topAnchor.constraint(equalTo: topAnchor), fillView.topAnchor.constraint(equalTo: topAnchor),
fillView.bottomAnchor.constraint(equalTo: bottomAnchor), fillView.bottomAnchor.constraint(equalTo: bottomAnchor),
]) ])
accessibilityLabel! += ", \(percent)"
} }
let minHeightConstraint = heightAnchor.constraint(greaterThanOrEqualToConstant: minHeight) let minHeightConstraint = heightAnchor.constraint(greaterThanOrEqualToConstant: minHeight)
@ -86,6 +91,8 @@ class PollOptionView: UIView {
percentLabel.bottomAnchor.constraint(equalTo: bottomAnchor), percentLabel.bottomAnchor.constraint(equalTo: bottomAnchor),
percentLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8), percentLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8),
]) ])
isAccessibilityElement = true
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {

View File

@ -69,6 +69,8 @@ class PollOptionsView: UIControl {
stack.addArrangedSubview(optionView) stack.addArrangedSubview(optionView)
return optionView return optionView
} }
accessibilityElements = options
} }
private func selectOption(_ option: PollOptionView) { private func selectOption(_ option: PollOptionView) {

View File

@ -28,7 +28,6 @@ class StatusPollView: UIView {
private var optionsView: PollOptionsView! private var optionsView: PollOptionsView!
private var voteButton: UIButton! private var voteButton: UIButton!
private var infoLabel: UILabel! private var infoLabel: UILabel!
private var options: [PollOptionView] = []
private var canVote = true private var canVote = true
private var animator: UIViewPropertyAnimator! private var animator: UIViewPropertyAnimator!
@ -74,15 +73,14 @@ class StatusPollView: UIView {
voteButton.topAnchor.constraint(equalTo: optionsView.bottomAnchor), voteButton.topAnchor.constraint(equalTo: optionsView.bottomAnchor),
voteButton.bottomAnchor.constraint(equalTo: bottomAnchor), voteButton.bottomAnchor.constraint(equalTo: bottomAnchor),
]) ])
accessibilityElements = [optionsView!, infoLabel!, voteButton!]
} }
func updateUI(status: StatusMO, poll: Poll?) { func updateUI(status: StatusMO, poll: Poll?) {
self.statusID = status.id self.statusID = status.id
self.poll = poll self.poll = poll
// remove old options
options.forEach { $0.removeFromSuperview() }
guard let poll = poll else { return } guard let poll = poll else { return }
// poll.voted is nil if there is no user (e.g., public timeline), in which case the poll also cannot be voted upon // poll.voted is nil if there is no user (e.g., public timeline), in which case the poll also cannot be voted upon

View File

@ -94,7 +94,7 @@ class BaseStatusTableViewCell: UITableViewCell, MenuPreviewProvider {
collapseButton.layer.masksToBounds = true collapseButton.layer.masksToBounds = true
collapseButton.layer.cornerRadius = 5 collapseButton.layer.cornerRadius = 5
accessibilityElements = [displayNameLabel!, contentWarningLabel!, collapseButton!, contentTextView!, attachmentsView!] accessibilityElements = [displayNameLabel!, contentWarningLabel!, collapseButton!, contentTextView!, attachmentsView!, pollView!]
attachmentsView.isAccessibilityElement = true attachmentsView.isAccessibilityElement = true
moreButton.showsMenuAsPrimaryAction = true moreButton.showsMenuAsPrimaryAction = true

View File

@ -33,7 +33,21 @@ class ConversationMainStatusTableViewCell: BaseStatusTableViewCell {
profileAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self) profileAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self)
profileAccessibilityElement.accessibilityFrameInContainerSpace = profileDetailContainerView.convert(profileDetailContainerView.frame, to: self) profileAccessibilityElement.accessibilityFrameInContainerSpace = profileDetailContainerView.convert(profileDetailContainerView.frame, to: self)
accessibilityElements = [profileAccessibilityElement!, contentWarningLabel!, collapseButton!, contentTextView!, totalFavoritesButton!, totalReblogsButton!, timestampAndClientLabel!, replyButton!, favoriteButton!, reblogButton!, moreButton!] accessibilityElements = [
profileAccessibilityElement!,
contentWarningLabel!,
collapseButton!,
contentTextView!,
attachmentsView!,
pollView!,
totalFavoritesButton!,
totalReblogsButton!,
timestampAndClientLabel!,
replyButton!,
favoriteButton!,
reblogButton!,
moreButton!,
]
contentTextView.defaultFont = .systemFont(ofSize: 18) contentTextView.defaultFont = .systemFont(ofSize: 18)