feat: removed SkeletonsPresenter and move all logic to extensions of UIView and UIViewController

This commit is contained in:
Nikita Semenov 2023-03-07 10:11:56 +03:00
parent 29347d77e1
commit 343d36cb85
3 changed files with 87 additions and 56 deletions

View File

@ -22,38 +22,38 @@
import UIKit
public protocol SkeletonsPresenter {
var baseView: UIView? { get }
var skeletonsConfiguration: SkeletonsConfiguration { get }
var isSkeletonsHidden: Bool { get }
var viewsToSkeletone: [UIView] { get }
extension UIView {
func showSkeletons()
func hideSkeletons()
func startAnimation()
func stopAnimation()
}
// MARK: - SkeletonsPresenter + Default implemetation
extension SkeletonsPresenter {
public var skeletonsConfiguration: SkeletonsConfiguration {
SkeletonsConfiguration()
@objc open var baseView: UIView? {
self
}
public func showSkeletons() {
@objc open var isSkeletonsHidden: Bool {
(layer.sublayers ?? []).first { $0 is SkeletonLayer } == nil
}
@objc open var viewsToSkeletone: [UIView] {
skeletonableViews
}
// MARK: - Public methods
public func showSkeletons(_ config: SkeletonsConfiguration = .init(),
viewsToSkeletone: [UIView]? = nil) {
guard let baseView = baseView else {
return
}
let viewsToSkeletone = viewsToSkeletone ?? self.viewsToSkeletone
baseView.isUserInteractionEnabled = false
viewsToSkeletone
.flatMap { view in
view.isHidden = true
return getSkeletonLayer(forView: view)
return getSkeletonLayer(forView: view, withConfiguration: config)
}
.map { layer in
layer.startAnimation()
@ -64,7 +64,7 @@ extension SkeletonsPresenter {
}
public func hideSkeletons() {
guard let baseView = baseView else {
guard let baseView = baseView ?? nil else {
return
}
@ -95,17 +95,19 @@ extension SkeletonsPresenter {
// MARK: - Private methods
private func getSkeletonLayer(forView view: UIView) -> [SkeletonLayer] {
let skeletonLayer = skeletonsConfiguration.createSkeletonLayer(for: baseView)
private func getSkeletonLayer(forView view: UIView,
withConfiguration conf: SkeletonsConfiguration) -> [SkeletonLayer] {
let skeletonLayer = conf.createSkeletonLayer(for: baseView)
var subviewSkeletonLayers = [SkeletonLayer]()
if view.isSkeletonsContainer {
if skeletonsConfiguration.borderWidth != .zero {
if conf.borderWidth != .zero {
skeletonLayer.bind(to: .container(view))
}
subviewSkeletonLayers = view.skeletonableViews
.map(getSkeletonLayer(forView:))
.map { getSkeletonLayer(forView: $0, withConfiguration: conf) }
.flatMap { $0 }
} else {
@ -116,38 +118,6 @@ extension SkeletonsPresenter {
}
}
// MARK: - UIView + SkeletonsPresenter
extension SkeletonsPresenter where Self: UIView {
public var baseView: UIView? {
self
}
public var isSkeletonsHidden: Bool {
(layer.sublayers ?? []).first { $0 is SkeletonLayer } == nil
}
public var viewsToSkeletone: [UIView] {
skeletonableViews
}
}
// MARK: - UIViewController + SkeletonsPresenter
extension SkeletonsPresenter where Self: UIViewController {
public var baseView: UIView? {
view
}
public var isSkeletonsHidden: Bool {
(view.layer.sublayers ?? []).first { $0 is SkeletonLayer } == nil
}
public var viewsToSkeletone: [UIView] {
baseView?.skeletonableViews ?? view.skeletonableViews
}
}
// MARK: - Helper extension
extension Array where Element: CALayer {

View File

@ -0,0 +1,8 @@
//
// File.swift
//
//
// Created by Nikita Semenov on 07.03.2023.
//
import Foundation

View File

@ -0,0 +1,53 @@
//
// Copyright (c) 2023 Touch Instinct
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the Software), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
import UIKit
extension UIViewController {
@objc open var baseView: UIView? {
view
}
@objc open var isSkeletonsHidden: Bool {
(view.layer.sublayers ?? []).first { $0 is SkeletonLayer } == nil
}
@objc open var viewsToSkeletone: [UIView] {
baseView?.skeletonableViews ?? view.skeletonableViews
}
public func showSkeletons(_ conf: SkeletonsConfiguration = .init()) {
baseView?.showSkeletons(conf, viewsToSkeletone: viewsToSkeletone)
}
public func hideSkeletons() {
baseView?.hideSkeletons()
}
public func startAnimation() {
baseView?.startAnimation()
}
public func stopAnimation() {
baseView?.stopAnimation()
}
}