mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
Improves AppBannerView accessibility
This commit is contained in:
@@ -81,14 +81,14 @@ class AppViewController: UIViewController
|
|||||||
self.bannerView.frame = CGRect(x: 0, y: 0, width: 300, height: 93)
|
self.bannerView.frame = CGRect(x: 0, y: 0, width: 300, height: 93)
|
||||||
self.bannerView.backgroundEffectView.effect = UIBlurEffect(style: .regular)
|
self.bannerView.backgroundEffectView.effect = UIBlurEffect(style: .regular)
|
||||||
self.bannerView.backgroundEffectView.backgroundColor = .clear
|
self.bannerView.backgroundEffectView.backgroundColor = .clear
|
||||||
self.bannerView.titleLabel.text = self.app.name
|
|
||||||
self.bannerView.subtitleLabel.text = self.app.developerName
|
|
||||||
self.bannerView.iconImageView.image = nil
|
self.bannerView.iconImageView.image = nil
|
||||||
self.bannerView.iconImageView.tintColor = self.app.tintColor
|
self.bannerView.iconImageView.tintColor = self.app.tintColor
|
||||||
self.bannerView.button.tintColor = self.app.tintColor
|
self.bannerView.button.tintColor = self.app.tintColor
|
||||||
self.bannerView.betaBadgeView.isHidden = !self.app.isBeta
|
|
||||||
self.bannerView.tintColor = self.app.tintColor
|
self.bannerView.tintColor = self.app.tintColor
|
||||||
|
|
||||||
|
self.bannerView.configure(for: self.app)
|
||||||
|
self.bannerView.accessibilityTraits.remove(.button)
|
||||||
|
|
||||||
self.bannerView.button.addTarget(self, action: #selector(AppViewController.performAppAction(_:)), for: .primaryActionTriggered)
|
self.bannerView.button.addTarget(self, action: #selector(AppViewController.performAppAction(_:)), for: .primaryActionTriggered)
|
||||||
|
|
||||||
self.backButtonContainerView.tintColor = self.app.tintColor
|
self.backButtonContainerView.tintColor = self.app.tintColor
|
||||||
|
|||||||
@@ -78,10 +78,11 @@ private extension AppIDsViewController
|
|||||||
|
|
||||||
cell.bannerView.iconImageView.isHidden = true
|
cell.bannerView.iconImageView.isHidden = true
|
||||||
cell.bannerView.button.isIndicatingActivity = false
|
cell.bannerView.button.isIndicatingActivity = false
|
||||||
cell.bannerView.betaBadgeView.isHidden = true
|
|
||||||
|
|
||||||
cell.bannerView.buttonLabel.text = NSLocalizedString("Expires in", comment: "")
|
cell.bannerView.buttonLabel.text = NSLocalizedString("Expires in", comment: "")
|
||||||
|
|
||||||
|
let attributedAccessibilityLabel = NSMutableAttributedString(string: appID.name + ". ")
|
||||||
|
|
||||||
if let expirationDate = appID.expirationDate
|
if let expirationDate = appID.expirationDate
|
||||||
{
|
{
|
||||||
cell.bannerView.button.isHidden = false
|
cell.bannerView.button.isHidden = false
|
||||||
@@ -92,19 +93,16 @@ private extension AppIDsViewController
|
|||||||
let currentDate = Date()
|
let currentDate = Date()
|
||||||
|
|
||||||
let numberOfDays = expirationDate.numberOfCalendarDays(since: currentDate)
|
let numberOfDays = expirationDate.numberOfCalendarDays(since: currentDate)
|
||||||
|
let numberOfDaysText = (numberOfDays == 1) ? NSLocalizedString("1 day", comment: "") : String(format: NSLocalizedString("%@ days", comment: ""), NSNumber(value: numberOfDays))
|
||||||
|
cell.bannerView.button.setTitle(numberOfDaysText.uppercased(), for: .normal)
|
||||||
|
|
||||||
if numberOfDays == 1
|
attributedAccessibilityLabel.mutableString.append(String(format: NSLocalizedString("Expires in %@.", comment: ""), numberOfDaysText) + " ")
|
||||||
{
|
|
||||||
cell.bannerView.button.setTitle(NSLocalizedString("1 DAY", comment: ""), for: .normal)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cell.bannerView.button.setTitle(String(format: NSLocalizedString("%@ DAYS", comment: ""), NSNumber(value: numberOfDays)), for: .normal)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cell.bannerView.button.isHidden = true
|
cell.bannerView.button.isHidden = true
|
||||||
|
cell.bannerView.button.isUserInteractionEnabled = true
|
||||||
|
|
||||||
cell.bannerView.buttonLabel.isHidden = true
|
cell.bannerView.buttonLabel.isHidden = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,6 +110,18 @@ private extension AppIDsViewController
|
|||||||
cell.bannerView.subtitleLabel.text = appID.bundleIdentifier
|
cell.bannerView.subtitleLabel.text = appID.bundleIdentifier
|
||||||
cell.bannerView.subtitleLabel.numberOfLines = 2
|
cell.bannerView.subtitleLabel.numberOfLines = 2
|
||||||
|
|
||||||
|
let attributedBundleIdentifier = NSMutableAttributedString(string: appID.bundleIdentifier.lowercased(), attributes: [.accessibilitySpeechPunctuation: true])
|
||||||
|
|
||||||
|
if let team = appID.team, let range = attributedBundleIdentifier.string.range(of: team.identifier.lowercased()), #available(iOS 13, *)
|
||||||
|
{
|
||||||
|
// Prefer to speak the team ID one character at a time.
|
||||||
|
let nsRange = NSRange(range, in: attributedBundleIdentifier.string)
|
||||||
|
attributedBundleIdentifier.addAttributes([.accessibilitySpeechSpellOut: true], range: nsRange)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributedAccessibilityLabel.append(attributedBundleIdentifier)
|
||||||
|
cell.bannerView.accessibilityAttributedLabel = attributedAccessibilityLabel
|
||||||
|
|
||||||
// Make sure refresh button is correct size.
|
// Make sure refresh button is correct size.
|
||||||
cell.layoutIfNeeded()
|
cell.layoutIfNeeded()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -648,9 +648,6 @@ World</string>
|
|||||||
<subviews>
|
<subviews>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mos-e4-dQ7" customClass="AppBannerView" customModule="AltStore" customModuleProvider="target">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mos-e4-dQ7" customClass="AppBannerView" customModule="AltStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="8" y="0.0" width="359" height="60"/>
|
<rect key="frame" x="8" y="0.0" width="359" height="60"/>
|
||||||
<accessibility key="accessibilityConfiguration">
|
|
||||||
<bool key="isElement" value="YES"/>
|
|
||||||
</accessibility>
|
|
||||||
</view>
|
</view>
|
||||||
</subviews>
|
</subviews>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -83,11 +83,9 @@ private extension BrowseViewController
|
|||||||
cell.layoutMargins.left = self.view.layoutMargins.left
|
cell.layoutMargins.left = self.view.layoutMargins.left
|
||||||
cell.layoutMargins.right = self.view.layoutMargins.right
|
cell.layoutMargins.right = self.view.layoutMargins.right
|
||||||
|
|
||||||
cell.subtitleLabel.text = app.subtitle
|
|
||||||
cell.imageURLs = Array(app.screenshotURLs.prefix(2))
|
cell.imageURLs = Array(app.screenshotURLs.prefix(2))
|
||||||
cell.bannerView.titleLabel.text = app.name
|
|
||||||
cell.bannerView.subtitleLabel.text = app.developerName
|
cell.bannerView.configure(for: app)
|
||||||
cell.bannerView.betaBadgeView.isHidden = !app.isBeta
|
|
||||||
|
|
||||||
cell.bannerView.iconImageView.image = nil
|
cell.bannerView.iconImageView.image = nil
|
||||||
cell.bannerView.iconImageView.isIndicatingActivity = true
|
cell.bannerView.iconImageView.isIndicatingActivity = true
|
||||||
@@ -104,7 +102,10 @@ private extension BrowseViewController
|
|||||||
|
|
||||||
if app.installedApp == nil
|
if app.installedApp == nil
|
||||||
{
|
{
|
||||||
cell.bannerView.button.setTitle(NSLocalizedString("FREE", comment: ""), for: .normal)
|
let buttonTitle = NSLocalizedString("Free", comment: "")
|
||||||
|
cell.bannerView.button.setTitle(buttonTitle.uppercased(), for: .normal)
|
||||||
|
cell.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Download %@", comment: ""), app.name)
|
||||||
|
cell.bannerView.button.accessibilityValue = buttonTitle
|
||||||
|
|
||||||
let progress = AppManager.shared.installationProgress(for: app)
|
let progress = AppManager.shared.installationProgress(for: app)
|
||||||
cell.bannerView.button.progress = progress
|
cell.bannerView.button.progress = progress
|
||||||
@@ -121,6 +122,8 @@ private extension BrowseViewController
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
cell.bannerView.button.setTitle(NSLocalizedString("OPEN", comment: ""), for: .normal)
|
cell.bannerView.button.setTitle(NSLocalizedString("OPEN", comment: ""), for: .normal)
|
||||||
|
cell.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Open %@", comment: ""), app.name)
|
||||||
|
cell.bannerView.button.accessibilityValue = nil
|
||||||
cell.bannerView.button.progress = nil
|
cell.bannerView.button.progress = nil
|
||||||
cell.bannerView.button.countdownDate = nil
|
cell.bannerView.button.countdownDate = nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,31 @@ import Roxas
|
|||||||
|
|
||||||
class AppBannerView: RSTNibView
|
class AppBannerView: RSTNibView
|
||||||
{
|
{
|
||||||
|
override var accessibilityLabel: String? {
|
||||||
|
get { return self.accessibilityView?.accessibilityLabel }
|
||||||
|
set { self.accessibilityView?.accessibilityLabel = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
override open var accessibilityAttributedLabel: NSAttributedString? {
|
||||||
|
get { return self.accessibilityView?.accessibilityAttributedLabel }
|
||||||
|
set { self.accessibilityView?.accessibilityAttributedLabel = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
override var accessibilityValue: String? {
|
||||||
|
get { return self.accessibilityView?.accessibilityValue }
|
||||||
|
set { self.accessibilityView?.accessibilityValue = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
override open var accessibilityAttributedValue: NSAttributedString? {
|
||||||
|
get { return self.accessibilityView?.accessibilityAttributedValue }
|
||||||
|
set { self.accessibilityView?.accessibilityAttributedValue = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
override open var accessibilityTraits: UIAccessibilityTraits {
|
||||||
|
get { return self.accessibilityView?.accessibilityTraits ?? [] }
|
||||||
|
set { self.accessibilityView?.accessibilityTraits = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
private var originalTintColor: UIColor?
|
private var originalTintColor: UIColor?
|
||||||
|
|
||||||
@IBOutlet var titleLabel: UILabel!
|
@IBOutlet var titleLabel: UILabel!
|
||||||
@@ -21,7 +46,33 @@ class AppBannerView: RSTNibView
|
|||||||
@IBOutlet var betaBadgeView: UIView!
|
@IBOutlet var betaBadgeView: UIView!
|
||||||
|
|
||||||
@IBOutlet var backgroundEffectView: UIVisualEffectView!
|
@IBOutlet var backgroundEffectView: UIVisualEffectView!
|
||||||
|
|
||||||
@IBOutlet private var vibrancyView: UIVisualEffectView!
|
@IBOutlet private var vibrancyView: UIVisualEffectView!
|
||||||
|
@IBOutlet private var accessibilityView: UIView!
|
||||||
|
|
||||||
|
override init(frame: CGRect)
|
||||||
|
{
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
self.initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder)
|
||||||
|
{
|
||||||
|
super.init(coder: coder)
|
||||||
|
|
||||||
|
self.initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func initialize()
|
||||||
|
{
|
||||||
|
self.accessibilityView.accessibilityTraits.formUnion(.button)
|
||||||
|
|
||||||
|
self.isAccessibilityElement = false
|
||||||
|
self.accessibilityElements = [self.accessibilityView, self.button].compactMap { $0 }
|
||||||
|
|
||||||
|
self.betaBadgeView.isHidden = true
|
||||||
|
}
|
||||||
|
|
||||||
override func tintColorDidChange()
|
override func tintColorDidChange()
|
||||||
{
|
{
|
||||||
@@ -36,6 +87,48 @@ class AppBannerView: RSTNibView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension AppBannerView
|
||||||
|
{
|
||||||
|
func configure(for app: AppProtocol)
|
||||||
|
{
|
||||||
|
struct AppValues
|
||||||
|
{
|
||||||
|
var name: String
|
||||||
|
var developerName: String? = nil
|
||||||
|
var isBeta: Bool = false
|
||||||
|
|
||||||
|
init(app: AppProtocol)
|
||||||
|
{
|
||||||
|
self.name = app.name
|
||||||
|
|
||||||
|
guard let storeApp = (app as? StoreApp) ?? (app as? InstalledApp)?.storeApp else { return }
|
||||||
|
self.developerName = storeApp.developerName
|
||||||
|
|
||||||
|
if storeApp.isBeta
|
||||||
|
{
|
||||||
|
self.name = String(format: NSLocalizedString("%@ beta", comment: ""), app.name)
|
||||||
|
self.isBeta = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let values = AppValues(app: app)
|
||||||
|
self.titleLabel.text = app.name // Don't use values.name since that already includes "beta".
|
||||||
|
self.betaBadgeView.isHidden = !values.isBeta
|
||||||
|
|
||||||
|
if let developerName = values.developerName
|
||||||
|
{
|
||||||
|
self.subtitleLabel.text = developerName
|
||||||
|
self.accessibilityLabel = String(format: NSLocalizedString("%@ by %@", comment: ""), values.name, developerName)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.subtitleLabel.text = NSLocalizedString("Sideloaded", comment: "")
|
||||||
|
self.accessibilityLabel = values.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private extension AppBannerView
|
private extension AppBannerView
|
||||||
{
|
{
|
||||||
func update()
|
func update()
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17124"/>
|
||||||
<capability name="Named colors" minToolsVersion="9.0"/>
|
<capability name="Named colors" minToolsVersion="9.0"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AppBannerView" customModule="AltStore" customModuleProvider="target">
|
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AppBannerView" customModule="AltStore" customModuleProvider="target">
|
||||||
<connections>
|
<connections>
|
||||||
|
<outlet property="accessibilityView" destination="bJL-Yw-i4u" id="PWe-tw-jDA"/>
|
||||||
<outlet property="backgroundEffectView" destination="rZk-be-tiI" id="fzU-VT-JeW"/>
|
<outlet property="backgroundEffectView" destination="rZk-be-tiI" id="fzU-VT-JeW"/>
|
||||||
<outlet property="betaBadgeView" destination="qQl-Ez-zC5" id="6O1-Cx-7qz"/>
|
<outlet property="betaBadgeView" destination="qQl-Ez-zC5" id="6O1-Cx-7qz"/>
|
||||||
<outlet property="button" destination="tVx-3G-dcu" id="joa-AH-syX"/>
|
<outlet property="button" destination="tVx-3G-dcu" id="joa-AH-syX"/>
|
||||||
@@ -25,6 +27,13 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
|
<view userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bJL-Yw-i4u">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<accessibility key="accessibilityConfiguration">
|
||||||
|
<bool key="isElement" value="YES"/>
|
||||||
|
</accessibility>
|
||||||
|
</view>
|
||||||
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rZk-be-tiI">
|
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rZk-be-tiI">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="88"/>
|
||||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="b8k-up-HtI">
|
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="b8k-up-HtI">
|
||||||
@@ -45,20 +54,20 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
</imageView>
|
</imageView>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="100" insetsLayoutMarginsFromSafeArea="NO" axis="vertical" alignment="top" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="caL-vN-Svn">
|
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="100" insetsLayoutMarginsFromSafeArea="NO" axis="vertical" alignment="top" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="caL-vN-Svn">
|
||||||
<rect key="frame" x="85" y="18" width="190" height="52"/>
|
<rect key="frame" x="85" y="25.5" width="190" height="37.5"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="500" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="1Es-pv-zwd">
|
<stackView opaque="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="500" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="1Es-pv-zwd">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="167" height="34"/>
|
<rect key="frame" x="0.0" y="0.0" width="126" height="19.5"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" horizontalCompressionResistancePriority="500" text="App Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="mFe-zJ-eva">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="251" horizontalCompressionResistancePriority="500" text="App Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="mFe-zJ-eva">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="79" height="34"/>
|
<rect key="frame" x="0.0" y="0.0" width="79" height="19.5"/>
|
||||||
<accessibility key="accessibilityConfiguration" identifier="NameLabel"/>
|
<accessibility key="accessibilityConfiguration" identifier="NameLabel"/>
|
||||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BetaBadge" translatesAutoresizingMaskIntoConstraints="NO" id="qQl-Ez-zC5">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BetaBadge" translatesAutoresizingMaskIntoConstraints="NO" id="qQl-Ez-zC5">
|
||||||
<rect key="frame" x="85" y="0.0" width="82" height="34"/>
|
<rect key="frame" x="85" y="0.0" width="41" height="19.5"/>
|
||||||
<accessibility key="accessibilityConfiguration" identifier="Beta Badge">
|
<accessibility key="accessibilityConfiguration" identifier="Beta Badge">
|
||||||
<accessibilityTraits key="traits" image="YES" notEnabled="YES"/>
|
<accessibilityTraits key="traits" image="YES" notEnabled="YES"/>
|
||||||
<bool key="isElement" value="YES"/>
|
<bool key="isElement" value="YES"/>
|
||||||
@@ -67,14 +76,13 @@
|
|||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fC4-1V-iMn">
|
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fC4-1V-iMn">
|
||||||
<rect key="frame" x="0.0" y="36" width="190" height="16"/>
|
<rect key="frame" x="0.0" y="21.5" width="190" height="16"/>
|
||||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="LQh-pN-ePC">
|
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="LQh-pN-ePC">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="190" height="16"/>
|
<rect key="frame" x="0.0" y="0.0" width="190" height="16"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="750" text="Developer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="oN5-vu-Dnw">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="100" verticalHuggingPriority="750" text="Developer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="oN5-vu-Dnw">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="190" height="16"/>
|
<rect key="frame" x="0.0" y="0.0" width="190" height="16"/>
|
||||||
<accessibility key="accessibilityConfiguration" label="Developer"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
<fontDescription key="fontDescription" type="system" pointSize="13"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -99,10 +107,10 @@
|
|||||||
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yd9-jw-faD">
|
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yd9-jw-faD">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="77" height="0.0"/>
|
<rect key="frame" x="0.0" y="0.0" width="77" height="0.0"/>
|
||||||
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="10"/>
|
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="10"/>
|
||||||
<color key="textColor" systemColor="secondaryLabelColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" systemColor="secondaryLabelColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="900" horizontalCompressionResistancePriority="900" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tVx-3G-dcu" customClass="PillButton" customModule="AltStore" customModuleProvider="target">
|
<button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="900" horizontalCompressionResistancePriority="900" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tVx-3G-dcu" customClass="PillButton" customModule="AltStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="77" height="31"/>
|
<rect key="frame" x="0.0" y="0.0" width="77" height="31"/>
|
||||||
<color key="backgroundColor" red="0.22352941179999999" green="0.4941176471" blue="0.39607843139999999" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.22352941179999999" green="0.4941176471" blue="0.39607843139999999" alpha="0.10000000000000001" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
@@ -120,12 +128,16 @@
|
|||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="d1T-UD-gWG" firstAttribute="leading" secondItem="FxI-Fh-ll5" secondAttribute="leading" id="5tv-QN-ZWU"/>
|
<constraint firstItem="d1T-UD-gWG" firstAttribute="leading" secondItem="FxI-Fh-ll5" secondAttribute="leading" id="5tv-QN-ZWU"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="bJL-Yw-i4u" secondAttribute="bottom" id="FRq-ZD-2rE"/>
|
||||||
<constraint firstItem="rZk-be-tiI" firstAttribute="top" secondItem="FxI-Fh-ll5" secondAttribute="top" id="N6R-B2-Rie"/>
|
<constraint firstItem="rZk-be-tiI" firstAttribute="top" secondItem="FxI-Fh-ll5" secondAttribute="top" id="N6R-B2-Rie"/>
|
||||||
|
<constraint firstItem="bJL-Yw-i4u" firstAttribute="top" secondItem="FxI-Fh-ll5" secondAttribute="top" id="h6T-q1-YV9"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="d1T-UD-gWG" secondAttribute="trailing" id="mlG-w3-Ly6"/>
|
<constraint firstAttribute="trailing" secondItem="d1T-UD-gWG" secondAttribute="trailing" id="mlG-w3-Ly6"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="rZk-be-tiI" secondAttribute="trailing" id="nEy-pm-Fcs"/>
|
<constraint firstAttribute="trailing" secondItem="rZk-be-tiI" secondAttribute="trailing" id="nEy-pm-Fcs"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="d1T-UD-gWG" secondAttribute="bottom" id="nJo-To-LmX"/>
|
<constraint firstAttribute="bottom" secondItem="d1T-UD-gWG" secondAttribute="bottom" id="nJo-To-LmX"/>
|
||||||
|
<constraint firstItem="bJL-Yw-i4u" firstAttribute="leading" secondItem="FxI-Fh-ll5" secondAttribute="leading" id="oLt-2z-QoJ"/>
|
||||||
<constraint firstItem="rZk-be-tiI" firstAttribute="leading" secondItem="FxI-Fh-ll5" secondAttribute="leading" id="pGD-Tl-U4c"/>
|
<constraint firstItem="rZk-be-tiI" firstAttribute="leading" secondItem="FxI-Fh-ll5" secondAttribute="leading" id="pGD-Tl-U4c"/>
|
||||||
<constraint firstItem="d1T-UD-gWG" firstAttribute="top" secondItem="FxI-Fh-ll5" secondAttribute="top" id="q2p-0S-Nv5"/>
|
<constraint firstItem="d1T-UD-gWG" firstAttribute="top" secondItem="FxI-Fh-ll5" secondAttribute="top" id="q2p-0S-Nv5"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="bJL-Yw-i4u" secondAttribute="trailing" id="vwx-P9-dlB"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="rZk-be-tiI" secondAttribute="bottom" id="yk0-pw-joP"/>
|
<constraint firstAttribute="bottom" secondItem="rZk-be-tiI" secondAttribute="bottom" id="yk0-pw-joP"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||||
@@ -137,5 +149,8 @@
|
|||||||
<namedColor name="BlurTint">
|
<namedColor name="BlurTint">
|
||||||
<color red="1" green="1" blue="1" alpha="0.30000001192092896" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="1" green="1" blue="1" alpha="0.30000001192092896" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</namedColor>
|
</namedColor>
|
||||||
|
<systemColor name="secondaryLabelColor">
|
||||||
|
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|||||||
@@ -10,6 +10,14 @@ import UIKit
|
|||||||
|
|
||||||
class PillButton: UIButton
|
class PillButton: UIButton
|
||||||
{
|
{
|
||||||
|
override var accessibilityValue: String? {
|
||||||
|
get {
|
||||||
|
guard self.progress != nil else { return super.accessibilityValue }
|
||||||
|
return self.progressView.accessibilityValue
|
||||||
|
}
|
||||||
|
set { super.accessibilityValue = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
var progress: Progress? {
|
var progress: Progress? {
|
||||||
didSet {
|
didSet {
|
||||||
self.progressView.progress = Float(self.progress?.fractionCompleted ?? 0)
|
self.progressView.progress = Float(self.progress?.fractionCompleted ?? 0)
|
||||||
@@ -78,6 +86,7 @@ class PillButton: UIButton
|
|||||||
super.awakeFromNib()
|
super.awakeFromNib()
|
||||||
|
|
||||||
self.layer.masksToBounds = true
|
self.layer.masksToBounds = true
|
||||||
|
self.accessibilityTraits.formUnion([.updatesFrequently, .button])
|
||||||
|
|
||||||
self.activityIndicatorView.style = .white
|
self.activityIndicatorView.style = .white
|
||||||
self.activityIndicatorView.isUserInteractionEnabled = false
|
self.activityIndicatorView.isUserInteractionEnabled = false
|
||||||
|
|||||||
@@ -201,13 +201,30 @@ private extension MyAppsViewController
|
|||||||
cell.tintColor = app.tintColor ?? .altPrimary
|
cell.tintColor = app.tintColor ?? .altPrimary
|
||||||
cell.versionDescriptionTextView.text = app.versionDescription
|
cell.versionDescriptionTextView.text = app.versionDescription
|
||||||
|
|
||||||
cell.bannerView.titleLabel.text = app.name
|
|
||||||
cell.bannerView.iconImageView.image = nil
|
cell.bannerView.iconImageView.image = nil
|
||||||
cell.bannerView.iconImageView.isIndicatingActivity = true
|
cell.bannerView.iconImageView.isIndicatingActivity = true
|
||||||
cell.bannerView.betaBadgeView.isHidden = !app.isBeta
|
|
||||||
|
cell.bannerView.configure(for: app)
|
||||||
|
|
||||||
|
let versionDate = Date().relativeDateString(since: app.versionDate, dateFormatter: self.dateFormatter)
|
||||||
|
cell.bannerView.subtitleLabel.text = versionDate
|
||||||
|
|
||||||
|
let appName: String
|
||||||
|
|
||||||
|
if app.isBeta
|
||||||
|
{
|
||||||
|
appName = String(format: NSLocalizedString("%@ beta", comment: ""), app.name)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
appName = app.name
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.bannerView.accessibilityLabel = String(format: NSLocalizedString("%@ %@ update. Released on %@.", comment: ""), appName, app.version, versionDate)
|
||||||
|
|
||||||
cell.bannerView.button.isIndicatingActivity = false
|
cell.bannerView.button.isIndicatingActivity = false
|
||||||
cell.bannerView.button.addTarget(self, action: #selector(MyAppsViewController.updateApp(_:)), for: .primaryActionTriggered)
|
cell.bannerView.button.addTarget(self, action: #selector(MyAppsViewController.updateApp(_:)), for: .primaryActionTriggered)
|
||||||
|
cell.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Update %@", comment: ""), installedApp.name)
|
||||||
|
|
||||||
if self.expandedAppUpdates.contains(app.bundleIdentifier)
|
if self.expandedAppUpdates.contains(app.bundleIdentifier)
|
||||||
{
|
{
|
||||||
@@ -223,8 +240,6 @@ private extension MyAppsViewController
|
|||||||
let progress = AppManager.shared.installationProgress(for: app)
|
let progress = AppManager.shared.installationProgress(for: app)
|
||||||
cell.bannerView.button.progress = progress
|
cell.bannerView.button.progress = progress
|
||||||
|
|
||||||
cell.bannerView.subtitleLabel.text = Date().relativeDateString(since: app.versionDate, dateFormatter: self.dateFormatter)
|
|
||||||
|
|
||||||
cell.setNeedsLayout()
|
cell.setNeedsLayout()
|
||||||
}
|
}
|
||||||
dataSource.prefetchHandler = { (installedApp, indexPath, completionHandler) in
|
dataSource.prefetchHandler = { (installedApp, indexPath, completionHandler) in
|
||||||
@@ -295,8 +310,9 @@ private extension MyAppsViewController
|
|||||||
cell.deactivateBadge?.transform = CGAffineTransform.identity.scaledBy(x: 0.33, y: 0.33)
|
cell.deactivateBadge?.transform = CGAffineTransform.identity.scaledBy(x: 0.33, y: 0.33)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cell.bannerView.configure(for: installedApp)
|
||||||
|
|
||||||
cell.bannerView.iconImageView.isIndicatingActivity = true
|
cell.bannerView.iconImageView.isIndicatingActivity = true
|
||||||
cell.bannerView.betaBadgeView.isHidden = !(installedApp.storeApp?.isBeta ?? false)
|
|
||||||
|
|
||||||
cell.bannerView.buttonLabel.isHidden = false
|
cell.bannerView.buttonLabel.isHidden = false
|
||||||
cell.bannerView.buttonLabel.text = NSLocalizedString("Expires in", comment: "")
|
cell.bannerView.buttonLabel.text = NSLocalizedString("Expires in", comment: "")
|
||||||
@@ -308,18 +324,21 @@ private extension MyAppsViewController
|
|||||||
let currentDate = Date()
|
let currentDate = Date()
|
||||||
|
|
||||||
let numberOfDays = installedApp.expirationDate.numberOfCalendarDays(since: currentDate)
|
let numberOfDays = installedApp.expirationDate.numberOfCalendarDays(since: currentDate)
|
||||||
|
let numberOfDaysText: String
|
||||||
|
|
||||||
if numberOfDays == 1
|
if numberOfDays == 1
|
||||||
{
|
{
|
||||||
cell.bannerView.button.setTitle(NSLocalizedString("1 DAY", comment: ""), for: .normal)
|
numberOfDaysText = NSLocalizedString("1 day", comment: "")
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cell.bannerView.button.setTitle(String(format: NSLocalizedString("%@ DAYS", comment: ""), NSNumber(value: numberOfDays)), for: .normal)
|
numberOfDaysText = String(format: NSLocalizedString("%@ days", comment: ""), NSNumber(value: numberOfDays))
|
||||||
}
|
}
|
||||||
|
|
||||||
cell.bannerView.titleLabel.text = installedApp.name
|
cell.bannerView.button.setTitle(numberOfDaysText.uppercased(), for: .normal)
|
||||||
cell.bannerView.subtitleLabel.text = installedApp.storeApp?.developerName ?? NSLocalizedString("Sideloaded", comment: "")
|
cell.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Refresh %@", comment: ""), installedApp.name)
|
||||||
|
|
||||||
|
cell.bannerView.accessibilityLabel? += ". " + String(format: NSLocalizedString("Expires in %@", comment: ""), numberOfDaysText)
|
||||||
|
|
||||||
// Make sure refresh button is correct size.
|
// Make sure refresh button is correct size.
|
||||||
cell.layoutIfNeeded()
|
cell.layoutIfNeeded()
|
||||||
@@ -384,8 +403,6 @@ private extension MyAppsViewController
|
|||||||
cell.tintColor = UIColor.gray
|
cell.tintColor = UIColor.gray
|
||||||
|
|
||||||
cell.bannerView.iconImageView.isIndicatingActivity = true
|
cell.bannerView.iconImageView.isIndicatingActivity = true
|
||||||
cell.bannerView.betaBadgeView.isHidden = !(installedApp.storeApp?.isBeta ?? false)
|
|
||||||
|
|
||||||
cell.bannerView.buttonLabel.isHidden = true
|
cell.bannerView.buttonLabel.isHidden = true
|
||||||
cell.bannerView.alpha = 1.0
|
cell.bannerView.alpha = 1.0
|
||||||
|
|
||||||
@@ -393,14 +410,14 @@ private extension MyAppsViewController
|
|||||||
cell.deactivateBadge?.alpha = 0.0
|
cell.deactivateBadge?.alpha = 0.0
|
||||||
cell.deactivateBadge?.transform = CGAffineTransform.identity.scaledBy(x: 0.5, y: 0.5)
|
cell.deactivateBadge?.transform = CGAffineTransform.identity.scaledBy(x: 0.5, y: 0.5)
|
||||||
|
|
||||||
|
cell.bannerView.configure(for: installedApp)
|
||||||
|
|
||||||
cell.bannerView.button.isIndicatingActivity = false
|
cell.bannerView.button.isIndicatingActivity = false
|
||||||
cell.bannerView.button.tintColor = tintColor
|
cell.bannerView.button.tintColor = tintColor
|
||||||
cell.bannerView.button.setTitle(NSLocalizedString("ACTIVATE", comment: ""), for: .normal)
|
cell.bannerView.button.setTitle(NSLocalizedString("ACTIVATE", comment: ""), for: .normal)
|
||||||
cell.bannerView.button.removeTarget(self, action: nil, for: .primaryActionTriggered)
|
cell.bannerView.button.removeTarget(self, action: nil, for: .primaryActionTriggered)
|
||||||
cell.bannerView.button.addTarget(self, action: #selector(MyAppsViewController.activateApp(_:)), for: .primaryActionTriggered)
|
cell.bannerView.button.addTarget(self, action: #selector(MyAppsViewController.activateApp(_:)), for: .primaryActionTriggered)
|
||||||
|
cell.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Activate %@", comment: ""), installedApp.name)
|
||||||
cell.bannerView.titleLabel.text = installedApp.name
|
|
||||||
cell.bannerView.subtitleLabel.text = installedApp.storeApp?.developerName ?? NSLocalizedString("Sideloaded", comment: "")
|
|
||||||
|
|
||||||
// Make sure refresh button is correct size.
|
// Make sure refresh button is correct size.
|
||||||
cell.layoutIfNeeded()
|
cell.layoutIfNeeded()
|
||||||
|
|||||||
@@ -348,10 +348,9 @@ extension NewsViewController
|
|||||||
footerView.layoutMargins.left = self.view.layoutMargins.left
|
footerView.layoutMargins.left = self.view.layoutMargins.left
|
||||||
footerView.layoutMargins.right = self.view.layoutMargins.right
|
footerView.layoutMargins.right = self.view.layoutMargins.right
|
||||||
|
|
||||||
footerView.bannerView.titleLabel.text = storeApp.name
|
footerView.bannerView.configure(for: storeApp)
|
||||||
footerView.bannerView.subtitleLabel.text = storeApp.developerName
|
|
||||||
footerView.bannerView.tintColor = storeApp.tintColor
|
footerView.bannerView.tintColor = storeApp.tintColor
|
||||||
footerView.bannerView.betaBadgeView.isHidden = !storeApp.isBeta
|
|
||||||
footerView.bannerView.button.addTarget(self, action: #selector(NewsViewController.performAppAction(_:)), for: .primaryActionTriggered)
|
footerView.bannerView.button.addTarget(self, action: #selector(NewsViewController.performAppAction(_:)), for: .primaryActionTriggered)
|
||||||
footerView.tapGestureRecognizer.addTarget(self, action: #selector(NewsViewController.handleTapGesture(_:)))
|
footerView.tapGestureRecognizer.addTarget(self, action: #selector(NewsViewController.handleTapGesture(_:)))
|
||||||
|
|
||||||
@@ -359,7 +358,10 @@ extension NewsViewController
|
|||||||
|
|
||||||
if storeApp.installedApp == nil
|
if storeApp.installedApp == nil
|
||||||
{
|
{
|
||||||
footerView.bannerView.button.setTitle(NSLocalizedString("FREE", comment: ""), for: .normal)
|
let buttonTitle = NSLocalizedString("Free", comment: "")
|
||||||
|
footerView.bannerView.button.setTitle(buttonTitle.uppercased(), for: .normal)
|
||||||
|
footerView.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Download %@", comment: ""), storeApp.name)
|
||||||
|
footerView.bannerView.button.accessibilityValue = buttonTitle
|
||||||
|
|
||||||
let progress = AppManager.shared.installationProgress(for: storeApp)
|
let progress = AppManager.shared.installationProgress(for: storeApp)
|
||||||
footerView.bannerView.button.progress = progress
|
footerView.bannerView.button.progress = progress
|
||||||
@@ -376,6 +378,8 @@ extension NewsViewController
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
footerView.bannerView.button.setTitle(NSLocalizedString("OPEN", comment: ""), for: .normal)
|
footerView.bannerView.button.setTitle(NSLocalizedString("OPEN", comment: ""), for: .normal)
|
||||||
|
footerView.bannerView.button.accessibilityLabel = String(format: NSLocalizedString("Open %@", comment: ""), storeApp.name)
|
||||||
|
footerView.bannerView.button.accessibilityValue = nil
|
||||||
footerView.bannerView.button.progress = nil
|
footerView.bannerView.button.progress = nil
|
||||||
footerView.bannerView.button.countdownDate = nil
|
footerView.bannerView.button.countdownDate = nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ private extension SourcesViewController
|
|||||||
cell.tintColor = tintColor
|
cell.tintColor = tintColor
|
||||||
|
|
||||||
cell.bannerView.iconImageView.isHidden = true
|
cell.bannerView.iconImageView.isHidden = true
|
||||||
cell.bannerView.betaBadgeView.isHidden = true
|
|
||||||
cell.bannerView.buttonLabel.isHidden = true
|
cell.bannerView.buttonLabel.isHidden = true
|
||||||
cell.bannerView.button.isHidden = true
|
cell.bannerView.button.isHidden = true
|
||||||
cell.bannerView.button.isIndicatingActivity = false
|
cell.bannerView.button.isIndicatingActivity = false
|
||||||
@@ -53,6 +52,10 @@ private extension SourcesViewController
|
|||||||
cell.bannerView.subtitleLabel.text = source.sourceURL.absoluteString
|
cell.bannerView.subtitleLabel.text = source.sourceURL.absoluteString
|
||||||
cell.bannerView.subtitleLabel.numberOfLines = 2
|
cell.bannerView.subtitleLabel.numberOfLines = 2
|
||||||
|
|
||||||
|
let attributedLabel = NSAttributedString(string: source.name + "\n" + source.sourceURL.absoluteString, attributes: [.accessibilitySpeechPunctuation: true])
|
||||||
|
cell.bannerView.accessibilityAttributedLabel = attributedLabel
|
||||||
|
cell.bannerView.accessibilityTraits.remove(.button)
|
||||||
|
|
||||||
// Make sure refresh button is correct size.
|
// Make sure refresh button is correct size.
|
||||||
cell.layoutIfNeeded()
|
cell.layoutIfNeeded()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user