diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 00ef0933..dffbf7e5 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -1237,7 +1237,7 @@ BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 52; + CURRENT_PROJECT_VERSION = 53; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1274,7 +1274,7 @@ BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 52; + CURRENT_PROJECT_VERSION = 53; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; diff --git a/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift b/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift index 296a5224..c361baee 100644 --- a/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift +++ b/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift @@ -207,8 +207,8 @@ extension ButtonGroup: UICollectionViewDataSource, UICollectionViewDelegate { public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let button = buttons[indexPath.row] guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as? ButtonGroupCollectionViewCell else { return UICollectionViewCell() } - cell.subviews.forEach { $0.removeFromSuperview() } - cell.addSubview(button) + cell.contentView.subviews.forEach { $0.removeFromSuperview() } + cell.contentView.addSubview(button) button.pinToSuperView() if hasDebugBorder { cell.addDebugBorder() diff --git a/VDS/Components/Loader/Loader.swift b/VDS/Components/Loader/Loader.swift index f765c4e6..90d589be 100644 --- a/VDS/Components/Loader/Loader.swift +++ b/VDS/Components/Loader/Loader.swift @@ -120,11 +120,12 @@ open class Loader: View { // setup timer for post loadingTimer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { [weak self] _ in - self?.accessibilityLabel = "Still Loading" + guard let self, self.isActive, self.isVisibleOnScreen else { return } + self.accessibilityLabel = "Still Loading" UIAccessibility.post(notification: .announcement, argument: "Still Loading") } } - + private func stopAnimating() { isAccessibilityElement = false icon.isHidden = true @@ -132,7 +133,7 @@ open class Loader: View { loadingTimer?.invalidate() loadingTimer = nil } - + deinit { stopAnimating() } diff --git a/VDS/Components/Tabs/Tabs.swift b/VDS/Components/Tabs/Tabs.swift index d6273771..0aa81bdf 100644 --- a/VDS/Components/Tabs/Tabs.swift +++ b/VDS/Components/Tabs/Tabs.swift @@ -171,6 +171,8 @@ open class Tabs: View { /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() + isAccessibilityElement = false + scrollView = UIScrollView() scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.showsHorizontalScrollIndicator = false @@ -262,6 +264,7 @@ open class Tabs: View { model.onClick?(tab.index) self.selectedIndex = tab.index self.onTabDidSelect?(tab.index) + let t = tabViews[tab.index] } } } @@ -301,7 +304,7 @@ open class Tabs: View { tabItem.orientation = orientation tabItem.surface = surface tabItem.indicatorPosition = indicatorPosition - tabItem.accessibilityHint = "\(index+1) of \(tabViews.count) Tabs" + tabItem.accessibilityValue = "\(index+1) of \(tabViews.count) Tabs" } } diff --git a/VDS/Extensions/UIView+Accessibility.swift b/VDS/Extensions/UIView+Accessibility.swift index 6c785c5e..e85b3f74 100644 --- a/VDS/Extensions/UIView+Accessibility.swift +++ b/VDS/Extensions/UIView+Accessibility.swift @@ -24,4 +24,30 @@ extension UIView { public func setAccessibilityLabel(for views: [UIView]) { accessibilityLabel = combineAccessibilityLabel(for: views) } + + /// Will tell if the view is actually visibile on screen, also it will check the hierarchy above this view. + public var isVisibleOnScreen: Bool { + // Ensure the view has a window, meaning it's part of the view hierarchy + guard let window = self.window, !self.isHidden, self.alpha > 0 else { + return false + } + + // Check if the view's frame intersects with the window's bounds + let viewFrameInWindow = self.convert(self.bounds, to: window) + var isIntersecting = viewFrameInWindow.intersects(window.bounds) + + // Check parent views for visibility + var currentView: UIView? = self + while let view = currentView, isIntersecting { + // If any parent has a constraint making it effectively invisible, set isIntersecting to false + if view.bounds.size.width == 0 || view.bounds.size.height == 0 { + isIntersecting = false + break + } + currentView = view.superview + } + + return isIntersecting + } + } diff --git a/VDS/SupportingFiles/ReleaseNotes.txt b/VDS/SupportingFiles/ReleaseNotes.txt index b4ae5bbb..fb0acb61 100644 --- a/VDS/SupportingFiles/ReleaseNotes.txt +++ b/VDS/SupportingFiles/ReleaseNotes.txt @@ -1,3 +1,11 @@ +1.0.54 +---------------- +- CXTDT-518373 Accessibility Voiceover is reading “Still Loading” after waiting for a short time in all the screens. + +1.0.53 +---------------- +- ONEAPP-4683 - Updated to accesibilityValue for the tabs position. + 1.0.52 ---------------- - ONEAPP-6244 - TitleLockup TitleLabel marked as .heading for Accessibility.