45 lines
1.4 KiB
Swift
45 lines
1.4 KiB
Swift
//
|
|
// 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) {
|
|
guard let dataSource = dataSource,
|
|
let numberOfSections = dataSource.numberOfSections,
|
|
indexPath.section < numberOfSections(self),
|
|
indexPath.row < dataSource.tableView(self, numberOfRowsInSection: indexPath.section) else {
|
|
return
|
|
}
|
|
|
|
selectRow(at: indexPath, animated: animations.contains(.select), scrollPosition: .none)
|
|
|
|
if let visibleIndexPaths = indexPathsForRows(in: safeAreaLayoutGuide.layoutFrame) {
|
|
if !(visibleIndexPaths.contains(indexPath) && cellCompletelyVisible(indexPath)) {
|
|
scrollToRow(at: indexPath, at: .middle, animated: animations.contains(.scroll))
|
|
}
|
|
}
|
|
}
|
|
|
|
func cellCompletelyVisible(_ 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
|
|
}
|
|
}
|