From 23c2cbaceae33539b601619d100e4b990b1eb6a0 Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Sat, 11 Mar 2023 22:07:06 +0300 Subject: [PATCH] fix: code review notes --- .../Skeletons/Helpers/CGRect+Padding.swift | 6 ++-- .../Skeletons/Helpers/UIView+Skeletons.swift | 30 ++++++++++--------- .../Skeletons/Protocols/Skeletonable.swift | 2 +- .../SkeletonsConfigurationDelegate.swift | 2 +- .../Protocols/SkeletonsPresenter.swift | 8 ++--- .../Views/Skeletons/SkeletonLayer.swift | 2 +- .../UIView+PresentingSkeletons.swift | 25 +++++++--------- ...UIViewController+PresentingSkeletons.swift | 6 ++-- .../Skeletons.xcplaygroundpage/Contents.swift | 16 +++++----- docs/tiuielements/skeletons.md | 16 +++++----- 10 files changed, 55 insertions(+), 58 deletions(-) diff --git a/TIUIElements/Sources/Views/Skeletons/Helpers/CGRect+Padding.swift b/TIUIElements/Sources/Views/Skeletons/Helpers/CGRect+Padding.swift index f6a585c5..98702362 100644 --- a/TIUIElements/Sources/Views/Skeletons/Helpers/CGRect+Padding.swift +++ b/TIUIElements/Sources/Views/Skeletons/Helpers/CGRect+Padding.swift @@ -30,9 +30,9 @@ extension CGRect { height: height) } - func reduceSize(byPadding p: UIEdgeInsets) -> CGRect { - let reducedWidth = width - p.left - p.right - let reducedHeight = height - p.top - p.bottom + func reduceSize(byPadding padding: UIEdgeInsets) -> CGRect { + let reducedWidth = width - padding.left - padding.right + let reducedHeight = height - padding.top - padding.bottom let reducedSize = CGSize(width: reducedWidth, height: reducedHeight) return CGRect(origin: origin, size: reducedSize) diff --git a/TIUIElements/Sources/Views/Skeletons/Helpers/UIView+Skeletons.swift b/TIUIElements/Sources/Views/Skeletons/Helpers/UIView+Skeletons.swift index 5dfcd05a..9582d4c1 100644 --- a/TIUIElements/Sources/Views/Skeletons/Helpers/UIView+Skeletons.swift +++ b/TIUIElements/Sources/Views/Skeletons/Helpers/UIView+Skeletons.swift @@ -50,7 +50,7 @@ extension UILabel { extension UIView { public var skeletonableViews: [UIView] { if let skeletonableView = self as? Skeletonable { - return skeletonableView.viewsToSkeletone + return skeletonableView.viewsToSkeletones } return subviews @@ -58,7 +58,7 @@ extension UIView { var isSkeletonsContainer: Bool { if let skeletonableView = self as? Skeletonable { - return !skeletonableView.viewsToSkeletone.isEmpty + return !skeletonableView.viewsToSkeletones.isEmpty } return !subviews.isEmpty @@ -67,19 +67,21 @@ extension UIView { var viewType: SkeletonLayer.ViewType { if let labelView = self as? UILabel { return .label(labelView) - - } else if let textView = self as? UITextView { - return .textView(textView) - - } else if let imageView = self as? UIImageView { - return .imageView(imageView) - - } else if self.isSkeletonsContainer { - return .parentView(self) - - } else { - return .leafView(self) } + + if let textView = self as? UITextView { + return .textView(textView) + } + + if let imageView = self as? UIImageView { + return .imageView(imageView) + } + + if self.isSkeletonsContainer { + return .parentView(self) + } + + return .leafView(self) } fileprivate func isMultiline(text: String?, diff --git a/TIUIElements/Sources/Views/Skeletons/Protocols/Skeletonable.swift b/TIUIElements/Sources/Views/Skeletons/Protocols/Skeletonable.swift index 8b8020b2..ce619890 100644 --- a/TIUIElements/Sources/Views/Skeletons/Protocols/Skeletonable.swift +++ b/TIUIElements/Sources/Views/Skeletons/Protocols/Skeletonable.swift @@ -23,5 +23,5 @@ import class UIKit.UIView public protocol Skeletonable { - var viewsToSkeletone: [UIView] { get } + var viewsToSkeletones: [UIView] { get } } diff --git a/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsConfigurationDelegate.swift b/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsConfigurationDelegate.swift index 7caf34fc..fbd1b9f8 100644 --- a/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsConfigurationDelegate.swift +++ b/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsConfigurationDelegate.swift @@ -21,5 +21,5 @@ // public protocol SkeletonsConfigurationDelegate: AnyObject { - func layerDidConfigured(forViewType type: SkeletonLayer.ViewType, layer: SkeletonLayer) + func layerDidConfigured(_ layer: SkeletonLayer, forViewType type: SkeletonLayer.ViewType) } diff --git a/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsPresenter.swift b/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsPresenter.swift index d225b6db..de8c4c9c 100644 --- a/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsPresenter.swift +++ b/TIUIElements/Sources/Views/Skeletons/Protocols/SkeletonsPresenter.swift @@ -26,7 +26,7 @@ public protocol SkeletonsPresenter { var skeletonsHolder: UIView { get } var skeletonsConfiguration: SkeletonsConfiguration { get } var isSkeletonsHidden: Bool { get } - var viewsToSkeletone: [UIView] { get } + var viewsToSkeletones: [UIView] { get } func showSkeletons() func hideSkeletons() @@ -46,17 +46,17 @@ extension SkeletonsPresenter { isSkeletonsHidden(forView: skeletonsHolder) } - public var viewsToSkeletone: [UIView] { + public var viewsToSkeletones: [UIView] { skeletonsHolder.skeletonableViews } public func showSkeletons() { - skeletonsHolder.showSkeletons(viewsToSkeletone: viewsToSkeletone, + skeletonsHolder.showSkeletons(viewsToSkeletones: viewsToSkeletones, skeletonsConfiguration) } func isSkeletonsHidden(forView view: UIView) -> Bool { - (view.layer.sublayers ?? []).first { $0 is SkeletonLayer } == nil + view.layer.skeletonLayers.isEmpty } } diff --git a/TIUIElements/Sources/Views/Skeletons/SkeletonLayer.swift b/TIUIElements/Sources/Views/Skeletons/SkeletonLayer.swift index dd293ed7..758765ff 100644 --- a/TIUIElements/Sources/Views/Skeletons/SkeletonLayer.swift +++ b/TIUIElements/Sources/Views/Skeletons/SkeletonLayer.swift @@ -115,7 +115,7 @@ open class SkeletonLayer: CAShapeLayer { } } - configuration.configurationDelegate?.layerDidConfigured(forViewType: viewType, layer: self) + configuration.configurationDelegate?.layerDidConfigured(self, forViewType: viewType) } open func remove(from view: UIView) { diff --git a/TIUIElements/Sources/Views/Skeletons/UIView+PresentingSkeletons.swift b/TIUIElements/Sources/Views/Skeletons/UIView+PresentingSkeletons.swift index 039d21d1..129113f3 100644 --- a/TIUIElements/Sources/Views/Skeletons/UIView+PresentingSkeletons.swift +++ b/TIUIElements/Sources/Views/Skeletons/UIView+PresentingSkeletons.swift @@ -30,17 +30,17 @@ extension UIView { /// Shows skeletons on the view /// /// - Parameters: - /// - viewsToSkeletone: views that will be converted to skeletones. If nil was passed subviews will be converted to skeletons + /// - viewsToSkeletones: views that will be converted to skeletones. If nil was passed subviews will be converted to skeletons /// - config: configuration of the skeletons' layers - public func showSkeletons(viewsToSkeletone: [UIView]?, + public func showSkeletons(viewsToSkeletones: [UIView]?, _ config: SkeletonsConfiguration) { - let viewsToSkeletone = viewsToSkeletone ?? skeletonableViews + let viewsToSkeletones = viewsToSkeletones ?? skeletonableViews isUserInteractionEnabled = false configureBaseLayer(withConfiguration: config) - viewsToSkeletone + viewsToSkeletones .flatMap { view in getSkeletonLayer(forView: view, withConfiguration: config) } @@ -55,23 +55,18 @@ extension UIView { public func hideSkeletons() { isUserInteractionEnabled = true - layer.sublayers?.forEach { layer in - if let layer = layer as? SkeletonLayer { - layer.remove(from: self) - } - } + layer.skeletonLayers + .forEach { $0.remove(from: self) } } public func startAnimation() { - layer.skeletonLayers.forEach { layer in - layer.startAnimation() - } + layer.skeletonLayers + .forEach { $0.startAnimation() } } public func stopAnimation() { - layer.skeletonLayers.forEach { layer in - layer.stopAnimation() - } + layer.skeletonLayers + .forEach { $0.stopAnimation() } } // MARK: - Private methods diff --git a/TIUIElements/Sources/Views/Skeletons/UIViewController+PresentingSkeletons.swift b/TIUIElements/Sources/Views/Skeletons/UIViewController+PresentingSkeletons.swift index 3af38aa4..3402d013 100644 --- a/TIUIElements/Sources/Views/Skeletons/UIViewController+PresentingSkeletons.swift +++ b/TIUIElements/Sources/Views/Skeletons/UIViewController+PresentingSkeletons.swift @@ -27,12 +27,12 @@ extension UIViewController { /// Shows skeletons /// /// - Parameters: - /// - viewsToSkeletone: views that will be converted to skeletones. If nil was passed subviews of the view will be converted to skeletons + /// - viewsToSkeletones: views that will be converted to skeletones. If nil was passed subviews of the view will be converted to skeletons /// - config: configuration of the skeletons' layers - public func showSkeletons(viewsToSkeletone: [UIView]?, + public func showSkeletons(viewsToSkeletones: [UIView]?, _ config: SkeletonsConfiguration) { - view.showSkeletons(viewsToSkeletone: viewsToSkeletone, config) + view.showSkeletons(viewsToSkeletones: viewsToSkeletones, config) } public func hideSkeletons() { diff --git a/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Skeletons.xcplaygroundpage/Contents.swift b/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Skeletons.xcplaygroundpage/Contents.swift index fffb4049..8ddbc2a4 100644 --- a/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Skeletons.xcplaygroundpage/Contents.swift +++ b/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Skeletons.xcplaygroundpage/Contents.swift @@ -15,9 +15,9 @@ ## Как начать пользоваться Базовая настройка для показа скелетонов не требуется. `UIView` и `UIViewController` уже имеют все необходимые методы для работы: - - `showSkeletons(viewsToSkeletone:_:)` : используется для показа скелетонов, если была передана конфигурация анимации, то она запустится автоматически. `viewsToSkeletone` - опциональный массив `UIView`, определяющий, какие вью будут конвертироваться в скелетоны. Если nil, то проход будет осуществляться по списку subview + - `showSkeletons(viewsToSkeletones:_:)` : используется для показа скелетонов, если была передана конфигурация анимации, то она запустится автоматически. `viewsToSkeletones` - опциональный массив `UIView`, определяющий, какие вью будут конвертироваться в скелетоны. Если nil, то проход будет осуществляться по списку subview - `hideSkeletons()` : используется для скрытия скелетонов - - `startAnimation()` : используется для старта анимации на скелетонах (если анимания не была сконфигурирована в методе `showSkeletons(viewsToSkeletone:_:)` то ничего не произойдет) + - `startAnimation()` : используется для старта анимации на скелетонах (если анимания не была сконфигурирована в методе `showSkeletons(viewsToSkeletones:_:)` то ничего не произойдет) - `stopAnimation()` : используется для остановки анимации на скелетонах */ import TIUIKitCore @@ -86,8 +86,8 @@ class CanShowAndHideSkeletons: BaseInitializableViewController { } @objc private func toggleSkeletons() { - // Т.к. передается nil, скелетонится будут все subview (в данном случае view.subview == [button, label, imageView]) - showSkeletons(viewsToSkeletone: nil, .init()) + // Т.к. передается nil, скелетониться будут все subview (в данном случае view.subview == [button, label, imageView]) + showSkeletons(viewsToSkeletones: nil, .init()) DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) { [weak self] in self?.hideSkeletons() @@ -101,7 +101,7 @@ class CanShowAndHideSkeletons: BaseInitializableViewController { Если необходимо изменить список конвертируемых в скелетоны view у какой-нибудь из отдельных view в иерархии, можно подписать его под протокол `Skeletonable` */ extension UITableViewCell: Skeletonable { - public var viewsToSkeletone: [UIView] { + public var viewsToSkeletones: [UIView] { contentView.subviews } } @@ -251,12 +251,12 @@ var confWithPadding: SkeletonsConfiguration { ```swift public protocol SkeletonsConfigurationDelegate: AnyObject { - func layerDidConfigured(forViewType type: SkeletonLayer.ViewType, layer: SkeletonLayer) + func layerDidConfigured(_ layer: SkeletonLayer, forViewType type: SkeletonLayer.ViewType) } ``` */ class SkeletonsConfDelegate: SkeletonsConfigurationDelegate { - func layerDidConfigured(forViewType type: SkeletonLayer.ViewType, layer: SkeletonLayer) { + func layerDidConfigured(_ layer: SkeletonLayer, forViewType type: SkeletonLayer.ViewType) { if case .imageView(_) = type { layer.frame = .init(x: layer.frame.minX - 20, y: layer.frame.minY - 20, @@ -312,4 +312,4 @@ confWithLeftToRightAnim.labelConfiguration = .init(numberOfLines: 2) PlaygroundPage.current.liveView = canShowAndHideController -canShowAndHideController.showSkeletons(viewsToSkeletone: nil, confWithLeftToRightAnim) +canShowAndHideController.showSkeletons(viewsToSkeletones: nil, confWithLeftToRightAnim) diff --git a/docs/tiuielements/skeletons.md b/docs/tiuielements/skeletons.md index 3d6fd882..e79e6152 100644 --- a/docs/tiuielements/skeletons.md +++ b/docs/tiuielements/skeletons.md @@ -15,9 +15,9 @@ ## Как начать пользоваться Базовая настройка для показа скелетонов не требуется. `UIView` и `UIViewController` уже имеют все необходимые методы для работы: - - `showSkeletons(viewsToSkeletone:_:)` : используется для показа скелетонов, если была передана конфигурация анимации, то она запустится автоматически. `viewsToSkeletone` - опциональный массив `UIView`, определяющий, какие вью будут конвертироваться в скелетоны. Если nil, то проход будет осуществляться по списку subview + - `showSkeletons(viewsToSkeletones:_:)` : используется для показа скелетонов, если была передана конфигурация анимации, то она запустится автоматически. `viewsToSkeletones` - опциональный массив `UIView`, определяющий, какие вью будут конвертироваться в скелетоны. Если nil, то проход будет осуществляться по списку subview - `hideSkeletons()` : используется для скрытия скелетонов - - `startAnimation()` : используется для старта анимации на скелетонах (если анимания не была сконфигурирована в методе `showSkeletons(viewsToSkeletone:_:)` то ничего не произойдет) + - `startAnimation()` : используется для старта анимации на скелетонах (если анимания не была сконфигурирована в методе `showSkeletons(viewsToSkeletones:_:)` то ничего не произойдет) - `stopAnimation()` : используется для остановки анимации на скелетонах ```swift @@ -87,8 +87,8 @@ class CanShowAndHideSkeletons: BaseInitializableViewController { } @objc private func toggleSkeletons() { - // Т.к. передается nil, скелетонится будут все subview (в данном случае view.subview == [button, label, imageView]) - showSkeletons(viewsToSkeletone: nil, .init()) + // Т.к. передается nil, скелетониться будут все subview (в данном случае view.subview == [button, label, imageView]) + showSkeletons(viewsToSkeletones: nil, .init()) DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) { [weak self] in self?.hideSkeletons() @@ -103,7 +103,7 @@ class CanShowAndHideSkeletons: BaseInitializableViewController { ```swift extension UITableViewCell: Skeletonable { - public var viewsToSkeletone: [UIView] { + public var viewsToSkeletones: [UIView] { contentView.subviews } } @@ -270,13 +270,13 @@ var confWithPadding: SkeletonsConfiguration { ```swift public protocol SkeletonsConfigurationDelegate: AnyObject { - func layerDidConfigured(forViewType type: SkeletonLayer.ViewType, layer: SkeletonLayer) + func layerDidConfigured(_ layer: SkeletonLayer, forViewType type: SkeletonLayer.ViewType) } ``` ```swift class SkeletonsConfDelegate: SkeletonsConfigurationDelegate { - func layerDidConfigured(forViewType type: SkeletonLayer.ViewType, layer: SkeletonLayer) { + func layerDidConfigured(_ layer: SkeletonLayer, forViewType type: SkeletonLayer.ViewType) { if case .imageView(_) = type { layer.frame = .init(x: layer.frame.minX - 20, y: layer.frame.minY - 20, @@ -336,5 +336,5 @@ confWithLeftToRightAnim.labelConfiguration = .init(numberOfLines: 2) PlaygroundPage.current.liveView = canShowAndHideController -canShowAndHideController.showSkeletons(viewsToSkeletone: nil, confWithLeftToRightAnim) +canShowAndHideController.showSkeletons(viewsToSkeletones: nil, confWithLeftToRightAnim) ```