ViewConstraint.swift 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. //
  2. // ViewConstraint.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 ViewConstraint: Constraint {
  10. weak var view: View?
  11. var firstViewAttribute: ViewAttribute
  12. var secondViewAttribute: ViewAttribute?
  13. var layoutPriority = 1000.0// UILayoutPriorityRequired gives error?!
  14. var layoutMultiplier = 1.0
  15. var layoutConstraint: NSLayoutConstraint?
  16. var layoutRelation: NSLayoutRelation?
  17. var layoutConstant: Float
  18. weak var delegate: ConstraintDelegate?
  19. init(view: View, firstViewAttribute: ViewAttribute) {
  20. self.view = view;
  21. self.firstViewAttribute = firstViewAttribute;
  22. self.layoutPriority = 1000.0// UILayoutPriorityRequired gives error?!
  23. self.layoutMultiplier = 1.0
  24. self.layoutConstant = 0.0
  25. }
  26. var left: Constraint { return addConstraint(.Left) }
  27. var top: Constraint { return addConstraint(.Top) }
  28. var right: Constraint { return addConstraint(.Right) }
  29. var bottom: Constraint { return addConstraint(.Bottom) }
  30. var leading: Constraint { return addConstraint(.Leading) }
  31. var trailing: Constraint { return addConstraint(.Trailing) }
  32. var width: Constraint { return addConstraint(.Width) }
  33. var height: Constraint { return addConstraint(.Height) }
  34. var centerX: Constraint { return addConstraint(.CenterX) }
  35. var centerY: Constraint { return addConstraint(.CenterY) }
  36. var baseline: Constraint { return addConstraint(.Baseline) }
  37. var and: Constraint { return self }
  38. var with: Constraint { return self }
  39. func addConstraint(attr: NSLayoutAttribute) -> Constraint {
  40. if (self.layoutRelation) {
  41. //TODO use assert
  42. println("Attributes should be chained before defining the constraint relation")
  43. }
  44. return self.delegate!.constraint(self, addConstraintWithLayoutAttribute:attr)
  45. }
  46. func equality(relation: NSLayoutRelation, attr: Any) -> Constraint {
  47. layoutRelation = relation
  48. switch attr {
  49. case let view as View:
  50. secondViewAttribute = ViewAttribute(view: firstViewAttribute.view, layoutAttribute: firstViewAttribute.layoutAttribute)
  51. case let offset as Float:
  52. layoutConstant = offset
  53. case let number as NSNumber:
  54. layoutConstant = number
  55. case let viewAttribute as ViewAttribute:
  56. secondViewAttribute = viewAttribute
  57. case let size as CGSize:
  58. sizeOffset(size)
  59. case let point as CGPoint:
  60. centerOffset(point)
  61. case let inset as UIEdgeInsets:
  62. insets(inset)
  63. default:
  64. println("unsupported value: \(attr)")
  65. }
  66. // } else if (strcmp(value.objCType, @encode(CGPoint)) == 0) {
  67. // CGPoint point;
  68. // [value getValue:&point];
  69. // self.centerOffset = point;
  70. // } else if (strcmp(value.objCType, @encode(CGSize)) == 0) {
  71. // CGSize size;
  72. // [value getValue:&size];
  73. // self.sizeOffset = size;
  74. // } else if (strcmp(value.objCType, @encode(MASEdgeInsets)) == 0) {
  75. // MASEdgeInsets insets;
  76. // [value getValue:&insets];
  77. // self.insets = insets;
  78. // } else {
  79. // NSAssert(NO, @"attempting to set layout constant with unsupported value: %@", value);
  80. // }
  81. return self;
  82. }
  83. private func sizeOffset(size: CGSize) {
  84. switch (firstViewAttribute.layoutAttribute) {
  85. case .Width:
  86. layoutConstant = Float(size.width);
  87. break;
  88. case .Height:
  89. layoutConstant = Float(size.height);
  90. break;
  91. default:
  92. break;
  93. }
  94. }
  95. private func centerOffset(point: CGPoint) {
  96. switch (firstViewAttribute.layoutAttribute) {
  97. case .CenterX:
  98. layoutConstant = Float(point.x);
  99. break;
  100. case .CenterY:
  101. layoutConstant = Float(point.y);
  102. break;
  103. default:
  104. break;
  105. }
  106. }
  107. func insets(insets: UIEdgeInsets) -> Constraint {
  108. switch (firstViewAttribute.layoutAttribute) {
  109. case .Left:
  110. layoutConstant = Float(insets.left);
  111. break;
  112. case .Top:
  113. layoutConstant = Float(insets.top);
  114. break;
  115. case .Bottom:
  116. layoutConstant = Float(-insets.bottom);
  117. break;
  118. case .Right:
  119. layoutConstant = Float(-insets.right);
  120. break;
  121. default:
  122. break;
  123. }
  124. return self;
  125. }
  126. func equalTo(attr: Any) -> Constraint {
  127. return equality(.Equal, attr: attr)
  128. }
  129. func greaterThanOrEqualTo(attr: Any) -> Constraint {
  130. return equality(.GreaterThanOrEqual, attr: attr)
  131. }
  132. func lessThanOrEqualTo(attr: Any) -> Constraint {
  133. return equality(.LessThanOrEqual, attr: attr)
  134. }
  135. func insets(insets: Any) -> Constraint {
  136. return self
  137. }
  138. func offset(offset: Any) -> Constraint {
  139. return self
  140. }
  141. func multipliedBy(multiplier: Float) -> Constraint {
  142. return self
  143. }
  144. func dividedBy(divider: Float) -> Constraint {
  145. return self
  146. }
  147. func priority(priority: UILayoutPriority) -> Constraint {
  148. return self
  149. }
  150. func priorityLow() -> Constraint {
  151. return self
  152. }
  153. func priorityMedium() -> Constraint {
  154. return self
  155. }
  156. func priorityHigh() -> Constraint {
  157. return self
  158. }
  159. func install() {
  160. }
  161. }