diff --git a/Display/ListView.swift b/Display/ListView.swift index 7dc6fa4960..06cbd5a42d 100644 --- a/Display/ListView.swift +++ b/Display/ListView.swift @@ -2973,8 +2973,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture var visibility: ListViewItemNodeVisibility = .none if visibilityRect.intersects(itemFrame) { let itemContentFrame = itemNode.apparentContentFrame - let full = itemContentFrame.minY >= visibilityRect.minY && itemContentFrame.maxY <= visibilityRect.maxY - visibility = .visible(full) + let intersection = itemContentFrame.intersection(visibilityRect) + let fraction = intersection.height / itemContentFrame.height + visibility = .visible(fraction) } var updateVisibility = false if !onlyPositive { diff --git a/Display/ListViewItemNode.swift b/Display/ListViewItemNode.swift index 0aca5a656a..9793f6f3a1 100644 --- a/Display/ListViewItemNode.swift +++ b/Display/ListViewItemNode.swift @@ -52,7 +52,7 @@ public struct ListViewItemNodeLayout { public enum ListViewItemNodeVisibility: Equatable { case none - case visible(Bool) + case visible(CGFloat) public static func ==(lhs: ListViewItemNodeVisibility, rhs: ListViewItemNodeVisibility) -> Bool { switch lhs { @@ -62,8 +62,8 @@ public enum ListViewItemNodeVisibility: Equatable { } else { return false } - case let .visible(full): - if case .visible(full) = rhs { + case let .visible(fraction): + if case .visible(fraction) = rhs { return true } else { return false diff --git a/Display/VolumeControlStatusBar.swift b/Display/VolumeControlStatusBar.swift index e7342c8c08..b3b3fc50b1 100644 --- a/Display/VolumeControlStatusBar.swift +++ b/Display/VolumeControlStatusBar.swift @@ -6,6 +6,8 @@ import SwiftSignalKit private let volumeNotificationKey = "AVSystemController_SystemVolumeDidChangeNotification" private let volumeParameterKey = "AVSystemController_AudioVolumeNotificationParameter" +private let changeReasonParameterKey = "AVSystemController_AudioVolumeChangeReasonNotificationParameter" +private let explicitChangeReasonValue = "ExplicitVolumeChange" final class VolumeControlStatusBar: UIView { private let control: MPVolumeView @@ -27,9 +29,9 @@ final class VolumeControlStatusBar: UIView { self.addSubview(self.control) self.observer = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: volumeNotificationKey), object: nil, queue: OperationQueue.main, using: { [weak self] notification in if let strongSelf = self, let userInfo = notification.userInfo { - /*guard let category = userInfo["AVSystemController_AudioCategoryNotificationParameter"] as? String else { + if let reason = userInfo[changeReasonParameterKey], reason as? String != explicitChangeReasonValue { return - }*/ + } if let volume = userInfo[volumeParameterKey] as? Float { let previous = strongSelf.currentValue