Skip to content

Instantly share code, notes, and snippets.

@ksmandersen
Created June 28, 2016 08:58
Show Gist options
  • Save ksmandersen/67a81d8d1be096a3cfa8f325ac332520 to your computer and use it in GitHub Desktop.
Save ksmandersen/67a81d8d1be096a3cfa8f325ac332520 to your computer and use it in GitHub Desktop.
import UIKit
import GenericViewKit
public class StateView: GenericView {
public enum State {
case Loading
case Loaded
case Error
}
public var state: State = .Loading {
didSet { didUpdateState() }
}
public var style: ContentStyle = .Dark {
didSet {
errorView.style = style
activityIndicator.color = style.primaryColor
}
}
public var minimumIntrinsicContentHeight: CGFloat = 0 {
didSet { invalidateIntrinsicContentSize() }
}
public let errorView = ErrorView()
public let contentView = UIView()
private let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)
public override func intrinsicContentSize() -> CGSize {
let size: CGSize
switch state {
case .Loading: size = activityIndicator.intrinsicContentSize()
case .Loaded: size = contentView.intrinsicContentSize()
case .Error: size = errorView.intrinsicContentSize()
}
return CGSize(width: size.width, height: max(minimumIntrinsicContentHeight, size.height))
}
public override func configureView() {
super.configureView()
activityIndicator.hidesWhenStopped = true
contentView.hidden = true
addSubview(contentView)
addSubview(activityIndicator)
addSubview(errorView)
contentView.setEdgesEqualToSuperview()
activityIndicator.setCenterInSuperview()
errorView.setCenterInSuperview()
errorView.setWidthEqual(self, multiplier: 2/3)
didUpdateState()
translatesAutoresizingMaskIntoConstraints = true
}
public func showError(message: String?) {
let fallbackError = R.string.localizable.genericErrorSomethingWrong()
errorView.errorLabel.text = message ?? fallbackError
state = .Error
}
private func didUpdateState() {
switch state {
case .Loading:
contentView.hidden = false
errorView.hidden = true
activityIndicator.startAnimating()
case .Loaded:
contentView.hidden = false
errorView.hidden = true
activityIndicator.stopAnimating()
case .Error:
contentView.hidden = true
errorView.hidden = false
activityIndicator.stopAnimating()
}
invalidateIntrinsicContentSize()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment