ConstraintMaker.swift 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //
  2. // ConstraintMaker.swift
  3. // Snappy
  4. //
  5. // Created by Jonas Budelmann on 25/07/14.
  6. // Copyright (c) 2014 Jonas Budelmann. All rights reserved.
  7. //
  8. import UIKit
  9. class ConstraintMaker: ConstraintDelegate {
  10. var constraints = [Constraint]()
  11. weak var view: View?
  12. init(view: View) {
  13. self.view = view
  14. }
  15. var left: Constraint { return addConstraint(.Left) }
  16. var top: Constraint { return addConstraint(.Top) }
  17. var right: Constraint { return addConstraint(.Right) }
  18. var bottom: Constraint { return addConstraint(.Bottom) }
  19. var leading: Constraint { return addConstraint(.Leading) }
  20. var trailing: Constraint { return addConstraint(.Trailing) }
  21. var width: Constraint { return addConstraint(.Width) }
  22. var height: Constraint { return addConstraint(.Height) }
  23. var centerX: Constraint { return addConstraint(.CenterX) }
  24. var centerY: Constraint { return addConstraint(.CenterY) }
  25. var baseline: Constraint { return addConstraint(.Baseline) }
  26. //TODO
  27. var edges: Constraint { return addConstraints(.Top, .Left, .Bottom, .Right) }
  28. var size: Constraint { return addConstraints(.Width, .Height) }
  29. var center: Constraint { return addConstraints(.CenterX, .CenterY) }
  30. func install() {
  31. for constraint in constraints {
  32. constraint.install()
  33. }
  34. self.constraints.removeAll(keepCapacity: true)
  35. }
  36. func addConstraint(layoutAttribute: NSLayoutAttribute) -> Constraint {
  37. return constraint(nil, addConstraintWithLayoutAttribute: layoutAttribute)
  38. }
  39. func addConstraints(layoutAttributes: NSLayoutAttribute...) -> Constraint {
  40. var children = layoutAttributes.map({ (attr: NSLayoutAttribute) -> Constraint in
  41. var viewAttribute = ViewAttribute(view: self.view, layoutAttribute: attr)
  42. return ViewConstraint(view: self.view!, firstViewAttribute: viewAttribute)
  43. })
  44. var constraint = CompositeConstraint(children: children)
  45. constraint.delegate = self
  46. self.constraints.append(constraint)
  47. return constraint
  48. }
  49. func constraint(constraint: Constraint, shouldBeReplacedWithConstraint replacementConstraint: Constraint) {
  50. var index: Int?
  51. for (i, c) in enumerate(self.constraints) {
  52. if (c === constraint) {
  53. index = i
  54. }
  55. }
  56. if (index) {
  57. self.constraints[index!] = replacementConstraint
  58. }
  59. }
  60. func constraint(constraint: Constraint?, addConstraintWithLayoutAttribute layoutAttribute: NSLayoutAttribute) -> Constraint {
  61. var viewAttribute = ViewAttribute(view: self.view, layoutAttribute: layoutAttribute)
  62. var newConstraint = ViewConstraint(view: self.view!, firstViewAttribute: viewAttribute)
  63. if let viewConstraint = constraint as? ViewConstraint {
  64. //replace with composite constraint
  65. var children = [viewConstraint, newConstraint]
  66. var compositeConstraint = CompositeConstraint(children: children)
  67. compositeConstraint.delegate = self
  68. self.constraint(viewConstraint, shouldBeReplacedWithConstraint:compositeConstraint);
  69. return compositeConstraint
  70. }
  71. if (!constraint) {
  72. newConstraint.delegate = self
  73. self.constraints.append(newConstraint)
  74. }
  75. return newConstraint
  76. }
  77. }