Make animations individually selectable and no longer animate navigation selections. Issue #1439

This commit is contained in:
Maurice Parker
2020-01-27 21:57:52 -07:00
parent 118ecd01b0
commit 6ac6136612
7 changed files with 126 additions and 54 deletions

View File

@@ -0,0 +1,27 @@
//
// Animations.swift
// NetNewsWire-iOS
//
// Created by Maurice Parker on 1/27/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import Foundation
/// Used to select which animations should be performed
public struct Animations: OptionSet {
/// Select and deslections will be animated.
public static let select = Animations(rawValue: 1)
/// Scrolling will be animated
public static let scroll = Animations(rawValue: 2)
/// Pushing and popping navigation view controllers will be animated
public static let navigation = Animations(rawValue: 4)
public let rawValue: Int
public init(rawValue: Int) {
self.rawValue = rawValue
}
}

View File

@@ -0,0 +1,37 @@
//
// UITableView-Extensions.swift
// RSCoreiOS
//
// Created by Maurice Parker on 9/6/19.
// Copyright © 2019 Ranchero Software, LLC. All rights reserved.
//
import UIKit
extension UITableView {
/**
Selects a row and scrolls it to the middle if it is not visible
*/
public func selectRowAndScrollIfNotVisible(at indexPath: IndexPath, animations: Animations) {
selectRow(at: indexPath, animated: animations.contains(.select), scrollPosition: .none)
if let visibleIndexPaths = indexPathsForRows(in: safeAreaLayoutGuide.layoutFrame) {
if !(visibleIndexPaths.contains(indexPath) && cellCompletelyVisable(indexPath)) {
selectRow(at: indexPath, animated: animations.contains(.scroll), scrollPosition: .middle)
}
}
}
func cellCompletelyVisable(_ indexPath: IndexPath) -> Bool {
let rect = rectForRow(at: indexPath)
return safeAreaLayoutGuide.layoutFrame.contains(rect)
}
public func middleVisibleRow() -> IndexPath? {
if let visibleIndexPaths = indexPathsForRows(in: safeAreaLayoutGuide.layoutFrame), visibleIndexPaths.count > 2 {
return visibleIndexPaths[visibleIndexPaths.count / 2]
}
return nil
}
}