View+MASAdditions.m 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. //
  2. // UIView+MASAdditions.m
  3. // Masonry
  4. //
  5. // Created by Jonas Budelmann on 20/07/13.
  6. // Copyright (c) 2013 cloudling. All rights reserved.
  7. //
  8. #import "View+MASAdditions.h"
  9. #import <objc/runtime.h>
  10. @implementation MAS_VIEW (MASAdditions)
  11. - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
  12. self.translatesAutoresizingMaskIntoConstraints = NO;
  13. MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
  14. block(constraintMaker);
  15. return [constraintMaker install];
  16. }
  17. - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
  18. self.translatesAutoresizingMaskIntoConstraints = NO;
  19. MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
  20. constraintMaker.updateExisting = YES;
  21. block(constraintMaker);
  22. return [constraintMaker install];
  23. }
  24. - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
  25. self.translatesAutoresizingMaskIntoConstraints = NO;
  26. MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
  27. constraintMaker.removeExisting = YES;
  28. block(constraintMaker);
  29. return [constraintMaker install];
  30. }
  31. #pragma mark - NSLayoutAttribute properties
  32. - (MASViewAttribute *)mas_left {
  33. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft];
  34. }
  35. - (MASViewAttribute *)mas_top {
  36. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTop];
  37. }
  38. - (MASViewAttribute *)mas_right {
  39. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRight];
  40. }
  41. - (MASViewAttribute *)mas_bottom {
  42. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottom];
  43. }
  44. - (MASViewAttribute *)mas_leading {
  45. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeading];
  46. }
  47. - (MASViewAttribute *)mas_trailing {
  48. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailing];
  49. }
  50. - (MASViewAttribute *)mas_width {
  51. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeWidth];
  52. }
  53. - (MASViewAttribute *)mas_height {
  54. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeHeight];
  55. }
  56. - (MASViewAttribute *)mas_centerX {
  57. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterX];
  58. }
  59. - (MASViewAttribute *)mas_centerY {
  60. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterY];
  61. }
  62. - (MASViewAttribute *)mas_baseline {
  63. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBaseline];
  64. }
  65. - (MASViewAttribute *(^)(NSLayoutAttribute))mas_attribute
  66. {
  67. return ^(NSLayoutAttribute attr) {
  68. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:attr];
  69. };
  70. }
  71. - (MASViewAttribute *)mas_firstBaseline {
  72. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeFirstBaseline];
  73. }
  74. - (MASViewAttribute *)mas_lastBaseline {
  75. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLastBaseline];
  76. }
  77. #if TARGET_OS_IPHONE || TARGET_OS_TV
  78. - (MASViewAttribute *)mas_leftMargin {
  79. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeftMargin];
  80. }
  81. - (MASViewAttribute *)mas_rightMargin {
  82. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRightMargin];
  83. }
  84. - (MASViewAttribute *)mas_topMargin {
  85. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTopMargin];
  86. }
  87. - (MASViewAttribute *)mas_bottomMargin {
  88. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottomMargin];
  89. }
  90. - (MASViewAttribute *)mas_leadingMargin {
  91. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeadingMargin];
  92. }
  93. - (MASViewAttribute *)mas_trailingMargin {
  94. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailingMargin];
  95. }
  96. - (MASViewAttribute *)mas_centerXWithinMargins {
  97. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterXWithinMargins];
  98. }
  99. - (MASViewAttribute *)mas_centerYWithinMargins {
  100. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterYWithinMargins];
  101. }
  102. - (MASViewAttribute *)mas_safeAreaLayoutGuide {
  103. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeNotAnAttribute];
  104. }
  105. - (MASViewAttribute *)mas_safeAreaLayoutGuideLeading {
  106. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeLeading];
  107. }
  108. - (MASViewAttribute *)mas_safeAreaLayoutGuideTrailing {
  109. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeTrailing];
  110. }
  111. - (MASViewAttribute *)mas_safeAreaLayoutGuideLeft {
  112. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeLeft];
  113. }
  114. - (MASViewAttribute *)mas_safeAreaLayoutGuideRight {
  115. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeRight];
  116. }
  117. - (MASViewAttribute *)mas_safeAreaLayoutGuideTop {
  118. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeTop];
  119. }
  120. - (MASViewAttribute *)mas_safeAreaLayoutGuideBottom {
  121. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
  122. }
  123. - (MASViewAttribute *)mas_safeAreaLayoutGuideWidth {
  124. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeWidth];
  125. }
  126. - (MASViewAttribute *)mas_safeAreaLayoutGuideHeight {
  127. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeHeight];
  128. }
  129. - (MASViewAttribute *)mas_safeAreaLayoutGuideCenterX {
  130. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeCenterX];
  131. }
  132. - (MASViewAttribute *)mas_safeAreaLayoutGuideCenterY {
  133. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeCenterY];
  134. }
  135. #endif
  136. #pragma mark - associated properties
  137. - (id)mas_key {
  138. return objc_getAssociatedObject(self, @selector(mas_key));
  139. }
  140. - (void)setMas_key:(id)key {
  141. objc_setAssociatedObject(self, @selector(mas_key), key, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  142. }
  143. #pragma mark - heirachy
  144. - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view {
  145. MAS_VIEW *closestCommonSuperview = nil;
  146. MAS_VIEW *secondViewSuperview = view;
  147. while (!closestCommonSuperview && secondViewSuperview) {
  148. MAS_VIEW *firstViewSuperview = self;
  149. while (!closestCommonSuperview && firstViewSuperview) {
  150. if (secondViewSuperview == firstViewSuperview) {
  151. closestCommonSuperview = secondViewSuperview;
  152. }
  153. firstViewSuperview = firstViewSuperview.superview;
  154. }
  155. secondViewSuperview = secondViewSuperview.superview;
  156. }
  157. return closestCommonSuperview;
  158. }
  159. @end