PresentationModalSize.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // Created by Tom Baranes on 17/07/16.
  3. // Copyright © 2016 Jake Lin. All rights reserved.
  4. //
  5. import UIKit
  6. public enum PresentationModalSize: IBEnum {
  7. case half
  8. case full
  9. case third
  10. case quarter
  11. case fifth
  12. case sixth
  13. case seventh
  14. case eighth
  15. case threeQuarters
  16. case twoThirds
  17. case goldenSmall
  18. case goldenLarge
  19. case custom(size: Float)
  20. case preferred
  21. func width(parentSize: CGSize) -> Float {
  22. return size(for: Float(parentSize.width))
  23. }
  24. func height(parentSize: CGSize) -> Float {
  25. return size(for: Float(parentSize.height))
  26. }
  27. public static let `default`: PresentationModalSize = .half
  28. private func size(for value: Float) -> Float {
  29. switch self {
  30. case .half:
  31. return floorf(value / 2.0)
  32. case .full:
  33. return value
  34. case .third:
  35. return floorf(value / 3.0)
  36. case .quarter:
  37. return floorf(value / 4.0)
  38. case .fifth:
  39. return floorf(value / 5.0)
  40. case .sixth:
  41. return floorf(value / 6.0)
  42. case .seventh:
  43. return floorf(value / 7.0)
  44. case .eighth:
  45. return floorf(value / 8.0)
  46. case .threeQuarters:
  47. return floorf(3.0 * value / 4.0)
  48. case .twoThirds:
  49. return floorf(2.0 * value / 3.0)
  50. case .goldenSmall:
  51. return floorf(value - value / goldenRatio)
  52. case .goldenLarge:
  53. return floorf(value / goldenRatio)
  54. case .custom(let size):
  55. return size
  56. case .preferred:
  57. return PresentationModalSize.default.size(for: value)
  58. }
  59. }
  60. }
  61. private let goldenRatio: Float = (1.0 + CoreFoundation.sqrt(5.0)) / 2.0
  62. public extension PresentationModalSize {
  63. init?(string: String?) {
  64. guard let string = string else {
  65. return nil
  66. }
  67. let (name, params) = PresentationModalSize.extractNameAndParams(from: string)
  68. switch name {
  69. case "half":
  70. self = .half
  71. case "full":
  72. self = .full
  73. case "third":
  74. self = .third
  75. case "quarter":
  76. self = .quarter
  77. case "fifth":
  78. self = .fifth
  79. case "sixth":
  80. self = .sixth
  81. case "seventh":
  82. self = .seventh
  83. case "eighth":
  84. self = .eighth
  85. case "threequarters":
  86. self = .threeQuarters
  87. case "twothirds":
  88. self = .twoThirds
  89. case "goldensmall":
  90. self = .goldenSmall
  91. case "goldenlarge", "goldenratio":
  92. self = .goldenLarge
  93. case "custom" where params.count == 1:
  94. self = .custom(size: params[0].toFloat() ?? 0)
  95. case "preferred":
  96. self = .preferred
  97. default:
  98. return nil
  99. }
  100. }
  101. }