From b93d2f0d2a8c1bc8a478d203da13b91962a7fbf9 Mon Sep 17 00:00:00 2001 From: Florian Gabach Date: Fri, 8 Dec 2017 12:20:41 +0100 Subject: [PATCH] Bump to 2.0.1 --- CHANGELOG.md | 4 + .../UserInterfaceState.xcuserstate | Bin 20922 -> 24097 bytes .../Controller/OpenSourceViewController.swift | 137 +++++++++++------- .../Model/OpenSourceControllerConfig.swift | 2 +- 4 files changed, 87 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a6c15c..e327679 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Changelog ========== +### 2.0.1 + +- Clean code and move loader position + ### 2.0 - Swift 4 version diff --git a/Exemple/OpenSourceControllerDemo.xcodeproj/project.xcworkspace/xcuserdata/florian.gabach.xcuserdatad/UserInterfaceState.xcuserstate b/Exemple/OpenSourceControllerDemo.xcodeproj/project.xcworkspace/xcuserdata/florian.gabach.xcuserdatad/UserInterfaceState.xcuserstate index fb64516aad29eccf66dada0f4cda93cc2c3a954c..75854721b64283b966f8cdef4a0d9ab94b80eebf 100644 GIT binary patch delta 10396 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 ro<*K|&qmK?&-$b#(UG%bNT-ORms+3 diff --git a/Sources/Controller/OpenSourceViewController.swift b/Sources/Controller/OpenSourceViewController.swift index 6bfc80d..e07a7ee 100644 --- a/Sources/Controller/OpenSourceViewController.swift +++ b/Sources/Controller/OpenSourceViewController.swift @@ -7,21 +7,31 @@ import UIKit class OpenSourceViewController: UITableViewController { - + // MARK: - Var - + /// Loading indicator - fileprivate var indicator = UIActivityIndicatorView() - + fileprivate lazy var indicator: UIActivityIndicatorView = { + let indicator = UIActivityIndicatorView(frame:CGRect(x: 0, + y: 0, + width: 40, + height: 40) ) + indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray + indicator.hidesWhenStopped = true + indicator.backgroundColor = UIColor.clear + indicator.color = UIColor.black + return indicator + }() + /// TableViewCell identifier private let reuseIdentifier = "openSourceCell" - + /// Contains all licence object before downloaded internal var licences: [LicenceFile]? - + // Controller configuration for customization internal var config = OpenSourceControllerConfig() - + /// Contains all licences object after downloaded fileprivate var downloadedLicence: [LicenceFile]? { didSet { @@ -32,33 +42,45 @@ class OpenSourceViewController: UITableViewController { } } } - + // MARK: - Lifecyle - + override func viewDidLoad() { super.viewDidLoad() - - // Prepare tableview + + // Prepare controller + self.prepare() + } + + // MARK: - Prepare + + /// Prepare controller + fileprivate func prepare() { self.prepareTableView() - - // Download licences + self.prepareActivityIndicator() + self.prepareCloseButton() + self.prepareStyle() self.prepareLicences() } - - // MARK: - Prepare - + /// Download licences fileprivate func prepareLicences() { - if let licences = self.licences { - self.startLoading() - LicenceDownloader.downloadLicences(licences: licences, - config: self.config) { () in - // Update licences - self.downloadedLicence = self.licences - } + self.startLoading() + + // Retrieve licence + guard let licences = self.licences else { + print("No licences found.") + return + } + + // Download licence + LicenceDownloader.downloadLicences(licences: licences, + config: self.config) { () in + // Update licences + self.downloadedLicence = self.licences } } - + /// Init tableView dataSource, delegate, bar button & title fileprivate func prepareTableView() { // Common init @@ -70,46 +92,51 @@ class OpenSourceViewController: UITableViewController { self.tableView.dataSource = self self.tableView.delegate = self self.tableView.separatorStyle = .singleLine + + // Apply background color from configuration if needed if let backgroundColor = self.config.uiConfig.backgroundColor { self.tableView.backgroundColor = backgroundColor } - - // Navigation bar + } + + /// Prepare controller style + fileprivate func prepareStyle() { + // Apply navigation bar tint color if needed if let tintColor = self.config.uiConfig.barTintColor { self.navigationController?.navigationBar.barTintColor = tintColor } + + // Applu navigation bar text color if needed if let textColor = self.config.uiConfig.titleColor { - let attribut = [NSAttributedStringKey.foregroundColor: textColor] + let attribut = [NSAttributedStringKey.foregroundColor: textColor] self.navigationController?.navigationBar.titleTextAttributes = attribut } - + } + + /// Prepare close button on navigation bar + fileprivate func prepareCloseButton() { // Close button (on the right corner of navigation bar) let closeButton = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(self.closePicker)) closeButton.tintColor = config.uiConfig.closeButtonColor ?? UIColor.black self.navigationItem.rightBarButtonItem = closeButton - - // Loading indicator - self.prepareActivityIndicator() } - + // MARK: - Loading indicator - + /// Prepare UIActivityIndicatorView and display it at the center of the view fileprivate func prepareActivityIndicator() { - self.indicator = UIActivityIndicatorView(frame:CGRect(x: 0, - y: 0, - width: 40, - height: 40) ) - self.indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray - self.indicator.center = self.view.center - self.indicator.hidesWhenStopped = true - self.indicator.backgroundColor = UIColor.clear - self.indicator.color = UIColor.black + // Add to view self.view.addSubview(indicator) + + // Apply constraint + self.indicator.translatesAutoresizingMaskIntoConstraints = false + self.indicator.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true + let topConstraint = self.navigationController?.navigationBar.frame.size.height ?? 0.0 + self.indicator.bottomAnchor.constraint(equalTo: view.topAnchor, constant: topConstraint).isActive=true } - + /// Start loading : start the loader animation fileprivate func startLoading() { self.indicator.startAnimating() @@ -118,7 +145,7 @@ class OpenSourceViewController: UITableViewController { // Disable scroll self.tableView.isScrollEnabled = false } - + /// Stop loading : stop and hide the loader fileprivate func stopLoading() { self.indicator.stopAnimating() @@ -127,17 +154,17 @@ class OpenSourceViewController: UITableViewController { // Enable scroll self.tableView.isScrollEnabled = true } - + // MARK: - Table View Data Source - + override func numberOfSections(in tableView: UITableView) -> Int { return 1 } - + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.downloadedLicence?.count ?? 0 } - + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: self.reuseIdentifier, for: indexPath) as? OpenSourceTableViewCell @@ -146,29 +173,29 @@ class OpenSourceViewController: UITableViewController { cell = OpenSourceTableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: self.reuseIdentifier) } - + // Configure the cell with licence if let licence = self.downloadedLicence?.get(at: indexPath.row) { cell?.configure(licence: licence, config: self.config) } - + return cell! } - + override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { // Automatic dimension return UITableViewAutomaticDimension } - + // MARK: - Action - + /// Handler for click on close button @objc fileprivate func closePicker() { self.dismissController() } - + // MARK: - Navigation - + /// Dismiss the OpenSourceController func dismissController() { DispatchQueue.main.async { [weak self] in diff --git a/Sources/Model/OpenSourceControllerConfig.swift b/Sources/Model/OpenSourceControllerConfig.swift index a882a14..af55966 100644 --- a/Sources/Model/OpenSourceControllerConfig.swift +++ b/Sources/Model/OpenSourceControllerConfig.swift @@ -33,7 +33,7 @@ public struct OpenSourceControllerConfig { /// Will be applied to the navigation bar title public var title: String = "Tiers library" - // Verbose mode for print log when licence are downloaded + /// Verbose mode for print log when licence are downloaded public var verbose: Bool = false /// UI-specific configuration.